Page MenuHomePhabricator

[util] Replace use of locale dependent atoi(…) with locale-independent std::from_chars (C++17)
ClosedPublic

Authored by tobias_ruck on Aug 11 2025, 13:24.

Details

Summary

Removes the usage of atoi, which is not locale-independent, and replaces it with a new function LocaleIndependentAtoi, which is.

  • test: Add test cases for LocaleIndependentAtoi
  • fuzz: Assert legacy atoi(s) == LocaleIndependentAtoi<int>(s)
  • fuzz: Assert legacy atoi64(s) == LocaleIndependentAtoi<int64_t>(s)

Backport from core#20452.

Test Plan

ninja check, plus run fuzzers

Diff Detail

Repository
rABC Bitcoin ABC
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

Tail of the build log:

[373/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/protocol.cpp.o
[374/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/primitives_transaction.cpp.o
[375/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/random.cpp.o
[376/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/rolling_bloom_filter.cpp.o
[377/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/psbt.cpp.o
[378/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/deserialize.cpp.o
[379/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_bitcoin_consensus.cpp.o
[380/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_flags.cpp.o
[381/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script.cpp.o
[382/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_descriptor_cache.cpp.o
[383/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/spanparsing.cpp.o
[384/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/process_message.cpp.o
[385/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/signature_checker.cpp.o
[386/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/process_messages.cpp.o
[387/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_interpreter.cpp.o
[388/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_ops.cpp.o
[389/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/secp256k1_ecdsa_signature_parse_der_lax.cpp.o
[390/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/secp256k1_ec_seckey_import_export_der.cpp.o
[391/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/scriptnum_ops.cpp.o
[392/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/span.cpp.o
[393/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/tx_in.cpp.o
[394/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/tx_out.cpp.o
[395/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/system.cpp.o
[396/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_sigcache.cpp.o
[397/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/socks5.cpp.o
[398/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/script_sign.cpp.o
[399/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/timedata.cpp.o
[400/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/string.cpp.o
[401/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[402/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/strprintf.cpp.o
[403/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/util.cpp.o
[404/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/txrequest.cpp.o
[405/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[406/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[407/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/transaction.cpp.o
[408/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[409/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[410/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[411/431] Building CXX object src/test/fuzz/CMakeFiles/fuzz.dir/validation_load_mempool.cpp.o
[412/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[413/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[414/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[415/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[416/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[417/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[418/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[419/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[420/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[421/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[422/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[423/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[424/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[425/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[426/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[427/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[428/431] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[429/431] Linking CXX static library src/wallet/libwallet.a
[430/431] Linking CXX static library src/libserver.a
ninja: build stopped: cannot make progress due to previous errors.
Build build-fuzzer failed with exit code 1

Failed tests logs:

====== Bitcoin ABC functional tests: p2p_compactblocks_blocksonly.py ======

------- Stdout: -------
2025-08-11T14:22:32.710000Z TestFramework (INFO): Initializing test directory /work/abc-ci-builds/build-diff/test/tmp/test_runner_₿₵_🏃_20250811_142013_63159/p2p_compactblocks_blocksonly_180
2025-08-11T14:22:33.483000Z TestFramework (INFO): Test that -blocksonly nodes do not select peers for BIP152 high bandwidth mode
2025-08-11T14:22:33.594000Z TestFramework (INFO): Test that -blocksonly nodes send getdata(BLOCK) instead of getdata(CMPCT) in BIP152 low bandwidth mode
2025-08-11T14:22:33.698000Z TestFramework (INFO): Test that getdata(CMPCT) is still sent on BIP152 low bandwidth connections when no -blocksonly nodes are involved
2025-08-11T14:22:33.799000Z TestFramework (INFO): Test that -blocksonly nodes still serve compact blocks
2025-08-11T14:23:33.928000Z TestFramework.utils (ERROR): wait_until() failed. Predicate: ''''
        def test_function():
            if check_connected:
                assert self.is_connected
            return test_function_in()
'''
2025-08-11T14:23:33.928000Z TestFramework (ERROR): Assertion failed
Traceback (most recent call last):
  File "/work/test/functional/test_framework/test_framework.py", line 152, in main
    self._run_test_internal()
  File "/work/test/functional/test_framework/test_framework.py", line 142, in _run_test_internal
    self.run_test()
  File "/work/test/functional/p2p_compactblocks_blocksonly.py", line 149, in run_test
    p2p_conn_blocksonly.wait_until(lambda: test_for_cmpctblock(block2))
  File "/work/test/functional/test_framework/p2p.py", line 582, in wait_until
    wait_until_helper(
  File "/work/test/functional/test_framework/util.py", line 312, in wait_until_helper
    raise AssertionError(
AssertionError: Predicate ''''
        def test_function():
            if check_connected:
                assert self.is_connected
            return test_function_in()
''' not true after 60.0 seconds
2025-08-11T14:23:33.979000Z TestFramework (INFO): Stopping nodes
2025-08-11T14:23:34.087000Z TestFramework (WARNING): Not cleaning up dir /work/abc-ci-builds/build-diff/test/tmp/test_runner_₿₵_🏃_20250811_142013_63159/p2p_compactblocks_blocksonly_180
2025-08-11T14:23:34.087000Z TestFramework (ERROR): Test failed. Test logging available at /work/abc-ci-builds/build-diff/test/tmp/test_runner_₿₵_🏃_20250811_142013_63159/p2p_compactblocks_blocksonly_180/test_framework.log
2025-08-11T14:23:34.087000Z TestFramework (ERROR): 
2025-08-11T14:23:34.087000Z TestFramework (ERROR): Hint: Call /work/test/functional/combine_logs.py '/work/abc-ci-builds/build-diff/test/tmp/test_runner_₿₵_🏃_20250811_142013_63159/p2p_compactblocks_blocksonly_180' to consolidate all logs
2025-08-11T14:23:34.087000Z TestFramework (ERROR): 
2025-08-11T14:23:34.087000Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log.
2025-08-11T14:23:34.087000Z TestFramework (ERROR): https://github.com/Bitcoin-ABC/bitcoin-abc/issues
2025-08-11T14:23:34.087000Z TestFramework (ERROR):

Each failure log is accessible here:
Bitcoin ABC functional tests: p2p_compactblocks_blocksonly.py

This revision is now accepted and ready to land.Aug 11 2025, 15:54