Merge bitcoin/bitcoin#25311: refactor: remove CBlockIndex copy construction
36c201feb7remove CBlockIndex copy construction (James O'Beirne) Pull request description: Copy construction of CBlockIndex objects is a footgun because of the wide use of equality-by-pointer comparison in the code base. There are also potential lifetime confusions of using copied instances, since there are recursive pointer members (e.g. pprev). (See also https://github.com/bitcoin/bitcoin/pull/24008#discussion_r891949166) We can't just delete the copy constructors because they are used for derived classes (CDiskBlockIndex), so we mark them protected. ACKs for top commit: ajtowns: ACK36c201feb7- code review only MarcoFalke: re-ACK36c201feb7🏻 Tree-SHA512: b1cf9a1cb992464a4377dad609713eea63cc099435df374e4553bfe62d362a4eb5e3c6c6649177832f38c0905b23841caf9d62196cef8e3084bfea0bfc26374b
This commit is contained in:
3 files changed
+31
-17
No files matched your search
@@ -26,7 +26,7 @@ FUZZ_TARGET_INIT(pow, initialize_pow)
|
||||
{
|
||||
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
||||
const Consensus::Params& consensus_params = Params().GetConsensus();
|
||||
std::vector<CBlockIndex> blocks;
|
||||
std::vector<std::unique_ptr<CBlockIndex>> blocks;
|
||||
const uint32_t fixed_time = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
|
||||
const uint32_t fixed_bits = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
|
||||
LIMITED_WHILE(fuzzed_data_provider.remaining_bytes() > 0, 10000) {
|
||||
@@ -34,9 +34,10 @@ FUZZ_TARGET_INIT(pow, initialize_pow)
|
||||
if (!block_header) {
|
||||
continue;
|
||||
}
|
||||
CBlockIndex current_block{*block_header};
|
||||
CBlockIndex& current_block{
|
||||
*blocks.emplace_back(std::make_unique<CBlockIndex>(*block_header))};
|
||||
{
|
||||
CBlockIndex* previous_block = blocks.empty() ? nullptr : &PickValue(fuzzed_data_provider, blocks);
|
||||
CBlockIndex* previous_block = blocks.empty() ? nullptr : PickValue(fuzzed_data_provider, blocks).get();
|
||||
const int current_height = (previous_block != nullptr && previous_block->nHeight != std::numeric_limits<int>::max()) ? previous_block->nHeight + 1 : 0;
|
||||
if (fuzzed_data_provider.ConsumeBool()) {
|
||||
current_block.pprev = previous_block;
|
||||
@@ -58,7 +59,6 @@ FUZZ_TARGET_INIT(pow, initialize_pow)
|
||||
} else {
|
||||
current_block.nChainWork = ConsumeArithUInt256(fuzzed_data_provider);
|
||||
}
|
||||
blocks.push_back(current_block);
|
||||
}
|
||||
{
|
||||
(void)GetBlockProof(current_block);
|
||||
@@ -68,9 +68,9 @@ FUZZ_TARGET_INIT(pow, initialize_pow)
|
||||
}
|
||||
}
|
||||
{
|
||||
const CBlockIndex* to = &PickValue(fuzzed_data_provider, blocks);
|
||||
const CBlockIndex* from = &PickValue(fuzzed_data_provider, blocks);
|
||||
const CBlockIndex* tip = &PickValue(fuzzed_data_provider, blocks);
|
||||
const auto& to = PickValue(fuzzed_data_provider, blocks);
|
||||
const auto& from = PickValue(fuzzed_data_provider, blocks);
|
||||
const auto& tip = PickValue(fuzzed_data_provider, blocks);
|
||||
try {
|
||||
(void)GetBlockProofEquivalentTime(*to, *from, *tip, consensus_params);
|
||||
} catch (const uint_error&) {
|
||||
|
||||
Reference in new issue
Block a user