Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2015-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <prevector.h>6#include <serialize.h>7#include <streams.h>8#include <test/fuzz/FuzzedDataProvider.h>9#include <test/fuzz/fuzz.h>11#include <ranges>12#include <vector>13namespace {15template <unsigned int N, typename T>16class prevector_tester17{18typedef std::vector<T> realtype;19realtype real_vector;20realtype real_vector_alt;22typedef prevector<N, T> pretype;23pretype pre_vector;24pretype pre_vector_alt;26typedef typename pretype::size_type Size;28public:29void test() const30{31const pretype& const_pre_vector = pre_vector;32assert(real_vector.size() == pre_vector.size());33assert(real_vector.empty() == pre_vector.empty());34for (Size s = 0; s < real_vector.size(); s++) {35assert(real_vector[s] == pre_vector[s]);36assert(&(pre_vector[s]) == &(pre_vector.begin()[s]));37assert(&(pre_vector[s]) == &*(pre_vector.begin() + s));38assert(&(pre_vector[s]) == &*((pre_vector.end() + s) - real_vector.size()));39}40// assert(realtype(pre_vector) == real_vector);41assert(pretype(real_vector.begin(), real_vector.end()) == pre_vector);42assert(pretype(pre_vector.begin(), pre_vector.end()) == pre_vector);43size_t pos = 0;44for (const T& v : pre_vector) {45assert(v == real_vector[pos]);46++pos;47}48for (const T& v : pre_vector | std::views::reverse) {49--pos;50assert(v == real_vector[pos]);51}52for (const T& v : const_pre_vector) {53assert(v == real_vector[pos]);54++pos;55}56for (const T& v : const_pre_vector | std::views::reverse) {57--pos;58assert(v == real_vector[pos]);59}60DataStream ss1{};61DataStream ss2{};62ss1 << real_vector;63ss2 << pre_vector;64assert(ss1.size() == ss2.size());65for (Size s = 0; s < ss1.size(); s++) {66assert(ss1[s] == ss2[s]);67}68}70void resize(Size s)71{72real_vector.resize(s);73assert(real_vector.size() == s);74pre_vector.resize(s);75assert(pre_vector.size() == s);76}78void reserve(Size s)79{80real_vector.reserve(s);81assert(real_vector.capacity() >= s);82pre_vector.reserve(s);83assert(pre_vector.capacity() >= s);84}86void insert(Size position, const T& value)87{88real_vector.insert(real_vector.begin() + position, value);89pre_vector.insert(pre_vector.begin() + position, value);90}92void insert(Size position, Size count, const T& value)93{94real_vector.insert(real_vector.begin() + position, count, value);95pre_vector.insert(pre_vector.begin() + position, count, value);96}98template <typename I>99void insert_range(Size position, I first, I last)100{101real_vector.insert(real_vector.begin() + position, first, last);102pre_vector.insert(pre_vector.begin() + position, first, last);103}105void erase(Size position)106{107real_vector.erase(real_vector.begin() + position);108pre_vector.erase(pre_vector.begin() + position);109}111void erase(Size first, Size last)112{113real_vector.erase(real_vector.begin() + first, real_vector.begin() + last);114pre_vector.erase(pre_vector.begin() + first, pre_vector.begin() + last);115}117void update(Size pos, const T& value)118{119real_vector[pos] = value;120pre_vector[pos] = value;121}123void push_back(const T& value)124{125real_vector.push_back(value);126pre_vector.push_back(value);127}129void pop_back()130{131real_vector.pop_back();132pre_vector.pop_back();133}135void clear()136{137real_vector.clear();138pre_vector.clear();139}141void assign(Size n, const T& value)142{143real_vector.assign(n, value);144pre_vector.assign(n, value);145}147Size size() const148{149return real_vector.size();150}152Size capacity() const153{154return pre_vector.capacity();155}157void shrink_to_fit()158{159pre_vector.shrink_to_fit();160}162void swap() noexcept163{164real_vector.swap(real_vector_alt);165pre_vector.swap(pre_vector_alt);166}168void move()169{170real_vector = std::move(real_vector_alt);171real_vector_alt.clear();172pre_vector = std::move(pre_vector_alt);173pre_vector_alt.clear();174}176void copy()177{178real_vector = real_vector_alt;179pre_vector = pre_vector_alt;180}182void resize_uninitialized(realtype values)183{184size_t r = values.size();185size_t s = real_vector.size() / 2;186if (real_vector.capacity() < s + r) {187real_vector.reserve(s + r);188}189real_vector.resize(s);190pre_vector.resize_uninitialized(s);191for (auto v : values) {192real_vector.push_back(v);193}194auto p = pre_vector.size();195pre_vector.resize_uninitialized(p + r);196for (auto v : values) {197pre_vector[p] = v;198++p;199}200}201};203} // namespace205FUZZ_TARGET(prevector)206{207FuzzedDataProvider prov(buffer.data(), buffer.size());208prevector_tester<8, int> test;210LIMITED_WHILE (prov.remaining_bytes(), 3000) {211switch (prov.ConsumeIntegralInRange<int>(0, 13 + 3 * (test.size() > 0))) {212case 0: {213auto position = prov.ConsumeIntegralInRange<size_t>(0, test.size());214auto value = prov.ConsumeIntegral<int>();215test.insert(position, value);216} break;217case 1:218test.resize(std::max(0, std::min(30, (int)test.size() + prov.ConsumeIntegralInRange<int>(0, 4) - 2)));219break;220case 2: {221auto position = prov.ConsumeIntegralInRange<size_t>(0, test.size());222auto count = 1 + prov.ConsumeBool();223auto value = prov.ConsumeIntegral<int>();224test.insert(position, count, value);225} break;226case 3: {227int del = prov.ConsumeIntegralInRange<int>(0, test.size());228int beg = prov.ConsumeIntegralInRange<int>(0, test.size() - del);229test.erase(beg, beg + del);230break;231}232case 4:233test.push_back(prov.ConsumeIntegral<int>());234break;235case 5: {236int values[4];237int num = 1 + prov.ConsumeIntegralInRange<int>(0, 3);238for (int k = 0; k < num; ++k) {239values[k] = prov.ConsumeIntegral<int>();240}241test.insert_range(prov.ConsumeIntegralInRange<size_t>(0, test.size()), values, values + num);242break;243}244case 6: {245int num = 1 + prov.ConsumeIntegralInRange<int>(0, 15);246std::vector<int> values(num);247for (auto& v : values) {248v = prov.ConsumeIntegral<int>();249}250test.resize_uninitialized(values);
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.