build warnings in outputtype.cpp: may be used uninitialized #29359

issue starius openend this issue on February 1, 2024
  1. starius commented at 2:46 am on February 1, 2024: none

    Is there an existing issue for this?

    • I have searched the existing issues

    Current behaviour

    Building Bitcoin Core from source using official instructions from https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md I got compilation warnings, complaining about may be used uninitialized variables in two destructors.

    Log of make -j 10: bitcoin-compilation-warning-master.txt

    Expected behaviour

    I expect no compilation warnings to be produced.

    Steps to reproduce

    Checkout master branch of bitcoin repo on Debian stable machine, install dependencies and build.

     0$ g++ --version
     1g++ (Debian 12.2.0-14) 12.2.0
     2Copyright (C) 2022 Free Software Foundation, Inc.
     3This is free software; see the source for copying conditions.  There is NO
     4warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     5
     6sudo apt-get install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3
     7sudo apt-get install libevent-dev libboost-dev
     8sudo apt install libsqlite3-dev
     9
    10make -C depends NO_BOOST=1 NO_LIBEVENT=1 NO_QT=1 NO_SQLITE=1 NO_NATPMP=1 NO_UPNP=1 NO_ZMQ=1 NO_USDT=1
    11export BDB_PREFIX=/root/bitcoin/depends/aarch64-unknown-linux-gnu/
    12
    13./autogen.sh
    14./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include"
    15make -j 10
    

    Relevant log output

    No response

    How did you obtain Bitcoin Core

    Compiled from source

    What version of Bitcoin Core are you using?

    master@0b768746ef2c089676e3be30eb84e722a91453f6

    Operating system and version

    Debian GNU/Linux 12 (bookworm), Linux server 6.1.0-13-arm64 #1 SMP Debian 6.1.55-1 (2023-09-29) aarch64 GNU/Linux

    Machine specifications

    No response

  2. maflcko added the label Build system on Feb 1, 2024
  3. maflcko commented at 8:40 am on February 1, 2024: member
    I guess regardless of the g++ version used on Ubuntu or Debian, some kind of false positive warnings will be printed. I wonder why g++ on other distros does not print those warnings.
  4. fanquake commented at 4:35 pm on February 1, 2024: member

    I wonder why g++ on other distros does not print those warnings.

    I see the same if I use a similar GCC on a different distro, i.e Alpine 3.18 with GCC g++ (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924):

     0  CXX      libbitcoin_common_a-protocol.o
     1In file included from ./hash.h:13,
     2                 from ./pubkey.h:10,
     3                 from ./addresstype.h:9,
     4                 from ./outputtype.h:9,
     5                 from outputtype.cpp:6:
     6In member function 'bool prevector<N, T, Size, Diff>::is_direct() const [with unsigned int N = 28; T = unsigned char; Size = unsigned int; Diff = int]',
     7    inlined from 'prevector<N, T, Size, Diff>::~prevector() [with unsigned int N = 28; T = unsigned char; Size = unsigned int; Diff = int]' at ./prevector.h:474:23,
     8    inlined from 'CScript::~CScript()' at ./script/script.h:413:7,
     9    inlined from 'CNoDestination::~CNoDestination()' at ./addresstype.h:18:7,
    10    inlined from 'constexpr void std::destroy_at(_Tp*) [with _Tp = CNoDestination]' at /usr/include/c++/12.2.1/bits/stl_construct.h:88:18,
    11    inlined from 'constexpr void std::_Destroy(_Tp*) [with _Tp = CNoDestination]' at /usr/include/c++/12.2.1/bits/stl_construct.h:149:22,
    12    inlined from 'std::__detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)> mutable [with auto:19 = CNoDestination&]' at /usr/include/c++/12.2.1/variant:472:19,
    13    inlined from 'constexpr _Res std::__invoke_impl(__invoke_other, _Fn&&, _Args&& ...) [with _Res = void; _Fn = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Args = {CNoDestination&}]' at /usr/include/c++/12.2.1/bits/invoke.h:61:36,
    14    inlined from 'constexpr std::enable_if_t<is_invocable_r_v<_Res, _Callable, _Args ...>, _Res> std::__invoke_r(_Callable&&, _Args&& ...) [with _Res = void; _Callable = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Args = {CNoDestination&}]' at /usr/include/c++/12.2.1/bits/invoke.h:111:28,
    15    inlined from 'static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke(_Visitor&&, _Variants ...) [with _Result_type = void; _Visitor = std::__detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>&&; _Variants = {std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>&}; long unsigned int ...__indices = {0}]' at /usr/include/c++/12.2.1/variant:1035:40,
    16    inlined from 'constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type = void; _Visitor = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Variants = {variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>&}]' at /usr/include/c++/12.2.1/variant:1788:5,
    17    inlined from 'constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type = void; _Visitor = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Variants = {variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>&}]' at /usr/include/c++/12.2.1/variant:1729:5,
    18    inlined from 'constexpr void std::__detail::__variant::_Variant_storage<false, _Types ...>::_M_reset() [with _Types = {CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown}]' at /usr/include/c++/12.2.1/variant:470:23,
    19    inlined from 'constexpr std::__detail::__variant::_Variant_storage<false, _Types ...>::~_Variant_storage() [with _Types = {CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown}]' at /usr/include/c++/12.2.1/variant:480:17,
    20    inlined from 'constexpr std::__detail::__variant::_Copy_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Copy_ctor_base()' at /usr/include/c++/12.2.1/variant:554:12,
    21    inlined from 'constexpr std::__detail::__variant::_Move_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Move_ctor_base()' at /usr/include/c++/12.2.1/variant:591:12,
    22    inlined from 'constexpr std::__detail::__variant::_Copy_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Copy_assign_base()' at /usr/include/c++/12.2.1/variant:629:12,
    23    inlined from 'constexpr std::__detail::__variant::_Move_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Move_assign_base()' at /usr/include/c++/12.2.1/variant:681:12,
    24    inlined from 'constexpr std::__detail::__variant::_Variant_base<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Variant_base()' at /usr/include/c++/12.2.1/variant:735:12,
    25    inlined from 'constexpr std::variant<_Types>::~variant() [with _Types = {CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown}]' at /usr/include/c++/12.2.1/variant:1407:28,
    26    inlined from 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)' at outputtype.cpp:79:5:
    27./prevector.h:175:37: warning: '*(const prevector<28, unsigned char, unsigned int, int>*)((char*)&p2sh + offsetof(std::CTxDestination, std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Variant_base<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Move_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Copy_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Move_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Copy_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_u)).prevector<28, unsigned char>::_size' may be used uninitialized [-Wmaybe-uninitialized]
    28  175 |     bool is_direct() const { return _size <= N; }
    29      |                                     ^~~~~
    30outputtype.cpp: In function 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)':
    31outputtype.cpp:77:24: note: 'p2sh' declared here
    32   77 |         CTxDestination p2sh = ScriptHash(GetScriptForDestination(segwit));
    33      |                        ^~~~
    34In file included from /usr/include/c++/12.2.1/vector:64,
    35                 from ./serialize.h:25,
    36                 from ./hash.h:14:
    37In destructor 'constexpr std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>]',
    38    inlined from 'constexpr std::vector<_Tp, _Alloc>::~vector() [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>]' at /usr/include/c++/12.2.1/bits/stl_vector.h:733:7,
    39    inlined from 'constexpr WitnessUnknown::~WitnessUnknown()' at ./addresstype.h:94:8,
    40    inlined from 'constexpr void std::destroy_at(_Tp*) [with _Tp = WitnessUnknown]' at /usr/include/c++/12.2.1/bits/stl_construct.h:88:18,
    41    inlined from 'constexpr void std::_Destroy(_Tp*) [with _Tp = WitnessUnknown]' at /usr/include/c++/12.2.1/bits/stl_construct.h:149:22,
    42    inlined from 'std::__detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)> mutable [with auto:19 = WitnessUnknown&]' at /usr/include/c++/12.2.1/variant:472:19,
    43    inlined from 'constexpr _Res std::__invoke_impl(__invoke_other, _Fn&&, _Args&& ...) [with _Res = void; _Fn = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Args = {WitnessUnknown&}]' at /usr/include/c++/12.2.1/bits/invoke.h:61:36,
    44    inlined from 'constexpr std::enable_if_t<is_invocable_r_v<_Res, _Callable, _Args ...>, _Res> std::__invoke_r(_Callable&&, _Args&& ...) [with _Res = void; _Callable = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Args = {WitnessUnknown&}]' at /usr/include/c++/12.2.1/bits/invoke.h:111:28,
    45    inlined from 'static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke(_Visitor&&, _Variants ...) [with _Result_type = void; _Visitor = std::__detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>&&; _Variants = {std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>&}; long unsigned int ...__indices = {7}]' at /usr/include/c++/12.2.1/variant:1035:40,
    46    inlined from 'constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type = void; _Visitor = __detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_reset()::<lambda(auto:19&&)>; _Variants = {variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>&}]' at /usr/include/c++/12.2.1/variant:1795:5,
    47    inlined from 'constexpr void std::__detail::__variant::_Variant_storage<false, _Types ...>::_M_reset() [with _Types = {CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown}]' at /usr/include/c++/12.2.1/variant:470:23,
    48    inlined from 'constexpr std::__detail::__variant::_Variant_storage<false, _Types ...>::~_Variant_storage() [with _Types = {CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown}]' at /usr/include/c++/12.2.1/variant:480:17,
    49    inlined from 'constexpr std::__detail::__variant::_Copy_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Copy_ctor_base()' at /usr/include/c++/12.2.1/variant:554:12,
    50    inlined from 'constexpr std::__detail::__variant::_Move_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Move_ctor_base()' at /usr/include/c++/12.2.1/variant:591:12,
    51    inlined from 'constexpr std::__detail::__variant::_Copy_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Copy_assign_base()' at /usr/include/c++/12.2.1/variant:629:12,
    52    inlined from 'constexpr std::__detail::__variant::_Move_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Move_assign_base()' at /usr/include/c++/12.2.1/variant:681:12,
    53    inlined from 'constexpr std::__detail::__variant::_Variant_base<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::~_Variant_base()' at /usr/include/c++/12.2.1/variant:735:12,
    54    inlined from 'constexpr std::variant<_Types>::~variant() [with _Types = {CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown}]' at /usr/include/c++/12.2.1/variant:1407:28,
    55    inlined from 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)' at outputtype.cpp:79:5:
    56/usr/include/c++/12.2.1/bits/stl_vector.h:367:31: warning: '*(std::_Vector_base<unsigned char, std::allocator<unsigned char> >*)((char*)&p2sh + offsetof(std::CTxDestination, std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Variant_base<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Move_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Copy_assign_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Move_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Copy_ctor_base<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::<unnamed>.std::__detail::__variant::_Variant_storage<false, CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown>::_M_u) + 8).std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_impl.std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_Vector_impl::<anonymous>.std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_Vector_impl_data::_M_end_of_storage' may be used uninitialized [-Wmaybe-uninitialized]
    57  367 |                       _M_impl._M_end_of_storage - _M_impl._M_start);
    58      |                       ~~~~~~~~^~~~~~~~~~~~~~~~~
    59outputtype.cpp: In function 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)':
    60outputtype.cpp:77:24: note: 'p2sh' declared here
    61   77 |         CTxDestination p2sh = ScriptHash(GetScriptForDestination(segwit));
    62      |                        ^~~~
    63  CXX      libbitcoin_common_a-psbt.o
    
  5. maflcko commented at 5:42 pm on February 1, 2024: member

    I see the same if I use a similar GCC on a different distro, i.e Alpine 3.18 with GCC g++ (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924):

    Interesting. alpine:latest with g++-13.2.1 looked fine for me: https://cirrus-ci.com/task/4994174227841024?logs=make#L5

    However, on Ubuntu, g++-13.2.0 had some warnings: https://cirrus-ci.com/task/4712699251130368?logs=make#L173

    Edit: The reason is that the Ubuntu run was using asan.

  6. maflcko added the label Brainstorming on Feb 1, 2024
  7. maflcko added the label Upstream on Feb 1, 2024
  8. maflcko added the label Questions and Help on Feb 1, 2024
  9. willcl-ark commented at 3:59 pm on October 14, 2024: member

    This is an upstream issue and will be solved next time you upgrade your toolchain.

    Closing for now. Leave a comment if you want this re-opened.

  10. willcl-ark closed this on Oct 14, 2024


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-21 15:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me