Skip to content

Commit 0cc0f9b

Browse files
committed
cmake: Add fuzzing options
1 parent c9231ab commit 0cc0f9b

File tree

5 files changed

+237
-0
lines changed

5 files changed

+237
-0
lines changed

CMakeLists.txt

+30
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,31 @@ tristate_option(WITH_USDT
7070

7171
option(BUILD_TESTS "Build test_bitcoin executable." ON)
7272
option(BUILD_BENCH "Build bench_bitcoin executable." ON)
73+
cmake_dependent_option(BUILD_FUZZ_BINARY "Build fuzz binary." ON "NOT MSVC" OFF)
74+
cmake_dependent_option(FUZZ "Build for fuzzing. Enabling this will disable all other targets and override BUILD_FUZZ_BINARY." OFF "NOT MSVC" OFF)
75+
cmake_dependent_option(FUZZ_OSS "Build for fuzzing in OSS-Fuzz. Implies FUZZ=ON." OFF "NOT MSVC" OFF)
76+
77+
if(FUZZ_OSS)
78+
set(FUZZ ON)
79+
endif()
80+
81+
if(FUZZ)
82+
message(WARNING "FUZZ=ON will disable all other targets and force BUILD_FUZZ_BINARY=ON.")
83+
set(BUILD_DAEMON OFF)
84+
set(BUILD_CLI OFF)
85+
set(BUILD_TX OFF)
86+
set(BUILD_UTIL OFF)
87+
set(BUILD_UTIL_CHAINSTATE OFF)
88+
set(BUILD_SHARED_LIBS OFF)
89+
set(BUILD_WALLET_TOOL OFF)
90+
set(WITH_NATPMP OFF)
91+
set(WITH_MINIUPNPC OFF)
92+
set(WITH_ZMQ OFF)
93+
set(BUILD_TESTS OFF)
94+
set(BUILD_BENCH OFF)
95+
set(BUILD_FUZZ_BINARY ON)
96+
endif()
97+
7398
option(INSTALL_MAN "Install man pages." ON)
7499

75100
if(CXX20)
@@ -235,6 +260,10 @@ if(SANITIZERS)
235260
endif()
236261
endif()
237262

263+
if(FUZZ_OSS)
264+
target_link_options(core INTERFACE $ENV{LIB_FUZZING_ENGINE})
265+
endif()
266+
238267
include(AddBoostIfNeeded)
239268
add_boost_if_needed()
240269

@@ -402,6 +431,7 @@ message(" USDT tracing ........................ ${WITH_USDT}")
402431
message("Tests:")
403432
message(" test_bitcoin ........................ ${BUILD_TESTS}")
404433
message(" bench_bitcoin ....................... ${BUILD_BENCH}")
434+
message(" fuzz binary ......................... ${BUILD_FUZZ_BINARY}")
405435
message("")
406436
if(CMAKE_CROSSCOMPILING)
407437
set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}")

src/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,10 @@ if(BUILD_TESTS)
320320
add_subdirectory(test)
321321
endif()
322322

323+
if(BUILD_FUZZ_BINARY)
324+
add_subdirectory(test/fuzz)
325+
endif()
326+
323327

324328
install(TARGETS ${installable_targets}
325329
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}

src/test/fuzz/CMakeLists.txt

