Skip to content

Commit 1573024

Browse files
committed
cmake: Add BUILD_FUZZ_BINARY option
1 parent 23daa1d commit 1573024

File tree

4 files changed

+206
-0
lines changed

4 files changed

+206
-0
lines changed

CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ 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+
7375
option(INSTALL_MAN "Install man pages." ON)
7476

7577
if(CXX20)
@@ -402,6 +404,7 @@ message(" USDT tracing ........................ ${WITH_USDT}")
402404
message("Tests:")
403405
message(" test_bitcoin ........................ ${BUILD_TESTS}")
404406
message(" bench_bitcoin ....................... ${BUILD_BENCH}")
407+
message(" fuzz binary ......................... ${BUILD_FUZZ_BINARY}")
405408
message("")
406409
if(CMAKE_CROSSCOMPILING)
407410
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

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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+
target_link_libraries(test_fuzz
12+
PRIVATE
13+
core
14+
test_util
15+
bitcoin_node
16+
)
17+
18+
try_append_linker_flag("-fsanitize=${SANITIZERS}"
19+
SOURCE "
20+
#include <cstdint>
21+
#include <cstddef>
22+
extern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { return 0; }
23+
// No main() function.
24+
"
25+
RESULT_VAR binary_links_without_main_funtcion
26+
)
27+
if(NOT binary_links_without_main_funtcion)
28+
target_compile_definitions(test_fuzz PRIVATE PROVIDE_FUZZ_MAIN_FUNCTION)
29+
endif()

0 commit comments

Comments
 (0)