Bitcoin Core 31.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
integer.cpp
Go to the documentation of this file.
1// Copyright (c) 2019-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 <arith_uint256.h>
6#include <common/args.h>
7#include <common/system.h>
8#include <compressor.h>
9#include <consensus/amount.h>
10#include <consensus/merkle.h>
11#include <core_io.h>
12#include <crypto/common.h>
13#include <crypto/siphash.h>
14#include <key_io.h>
15#include <memusage.h>
16#include <netbase.h>
17#include <policy/policy.h>
18#include <policy/settings.h>
19#include <pow.h>
20#include <protocol.h>
21#include <pubkey.h>
22#include <script/script.h>
23#include <serialize.h>
24#include <streams.h>
26#include <test/fuzz/fuzz.h>
27#include <test/fuzz/util.h>
28#include <uint256.h>
29#include <univalue.h>
30#include <util/chaintype.h>
31#include <util/check.h>
32#include <util/moneystr.h>
33#include <util/overflow.h>
34#include <util/strencodings.h>
35#include <util/string.h>
36
37#include <cassert>
38#include <chrono>
39#include <limits>
40#include <set>
41#include <vector>
42
43using util::ToString;
44
49
51{
52 if (buffer.size() < sizeof(uint256) + sizeof(uint160)) {
53 return;
54 }
55 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
56 const uint256 u256(fuzzed_data_provider.ConsumeBytes<unsigned char>(sizeof(uint256)));
57 const uint160 u160(fuzzed_data_provider.ConsumeBytes<unsigned char>(sizeof(uint160)));
66 // We cannot assume a specific value of std::is_signed_v<char>:
67 // ConsumeIntegral<char>() instead of casting from {u,}int8_t.
68 const char ch = fuzzed_data_provider.ConsumeIntegral<char>();
69 const bool b = fuzzed_data_provider.ConsumeBool();
70
73 if (u64 <= MAX_MONEY) {
78 } else {
80 }
81 constexpr uint256 u256_min{"0000000000000000000000000000000000000000000000000000000000000000"};
82 constexpr uint256 u256_max{"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"};
83 std::vector v256{u256, u256_min, u256_max};
84 (void)ComputeMerkleRoot(std::move(v256));
86 {
87 if (std::optional<CAmount> parsed = ParseMoney(FormatMoney(i64))) {
88 assert(parsed.value() == i64);
89 }
90 }
93 if (!MultiplicationOverflow(i64, static_cast<int64_t>(u32)) && !AdditionOverflow(i64, static_cast<int64_t>(4)) && !AdditionOverflow(i64 * u32, static_cast<int64_t>(4))) {
95 }
98 (void)ToString(i64);
99 (void)IsDigit(ch);
100 (void)IsSpace(ch);
111 const unsigned char uch = static_cast<unsigned char>(u8);
113 {
114 const std::set<int64_t> i64s{i64, static_cast<int64_t>(u64)};
118 }
123 (void)ToLower(ch);
124 (void)ToUpper(ch);
125 {
126 if (std::optional<CAmount> parsed = ParseMoney(ValueFromAmount(i64).getValStr())) {
127 assert(parsed.value() == i64);
128 }
129 }
130 if (i32 >= 0 && i32 <= 16) {
132 }
133
134 const std::chrono::seconds seconds{i64};
136
139 (void)script_num.getvch();
140
143 assert(uint256::FromHex(au256.GetHex()).value() == u256);
144 (void)au256.bits();
145 (void)au256.GetCompact(/* fNegative= */ false);
146 (void)au256.GetCompact(/* fNegative= */ true);
147 (void)au256.getdouble();
148 (void)au256.GetHex();
149 (void)au256.GetLow64();
150 (void)au256.size();
151 (void)au256.ToString();
152
153 const CKeyID key_id{u160};
154 const CScriptID script_id{u160};
155
156 {
158
160 stream << u256;
162 assert(u256 == deserialized_u256 && stream.empty());
163
165 stream << u160;
167 assert(u160 == deserialized_u160 && stream.empty());
168
170 stream << u64;
172 assert(u64 == deserialized_u64 && stream.empty());
173
175 stream << i64;
177 assert(i64 == deserialized_i64 && stream.empty());
178
180 stream << u32;
182 assert(u32 == deserialized_u32 && stream.empty());
183
185 stream << i32;
187 assert(i32 == deserialized_i32 && stream.empty());
188
190 stream << u16;
192 assert(u16 == deserialized_u16 && stream.empty());
193
195 stream << i16;
197 assert(i16 == deserialized_i16 && stream.empty());
198
200 stream << u8;
202 assert(u8 == deserialized_u8 && stream.empty());
203
205 stream << i8;
207 assert(i8 == deserialized_i8 && stream.empty());
208
209 bool deserialized_b;
210 stream << b;
212 assert(b == deserialized_b && stream.empty());
213 }
214
215 {
218 }
219
220 {
222
225 assert(u64 == deserialized_u64 && stream.empty());
226
229 assert(u32 == deserialized_u32 && stream.empty());
230
233 assert(u32 == deserialized_u32be && stream.empty());
234
237 assert(u16 == deserialized_u16 && stream.empty());
238
241 assert(u8 == deserialized_u8 && stream.empty());
242 }
243
244 {
246
248 try {
250 assert(u64 == deserialized_u64 && stream.empty());
251 } catch (const std::ios_base::failure&) {
252 }
253 }
254}
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
Definition amount.h:26
bool MoneyRange(const CAmount &nValue)
Definition amount.h:27
bool IsSwitchChar(char c)
Definition args.h:44
arith_uint256 UintToArith256(const uint256 &a)
uint256 ArithToUint256(const arith_uint256 &a)
void SelectParams(const ChainType chain)
Sets the params returned by Params() to those for the given chain type.
const CChainParams & Params()
Return the currently selected parameters.
const Consensus::Params & GetConsensus() const
Definition chainparams.h:89
A reference to a CKey: the Hash160 of its serialized public key.
Definition pubkey.h:24
static int DecodeOP_N(opcodetype opcode)
Encode/decode small integers:
Definition script.h:507
static opcodetype EncodeOP_N(int n)
Definition script.h:514
A reference to a CScript: the Hash160 of its serialization.
Definition script.h:594
int getint() const
Definition script.h:325
Double ended buffer combining vector and stream-like interfaces.
Definition streams.h:133
std::vector< T > ConsumeBytes(size_t num_bytes)
Optimized SipHash-2-4 implementation for uint256.
Definition siphash.h:56
const std::string & getValStr() const
Definition univalue.h:68
256-bit unsigned big integer.
160-bit opaque blob.
Definition uint256.h:183
256-bit opaque blob.
Definition uint256.h:195
static std::optional< uint256 > FromHex(std::string_view str)
Definition uint256.h:197
uint64_t DecompressAmount(uint64_t x)
uint64_t CompressAmount(uint64_t n)
Compress amount.
unsigned int GetSpecialScriptSize(unsigned int nSize)
uint256 ComputeMerkleRoot(std::vector< uint256 > hashes, bool *mutated)
Definition merkle.cpp:46
std::string SighashToStr(unsigned char sighash_type)
Definition core_io.cpp:343
UniValue ValueFromAmount(const CAmount amount)
Definition core_io.cpp:285
unsigned int u32
unsigned char u8
#define FUZZ_TARGET(...)
Definition fuzz.h:35
signed char HexDigit(char c)
Definition hex_base.cpp:64
void initialize_integer()
Definition integer.cpp:45
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
Definition moneystr.cpp:45
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
Definition moneystr.cpp:19
static size_t DynamicUsage(const int8_t &v)
Dynamic memory usage for built-in types is zero.
Definition memusage.h:31
static size_t IncrementalDynamicUsage(const std::set< X, Y > &s)
Definition memusage.h:119
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition string.h:246
bool AdditionOverflow(const T i, const T j) noexcept
Definition overflow.h:15
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost, unsigned int bytes_per_sigop)
Compute the virtual transaction size (weight reinterpreted as bytes).
Definition policy.cpp:381
bool CheckProofOfWorkImpl(uint256 hash, unsigned int nBits, const Consensus::Params &params)
Definition pow.cpp:161
ServiceFlags
nServices flags
Definition protocol.h:309
static bool MayHaveUsefulAddressDB(ServiceFlags services)
Checks if a peer with the given service flags may be capable of having a robust address-storage DB.
Definition protocol.h:360
constexpr unsigned int GetSizeOfCompactSize(uint64_t nSize)
Compact Size size < 253 – 1 byte size <= USHRT_MAX – 3 bytes (253 + 2 bytes) size <= UINT_MAX – 5 byt...
Definition serialize.h:288
uint8_t ser_readdata8(Stream &s)
Definition serialize.h:78
void ser_writedata32be(Stream &s, uint32_t obj)
Definition serialize.h:68
void ser_writedata32(Stream &s, uint32_t obj)
Definition serialize.h:63
void ser_writedata16(Stream &s, uint16_t obj)
Definition serialize.h:58
void WriteCompactSize(SizeComputer &os, uint64_t nSize)
Definition serialize.h:1089
uint16_t ser_readdata16(Stream &s)
Definition serialize.h:84
uint64_t ser_readdata64(Stream &s)
Definition serialize.h:102
void ser_writedata8(Stream &s, uint8_t obj)
Definition serialize.h:54
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
Definition serialize.h:330
uint32_t ser_readdata32(Stream &s)
Definition serialize.h:90
void ser_writedata64(Stream &s, uint64_t obj)
Definition serialize.h:73
uint32_t ser_readdata32be(Stream &s)
Definition serialize.h:96
constexpr bool IsDigit(char c)
Tests if the given character is a decimal digit.
constexpr bool IsSpace(char c) noexcept
Tests if the given character is a whitespace character.
Parameters that influence chain consensus.
Definition params.h:84
bool MultiplicationOverflow(const T i, const T j) noexcept
Definition util.h:204
std::string ToUpper(std::string_view str)
Returns the uppercase equivalent of the given string.
std::string ToLower(std::string_view str)
Returns the lowercase equivalent of the given string.
struct timeval MillisToTimeval(int64_t nTimeout)
Convert milliseconds to a struct timeval for e.g.
Definition time.cpp:142
constexpr int64_t count_seconds(std::chrono::seconds t)
Definition time.h:88
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:73
assert(!tx.IsCoinBase())
FuzzedDataProvider & fuzzed_data_provider
Definition fees.cpp:38