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

issue starius opened this issue on February 1, 2024
  1. starius commented at 2:46 AM on February 1, 2024: contributor

    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.

    $ g++ --version
    g++ (Debian 12.2.0-14) 12.2.0
    Copyright (C) 2022 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    sudo apt-get install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3
    sudo apt-get install libevent-dev libboost-dev
    sudo apt install libsqlite3-dev
    
    make -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
    export BDB_PREFIX=/root/bitcoin/depends/aarch64-unknown-linux-gnu/
    
    ./autogen.sh
    ./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include"
    make -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):

      CXX      libbitcoin_common_a-protocol.o
    In file included from ./hash.h:13,
                     from ./pubkey.h:10,
                     from ./addresstype.h:9,
                     from ./outputtype.h:9,
                     from outputtype.cpp:6:
    In member function 'bool prevector<N, T, Size, Diff>::is_direct() const [with unsigned int N = 28; T = unsigned char; Size = unsigned int; Diff = int]',
        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,
        inlined from 'CScript::~CScript()' at ./script/script.h:413:7,
        inlined from 'CNoDestination::~CNoDestination()' at ./addresstype.h:18:7,
        inlined from 'constexpr void std::destroy_at(_Tp*) [with _Tp = CNoDestination]' at /usr/include/c++/12.2.1/bits/stl_construct.h:88:18,
        inlined from 'constexpr void std::_Destroy(_Tp*) [with _Tp = CNoDestination]' at /usr/include/c++/12.2.1/bits/stl_construct.h:149:22,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        inlined from 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)' at outputtype.cpp:79:5:
    ./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]
      175 |     bool is_direct() const { return _size <= N; }
          |                                     ^~~~~
    outputtype.cpp: In function 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)':
    outputtype.cpp:77:24: note: 'p2sh' declared here
       77 |         CTxDestination p2sh = ScriptHash(GetScriptForDestination(segwit));
          |                        ^~~~
    In file included from /usr/include/c++/12.2.1/vector:64,
                     from ./serialize.h:25,
                     from ./hash.h:14:
    In destructor 'constexpr std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>]',
        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,
        inlined from 'constexpr WitnessUnknown::~WitnessUnknown()' at ./addresstype.h:94:8,
        inlined from 'constexpr void std::destroy_at(_Tp*) [with _Tp = WitnessUnknown]' at /usr/include/c++/12.2.1/bits/stl_construct.h:88:18,
        inlined from 'constexpr void std::_Destroy(_Tp*) [with _Tp = WitnessUnknown]' at /usr/include/c++/12.2.1/bits/stl_construct.h:149:22,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        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,
        inlined from 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)' at outputtype.cpp:79:5:
    /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]
      367 |                       _M_impl._M_end_of_storage - _M_impl._M_start);
          |                       ~~~~~~~~^~~~~~~~~~~~~~~~~
    outputtype.cpp: In function 'std::vector<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown> > GetAllDestinationsForKey(const CPubKey&)':
    outputtype.cpp:77:24: note: 'p2sh' declared here
       77 |         CTxDestination p2sh = ScriptHash(GetScriptForDestination(segwit));
          |                        ^~~~
      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

  11. bitcoin locked this on Oct 14, 2025

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: 2026-05-02 15:13 UTC

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