It doesn’t really make sense to treat DEFAULT_CHECKLEVEL as unsigned as long as VerifyDB accepts a signed integer.
Making it signed also avoids a cast round trip from signed->unsigned->signed in the RPC.
It doesn’t really make sense to treat DEFAULT_CHECKLEVEL as unsigned as long as VerifyDB accepts a signed integer.
Making it signed also avoids a cast round trip from signed->unsigned->signed in the RPC.
0echo 'dmVyaWZ5Y2hhaW5c//////9wc2J0/wAAAAAAfv/i4uL///////9/BQX/////Cg==' | base64 --decode > /tmp/crash
1UBSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1" FUZZ=rpc ./src/test/fuzz/fuzz /tmp/crash
0rpc/blockchain.cpp:1420:77: runtime error: implicit conversion from type 'int' of value -30 (32-bit, signed) to type 'unsigned int' changed the value to 4294967266 (32-bit, unsigned)
1 [#0](/bitcoin-bitcoin/0/) 0x55df91a807d6 in verifychain()::$_20::operator()(RPCHelpMan const&, JSONRPCRequest const&) const src/rpc/blockchain.cpp:1420:77
2 [#1](/bitcoin-bitcoin/1/) 0x55df91a807d6 in std::_Function_handler<UniValue (RPCHelpMan const&, JSONRPCRequest const&), verifychain()::$_20>::_M_invoke(std::_Any_data const&, RPCHelpMan const&, JSONRPCRequest const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:285:9
3 [#2](/bitcoin-bitcoin/2/) 0x55df91f1acaf in std::function<UniValue (RPCHelpMan const&, JSONRPCRequest const&)>::operator()(RPCHelpMan const&, JSONRPCRequest const&) const /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:688:14
4 [#3](/bitcoin-bitcoin/3/) 0x55df91f18910 in RPCHelpMan::HandleRequest(JSONRPCRequest const&) const src/rpc/util.cpp:576:26
5 [#4](/bitcoin-bitcoin/4/) 0x55df91a4679a in CRPCCommand::CRPCCommand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, RPCHelpMan (*)())::'lambda'(JSONRPCRequest const&, UniValue&, bool)::operator()(JSONRPCRequest const&, UniValue&, bool) const src/./rpc/server.h:109:91
6 [#5](/bitcoin-bitcoin/5/) 0x55df91a4636f in std::_Function_handler<bool (JSONRPCRequest const&, UniValue&, bool), CRPCCommand::CRPCCommand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, RPCHelpMan (*)())::'lambda'(JSONRPCRequest const&, UniValue&, bool)>::_M_invoke(std::_Any_data const&, JSONRPCRequest const&, UniValue&, bool&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:285:9
7 [#6](/bitcoin-bitcoin/6/) 0x55df91886507 in std::function<bool (JSONRPCRequest const&, UniValue&, bool)>::operator()(JSONRPCRequest const&, UniValue&, bool) const /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:688:14
8 [#7](/bitcoin-bitcoin/7/) 0x55df91bcf43a in ExecuteCommand(CRPCCommand const&, JSONRPCRequest const&, UniValue&, bool) src/rpc/server.cpp:480:20
9 [#8](/bitcoin-bitcoin/8/) 0x55df91bc9b39 in ExecuteCommands(std::vector<CRPCCommand const*, std::allocator<CRPCCommand const*> > const&, JSONRPCRequest const&, UniValue&) src/rpc/server.cpp:444:13
10 [#9](/bitcoin-bitcoin/9/) 0x55df91bc96a7 in CRPCTable::execute(JSONRPCRequest const&) const src/rpc/server.cpp:464:13
11 [#10](/bitcoin-bitcoin/10/) 0x55df913e561a in (anonymous namespace)::RPCFuzzTestingSetup::CallRPC(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) src/test/fuzz/rpc.cpp:54:18
12 [#11](/bitcoin-bitcoin/11/) 0x55df913e561a in rpc_fuzz_target(Span<unsigned char const>) src/test/fuzz/rpc.cpp:361:28
13 [#12](/bitcoin-bitcoin/12/) 0x55df911bd208 in std::_Function_handler<void (Span<unsigned char const>), void (*)(Span<unsigned char const>)>::_M_invoke(std::_Any_data const&, Span<unsigned char const>&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:300:2
14 [#13](/bitcoin-bitcoin/13/) 0x55df92170a9d in std::function<void (Span<unsigned char const>)>::operator()(Span<unsigned char const>) const /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/std_function.h:688:14
15 [#14](/bitcoin-bitcoin/14/) 0x55df92170748 in LLVMFuzzerTestOneInput src/test/fuzz/fuzz.cpp:119:5
16 [#15](/bitcoin-bitcoin/15/) 0x55df910c9f93 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/root/fuzz_dir/scratch/fuzz_gen/code/src/test/fuzz/fuzz+0x14c0f93) (BuildId: cf5bb89b801a533254c4db373c3faadf43035367)
17 [#16](/bitcoin-bitcoin/16/) 0x55df910b433f in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned long) (/root/fuzz_dir/scratch/fuzz_gen/code/src/test/fuzz/fuzz+0x14ab33f) (BuildId: cf5bb89b801a533254c4db373c3faadf43035367)
18 [#17](/bitcoin-bitcoin/17/) 0x55df910ba056 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/root/fuzz_dir/scratch/fuzz_gen/code/src/test/fuzz/fuzz+0x14b1056) (BuildId: cf5bb89b801a533254c4db373c3faadf43035367)
19 [#18](/bitcoin-bitcoin/18/) 0x55df910e36d2 in main (/root/fuzz_dir/scratch/fuzz_gen/code/src/test/fuzz/fuzz+0x14da6d2) (BuildId: cf5bb89b801a533254c4db373c3faadf43035367)
20 [#19](/bitcoin-bitcoin/19/) 0x7f474c8d10b2 in __libc_start_main /build/glibc-eX1tMB/glibc-2.31/csu/../csu/libc-start.c:308:16
21 [#20](/bitcoin-bitcoin/20/) 0x55df910aeacd in _start (/root/fuzz_dir/scratch/fuzz_gen/code/src/test/fuzz/fuzz+0x14a5acd) (BuildId: cf5bb89b801a533254c4db373c3faadf43035367)
22
23SUMMARY: UndefinedBehaviorSanitizer: implicit-integer-sign-change rpc/blockchain.cpp:1420:77 in
verifychain -1 1
fuzz. I’m using Ubuntu 21.10 and clang 14.0.0, in case that matters. The only unusual thing in my configuration is that it’s build without optimization (built using -O0).
Is there a way to just print the config? Here’s how I did the build:
0./autogen.sh && ./configure CXXFLAGS='-O0 -g' CC=clang-14 CXX=clang++-14 --enable-fuzz --with-sanitizers=address,fuzzer,undefined && make
-O0. Please share the exact steps to reproduce
I can’t reproduce the problem using
fuzz. I’m using Ubuntu 21.10 and clang 14.0.0, in case that matters. The only unusual thing in my configuration is that it’s build without optimization (built using-O0).
install for more command to the ubuntu 2110 and get more note for that ubuntu type
Please share the exact steps to reproduce
Some things about my environment:
0$ cat /etc/os-release # (I'll abbreviate the output of just this command slightly)
1PRETTY_NAME="Ubuntu 21.10"
2NAME="Ubuntu"
3VERSION_ID="21.10"
4VERSION="21.10 (Impish Indri)"
5VERSION_CODENAME=impish
6ID=ubuntu
7ID_LIKE=debian
8$ uname -a
9Linux larry-VirtualBox 5.13.0-28-generic [#31](/bitcoin-bitcoin/31/)-Ubuntu SMP Thu Jan 13 17:41:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
10$ clang++-14 --version
11Ubuntu clang version 14.0.0-++20220216033948+c561bf0daa95-1~exp1~20220216153959.57
12Target: x86_64-pc-linux-gnu
13Thread model: posix
14InstalledDir: /usr/bin
15$
Build, this time without -O0, starting in a fresh clone of master:
0$ git checkout MarcoFalke/2202-rpcInt
1$ git checkout HEAD~ # back up one commit so that we don't have the fix
2Previous HEAD position was fa8dad0e0 rpc: Fix implicit-integer-sign-change in verifychain
3HEAD is now at 7164e00e1 Merge bitcoin/bitcoin#24324: test: refactor: remove unneeded bytes<->hex conversions in `byte_to_base58`
4$ ./autogen.sh && ./configure CC=clang-14 CXX=clang++-14 --enable-fuzz --with-sanitizers=address,fuzzer,undefined --without-miniupnpc --disable-wallet --without-gui && make -C src test/fuzz/fuzz
5$
Run the test
0$ echo 'dmVyaWZ5Y2hhaW5c//////9wc2J0/wAAAAAAfv/i4uL///////9/BQX/////Cg==' | base64 --decode > /tmp/crash
1$ UBSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1" FUZZ=rpc ./src/test/fuzz/fuzz /tmp/crash
2INFO: Running with entropic power schedule (0xFF, 100).
3INFO: Seed: 302550202
4INFO: Loaded 1 modules (229102 inline 8-bit counters): 229102 [0x5621d0f1b2a0, 0x5621d0f5318e),
5INFO: Loaded 1 PC tables (229102 PCs): 229102 [0x5621d0f53190,0x5621d12d2070),
6./src/test/fuzz/fuzz: Running 1 inputs 1 time(s) each.
7Running: /tmp/crash
8Executed /tmp/crash in 1 ms
9***
10*** NOTE: fuzzing was not performed, you have only
11*** executed the target code on a fixed set of inputs.
12***
13$
integer sanitizer? --with-sanitizers=integer,fuzzer,undefined
Code-review ACK fa8dad0e078c577d740a9667636733957586c035
Related problem: could also change the check_level parameter of VerifyLoadedChainstate from unsigned int to int, in order to avoid another cast roundtrip from signed->unsigned->signed in the init procedure (AppInitMain), either in this PR or a follow-up. The same probably also for the check_blocks parameter (didn’t check this one in detail though).