mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-18 08:32:30 +01:00
fuzz: make FuzzedDataProvider usage deterministic
There exist many usages of `fuzzed_data_provider` where it is evaluated directly in the function call. Unfortunately, the order of evaluation of function arguments is unspecified. This means it can differ between compilers/version/optimization levels etc. But when the evaluation order changes, the same fuzzing input will produce different output, which is bad for coverage/reproducibility. This PR fixes all these cases where by moving multiple calls to `fuzzed_data_provider` out of the function arguments.
This commit is contained in:
@@ -111,7 +111,10 @@ FUZZ_TARGET(script_sign, .init = initialize_script_sign)
|
||||
}
|
||||
if (n_in < script_tx_to.vin.size()) {
|
||||
SignatureData empty;
|
||||
(void)SignSignature(provider, ConsumeScript(fuzzed_data_provider), script_tx_to, n_in, ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int>(), empty);
|
||||
auto from_pub_key = ConsumeScript(fuzzed_data_provider);
|
||||
auto amount = ConsumeMoney(fuzzed_data_provider);
|
||||
auto n_hash_type = fuzzed_data_provider.ConsumeIntegral<int>();
|
||||
(void)SignSignature(provider, from_pub_key, script_tx_to, n_in, amount, n_hash_type, empty);
|
||||
MutableTransactionSignatureCreator signature_creator{tx_to, n_in, ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<int>()};
|
||||
std::vector<unsigned char> vch_sig;
|
||||
CKeyID address;
|
||||
@@ -122,7 +125,9 @@ FUZZ_TARGET(script_sign, .init = initialize_script_sign)
|
||||
} else {
|
||||
address = CKeyID{ConsumeUInt160(fuzzed_data_provider)};
|
||||
}
|
||||
(void)signature_creator.CreateSig(provider, vch_sig, address, ConsumeScript(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}));
|
||||
auto script_code = ConsumeScript(fuzzed_data_provider);
|
||||
auto sigversion = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0});
|
||||
(void)signature_creator.CreateSig(provider, vch_sig, address, script_code, sigversion);
|
||||
}
|
||||
std::map<COutPoint, Coin> coins{ConsumeCoins(fuzzed_data_provider)};
|
||||
std::map<int, bilingual_str> input_errors;
|
||||
|
||||
Reference in New Issue
Block a user