mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-18 22:35:39 +01:00
refactor: Check translatable format strings at compile-time
This commit is contained in:
@@ -18,7 +18,6 @@ FUZZ_TARGET(str_printf)
|
||||
{
|
||||
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
||||
const std::string format_string = fuzzed_data_provider.ConsumeRandomLengthString(64);
|
||||
const bilingual_str bilingual_string{format_string, format_string};
|
||||
|
||||
const int digits_in_format_specifier = std::count_if(format_string.begin(), format_string.end(), IsDigit);
|
||||
|
||||
@@ -53,27 +52,21 @@ FUZZ_TARGET(str_printf)
|
||||
fuzzed_data_provider,
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeRandomLengthString(32));
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeRandomLengthString(32));
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeRandomLengthString(32).c_str());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeRandomLengthString(32).c_str());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<signed char>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<signed char>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<unsigned char>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<unsigned char>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<char>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<char>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeBool());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeBool());
|
||||
});
|
||||
} catch (const tinyformat::format_error&) {
|
||||
}
|
||||
@@ -99,35 +92,27 @@ FUZZ_TARGET(str_printf)
|
||||
fuzzed_data_provider,
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeFloatingPoint<float>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeFloatingPoint<float>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeFloatingPoint<double>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeFloatingPoint<double>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int16_t>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int16_t>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint16_t>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint16_t>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int32_t>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int32_t>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint32_t>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<int64_t>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<int64_t>());
|
||||
},
|
||||
[&] {
|
||||
(void)strprintf(format_string, fuzzed_data_provider.ConsumeIntegral<uint64_t>());
|
||||
(void)tinyformat::format(bilingual_string, fuzzed_data_provider.ConsumeIntegral<uint64_t>());
|
||||
});
|
||||
} catch (const tinyformat::format_error&) {
|
||||
}
|
||||
|
||||
@@ -9,13 +9,26 @@
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(translation_tests)
|
||||
|
||||
static TranslateFn translate{[](const char * str) { return strprintf("t(%s)", str); }};
|
||||
|
||||
// Custom translation function _t(), similar to _() but internal to this test.
|
||||
consteval auto _t(util::TranslatedLiteral str)
|
||||
{
|
||||
str.translate_fn = &translate;
|
||||
return str;
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(translation_namedparams)
|
||||
{
|
||||
bilingual_str arg{"original", "translated"};
|
||||
bilingual_str format{"original [%s]", "translated [%s]"};
|
||||
bilingual_str result{strprintf(format, arg)};
|
||||
bilingual_str result{strprintf(_t("original [%s]"), arg)};
|
||||
BOOST_CHECK_EQUAL(result.original, "original [original]");
|
||||
BOOST_CHECK_EQUAL(result.translated, "translated [translated]");
|
||||
BOOST_CHECK_EQUAL(result.translated, "t(original [translated])");
|
||||
|
||||
util::TranslatedLiteral arg2{"original", &translate};
|
||||
bilingual_str result2{strprintf(_t("original [%s]"), arg2)};
|
||||
BOOST_CHECK_EQUAL(result2.original, "original [original]");
|
||||
BOOST_CHECK_EQUAL(result2.translated, "t(original [t(original)])");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
Reference in New Issue
Block a user