Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
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
assert
assert(!tx.IsCoinBase())
Generated on
for Bitcoin Core by
1.17.0