+170
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
# Copyright (c) 2023-present The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or https://opensource.org/license/mit/.
4+
5+
add_subdirectory(util)
6+
7+
add_executable(fuzz
8+
addition_overflow.cpp
9+
addrman.cpp
10+
asmap.cpp
11+
asmap_direct.cpp
12+
autofile.cpp
13+
banman.cpp
14+
base_encode_decode.cpp
15+
bech32.cpp
16+
bip324.cpp
17+
bitdeque.cpp
18+
block.cpp
19+
block_header.cpp
20+
blockfilter.cpp
21+
bloom_filter.cpp
22+
buffered_file.cpp
23+
chain.cpp
24+
checkqueue.cpp
25+
coins_view.cpp
26+
coinscache_sim.cpp
27+
connman.cpp
28+
crypto.cpp
29+
crypto_aes256.cpp
30+
crypto_aes256cbc.cpp
31+
crypto_chacha20.cpp
32+
crypto_common.cpp
33+
crypto_diff_fuzz_chacha20.cpp
34+
crypto_hkdf_hmac_sha256_l32.cpp
35+
crypto_poly1305.cpp
36+
cuckoocache.cpp
37+
decode_tx.cpp
38+
descriptor_parse.cpp
39+
deserialize.cpp
40+
eval_script.cpp
41+
fee_rate.cpp
42+
fees.cpp
43+
flatfile.cpp
44+
float.cpp
45+
golomb_rice.cpp
46+
headerssync.cpp
47+
hex.cpp
48+
http_request.cpp
49+
integer.cpp
50+
key.cpp
51+
key_io.cpp
52+
kitchen_sink.cpp
53+
load_external_block_file.cpp
54+
locale.cpp
55+
merkleblock.cpp
56+
message.cpp
57+
miniscript.cpp
58+
minisketch.cpp
59+
mini_miner.cpp
60+
muhash.cpp
61+
multiplication_overflow.cpp
62+
net.cpp
63+
net_permissions.cpp
64+
netaddress.cpp
65+
netbase_dns_lookup.cpp
66+
node_eviction.cpp
67+
p2p_transport_serialization.cpp
68+
package_eval.cpp
69+
parse_hd_keypath.cpp
70+
parse_numbers.cpp
71+
parse_script.cpp
72+
parse_univalue.cpp
73+
partially_downloaded_block.cpp
74+
policy_estimator.cpp
75+
policy_estimator_io.cpp
76+
poolresource.cpp
77+
pow.cpp
78+
prevector.cpp
79+
primitives_transaction.cpp
80+
process_message.cpp
81+
process_messages.cpp
82+
protocol.cpp
83+
psbt.cpp
84+
random.cpp
85+
rbf.cpp
86+
rolling_bloom_filter.cpp
87+
rpc.cpp
88+
script.cpp
89+
script_assets_test_minimizer.cpp
90+
$<$<TARGET_EXISTS:bitcoinconsensus>:script_bitcoin_consensus.cpp>
91+
script_descriptor_cache.cpp
92+
script_flags.cpp
93+
script_format.cpp
94+
script_interpreter.cpp
95+
script_ops.cpp
96+
script_sigcache.cpp
97+
script_sign.cpp
98+
scriptnum_ops.cpp
99+
secp256k1_ec_seckey_import_export_der.cpp
100+
secp256k1_ecdsa_signature_parse_der_lax.cpp
101+
signature_checker.cpp
102+
signet.cpp
103+
socks5.cpp
104+
span.cpp
105+
spanparsing.cpp
106+
string.cpp
107+
strprintf.cpp
108+
system.cpp
109+
timedata.cpp
110+
torcontrol.cpp
111+
transaction.cpp
112+
tx_in.cpp
113+
tx_out.cpp
114+
tx_pool.cpp
115+
txorphan.cpp
116+
txrequest.cpp
117+
utxo_snapshot.cpp
118+
utxo_total_supply.cpp
119+
validation_load_mempool.cpp
120+
versionbits.cpp
121+
)
122+
target_link_libraries(fuzz
123+
core
124+
test_fuzz
125+
bitcoin_cli
126+
bitcoin_common
127+
minisketch
128+
leveldb
129+
univalue
130+
secp256k1
131+
$<TARGET_NAME_IF_EXISTS:bitcoinconsensus>
132+
Boost::headers
133+
libevent::libevent
134+
)
135+
136+
if(ENABLE_WALLET)
137+
target_sources(fuzz
138+
PRIVATE
139+
${CMAKE_SOURCE_DIR}/src/wallet/test/fuzz/coincontrol.cpp
140+
${CMAKE_SOURCE_DIR}/src/wallet/test/fuzz/coinselection.cpp
141+
${CMAKE_SOURCE_DIR}/src/wallet/test/fuzz/fees.cpp
142+
${CMAKE_SOURCE_DIR}/src/wallet/test/fuzz/parse_iso8601.cpp
143+
$<$<BOOL:${USE_SQLITE}>:${CMAKE_SOURCE_DIR}/src/wallet/test/fuzz/notifications.cpp>
144+
)
145+
target_link_libraries(fuzz bitcoin_wallet)
146+
endif()
147+
148+
set(builtin_mul_overflow_source "
149+
bool f(long long x, long long y, long long* p)
150+
{
151+
return __builtin_mul_overflow(x, y, p);
152+
}
153+
int main() { return 0; }
154+
")
155+
include(CheckCXXSourceCompiles)
156+
check_cxx_source_compiles("${builtin_mul_overflow_source}" HAVE_BUILTIN_MUL_OVERFLOW)
157+
if(HAVE_BUILTIN_MUL_OVERFLOW)
158+
target_compile_definitions(fuzz PRIVATE HAVE_BUILTIN_MUL_OVERFLOW)
159+
else()
160+
set(CMAKE_REQUIRED_LINK_OPTIONS rtlib=compiler-rt)
161+
set(CMAKE_REQUIRED_LIBRARIES gcc_s)
162+
check_cxx_source_compiles("${builtin_mul_overflow_source}" HAVE_BUILTIN_MUL_OVERFLOW_NEEDS_LINK_TO_RT)
163+
if(HAVE_BUILTIN_MUL_OVERFLOW_NEEDS_LINK_TO_RT)
164+
target_compile_definitions(fuzz PRIVATE HAVE_BUILTIN_MUL_OVERFLOW)
165+
target_link_options(fuzz PRIVATE ${CMAKE_REQUIRED_LINK_OPTIONS})
166+
target_link_libraries(fuzz PRIVATE ${CMAKE_REQUIRED_LIBRARIES})
167+
endif()
168+
set(CMAKE_REQUIRED_LINK_OPTIONS)
169+
set(CMAKE_REQUIRED_LIBRARIES)
170+
endif()

src/test/fuzz/util/CMakeLists.txt

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Copyright (c) 2023-present The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or https://opensource.org/license/mit/.
4+
5+
add_library(test_fuzz STATIC EXCLUDE_FROM_ALL
6+
mempool.cpp
7+
net.cpp
8+
../fuzz.cpp
9+
../util.cpp
10+
)
11+
12+
target_link_libraries(test_fuzz
13+
PRIVATE
14+
core
15+
test_util
16+
bitcoin_node
17+
Boost::headers
18+
)
19+
20+
if(NOT FUZZ_OSS)
21+
include(CheckSourceCompilesAndLinks)
22+
check_cxx_source_links_with_flags("-fsanitize=${SANITIZERS}" "
23+
#include <cstdint>
24+
#include <cstddef>
25+
extern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { return 0; }
26+
// No main() function.
27+
" BINARY_LINKS_WITHOUT_MAIN_FUNCTION
28+
)
29+
if(NOT BINARY_LINKS_WITHOUT_MAIN_FUNCTION)
30+
target_compile_definitions(test_fuzz PRIVATE PROVIDE_FUZZ_MAIN_FUNCTION)
31+
endif()
32+
endif()

test/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ function(create_test_config)
2222
set_configure_variable(BUILD_UTIL BUILD_BITCOIN_UTIL)
2323
set_configure_variable(BUILD_WALLET_TOOL BUILD_BITCOIN_WALLET)
2424
set_configure_variable(BUILD_DAEMON BUILD_BITCOIND_TRUE)
25+
set_configure_variable(FUZZ ENABLE_FUZZ)
2526
set_configure_variable(WITH_ZMQ ENABLE_ZMQ)
2627
set_configure_variable(ENABLE_EXTERNAL_SIGNER ENABLE_EXTERNAL_SIGNER)
2728
set_configure_variable(ENABLE_TRACING ENABLE_USDT_TRACEPOINTS)

0 commit comments

Comments
 (0)