Bitcoin Core
31.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
src
test
fuzz
addition_overflow.cpp
Go to the documentation of this file.
1
// Copyright (c) 2020-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <
test/fuzz/FuzzedDataProvider.h
>
6
#include <
test/fuzz/fuzz.h
>
7
#include <
test/fuzz/util.h
>
8
#include <
util/overflow.h
>
9
10
#include <cstdint>
11
#include <string>
12
#include <vector>
13
14
namespace
{
15
template
<
typename
T>
16
void
TestAdditionOverflow
(
FuzzedDataProvider
&
fuzzed_data_provider
)
17
{
18
const
T
i =
fuzzed_data_provider
.
ConsumeIntegral
<
T
>();
19
const
T
j
=
fuzzed_data_provider
.
ConsumeIntegral
<
T
>();
20
const
bool
is_addition_overflow_custom
=
AdditionOverflow
(i,
j
);
21
const
auto
maybe_add
{
CheckedAdd
(i,
j
)};
22
const
auto
sat_add
{
SaturatingAdd
(i,
j
)};
23
assert
(
is_addition_overflow_custom
== !
maybe_add
.has_value());
24
assert
(
is_addition_overflow_custom
==
AdditionOverflow
(
j
, i));
25
assert
(
maybe_add
==
CheckedAdd
(
j
, i));
26
assert
(
sat_add
==
SaturatingAdd
(
j
, i));
27
#ifndef _MSC_VER
28
T
result_builtin
;
29
const
bool
is_addition_overflow_builtin
=
__builtin_add_overflow
(i,
j
, &
result_builtin
);
30
assert
(
is_addition_overflow_custom
==
is_addition_overflow_builtin
);
31
if
(!
is_addition_overflow_custom
) {
32
assert
(i +
j
==
result_builtin
);
33
}
34
#endif
35
if
(
is_addition_overflow_custom
) {
36
assert
(
sat_add
== std::numeric_limits<T>::min() ||
sat_add
== std::numeric_limits<T>::max());
37
}
else
{
38
const
auto
add{i +
j
};
39
assert
(add ==
maybe_add
.value());
40
assert
(add ==
sat_add
);
41
}
42
}
43
}
// namespace
44
45
FUZZ_TARGET
(
addition_overflow
)
46
{
47
FuzzedDataProvider
fuzzed_data_provider
(buffer.data(), buffer.size());
48
TestAdditionOverflow<int64_t>
(
fuzzed_data_provider
);
49
TestAdditionOverflow<uint64_t>
(
fuzzed_data_provider
);
50
TestAdditionOverflow<int32_t>
(
fuzzed_data_provider
);
51
TestAdditionOverflow<uint32_t>
(
fuzzed_data_provider
);
52
TestAdditionOverflow<int16_t>
(
fuzzed_data_provider
);
53
TestAdditionOverflow<uint16_t>
(
fuzzed_data_provider
);
54
TestAdditionOverflow<char>
(
fuzzed_data_provider
);
55
TestAdditionOverflow<unsigned char>
(
fuzzed_data_provider
);
56
TestAdditionOverflow<signed char>
(
fuzzed_data_provider
);
57
}
FuzzedDataProvider.h
FuzzedDataProvider
Definition
FuzzedDataProvider.h:32
FuzzedDataProvider::ConsumeIntegral
T ConsumeIntegral()
Definition
FuzzedDataProvider.h:195
fuzz.h
FUZZ_TARGET
#define FUZZ_TARGET(...)
Definition
fuzz.h:35
T
#define T(expected, seed, data)
overflow.h
CheckedAdd
std::optional< T > CheckedAdd(const T i, const T j) noexcept
Definition
overflow.h:26
AdditionOverflow
bool AdditionOverflow(const T i, const T j) noexcept
Definition
overflow.h:15
SaturatingAdd
T SaturatingAdd(const T i, const T j) noexcept
Definition
overflow.h:43
util.h
Ticks
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition
time.h:73
assert
assert(!tx.IsCoinBase())
fuzzed_data_provider
FuzzedDataProvider & fuzzed_data_provider
Definition
fees.cpp:38
Generated on Thu Apr 16 2026 09:42:38 for Bitcoin Core by
1.10.0