Skip to content

log: Use ConstevalFormatString

This changes all logging (including the wallet logging) to produce a ConstevalFormatString at compile time, so that the format string can be validated at compile-time.

I tested with clang and found that the compiler will use less than 1% more of time and memory.

When an error is found, the compile-time error depends on the compiler, but it may look similar to:

src/util/string.h: In function ‘int main(int, char**)’:
src/bitcoind.cpp:265:5:   in ‘constexpr’ expansion of ‘util::ConstevalFormatString<1>(((const char*)"Hi %s %s"))’
src/util/string.h:38:98:   in ‘constexpr’ expansion of ‘util::ConstevalFormatString<1>::Detail_CheckNumFormatSpecifiers(std::basic_string_view<char>(((const char*)((util::ConstevalFormatString<1>*)this)->util::ConstevalFormatString<1>::fmt)))’
src/util/string.h:78:34: error: expression ‘<throw-expression>’ is not a constant expression
   78 |         if (num_params != count) throw "Format specifier count must match the argument count!";
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This refactor does not change behavior of the compiled executables.

Merge request reports

Loading