MCPcopy Create free account
hub / github.com/ElementsProject/elements / TestAdditionOverflow

Function TestAdditionOverflow

src/test/fuzz/addition_overflow.cpp:24–50  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

22namespace {
23template <typename T>
24void TestAdditionOverflow(FuzzedDataProvider& fuzzed_data_provider)
25{
26 const T i = fuzzed_data_provider.ConsumeIntegral<T>();
27 const T j = fuzzed_data_provider.ConsumeIntegral<T>();
28 const bool is_addition_overflow_custom = AdditionOverflow(i, j);
29 const auto maybe_add{CheckedAdd(i, j)};
30 const auto sat_add{SaturatingAdd(i, j)};
31 assert(is_addition_overflow_custom == !maybe_add.has_value());
32 assert(is_addition_overflow_custom == AdditionOverflow(j, i));
33 assert(maybe_add == CheckedAdd(j, i));
34 assert(sat_add == SaturatingAdd(j, i));
35#if defined(HAVE_BUILTIN_ADD_OVERFLOW)
36 T result_builtin;
37 const bool is_addition_overflow_builtin = __builtin_add_overflow(i, j, &result_builtin);
38 assert(is_addition_overflow_custom == is_addition_overflow_builtin);
39 if (!is_addition_overflow_custom) {
40 assert(i + j == result_builtin);
41 }
42#endif
43 if (is_addition_overflow_custom) {
44 assert(sat_add == std::numeric_limits<T>::min() || sat_add == std::numeric_limits<T>::max());
45 } else {
46 const auto add{i + j};
47 assert(add == maybe_add.value());
48 assert(add == sat_add);
49 }
50}
51} // namespace
52
53FUZZ_TARGET(addition_overflow)

Callers

nothing calls this directly

Calls 4

AdditionOverflowFunction · 0.85
CheckedAddFunction · 0.85
SaturatingAddFunction · 0.85
valueMethod · 0.45

Tested by

no test coverage detected