aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormerge-script <fanquake@gmail.com>2024-05-29 09:34:48 +0100
committermerge-script <fanquake@gmail.com>2024-05-29 09:34:48 +0100
commit417b6ceceee94b9f291f7f84c4664e5a6bcd3707 (patch)
treeafe21fce55d318890c1ec5b39aed0579625930c5 /src
parent58956028e4398a33a3bd7ba00aebe03bb589910f (diff)
parent949abebea0059edd929b653b4b475a5880fc0a3e (diff)
Merge bitcoin/bitcoin#30156: fuzz: More accurate coverage reports
949abebea0059edd929b653b4b475a5880fc0a3e [fuzz] Avoid collecting initialization coverage (dergoegge) Pull request description: Our coverage reports include coverage of initialization code, which can be misleading when trying to evaluate the coverage a fuzz harness achieves through fuzzing alone. This PR proposes to make fuzz coverage reports more accurate by resetting coverage counters after initialization code has been run. This makes it easier to evaluate which code was actually reached through fuzzing (e.g. to spot fuzz blockers). ACKs for top commit: maflcko: utACK 949abebea0059edd929b653b4b475a5880fc0a3e brunoerg: nice, utACK 949abebea0059edd929b653b4b475a5880fc0a3e Tree-SHA512: c8579bda4f3d71d199b9331fbe6316fce375a906743d0bc216bb94958dc03fdc9a951ea50cfeb487494a75668ae3c16471a82f7e5fdd912d781dc29d063e2c5b
Diffstat (limited to 'src')
-rw-r--r--src/test/fuzz/fuzz.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/test/fuzz/fuzz.cpp b/src/test/fuzz/fuzz.cpp
index f9915187bd..9a54a44bd3 100644
--- a/src/test/fuzz/fuzz.cpp
+++ b/src/test/fuzz/fuzz.cpp
@@ -79,6 +79,26 @@ void FuzzFrameworkRegisterTarget(std::string_view name, TypeTestOneInput target,
static std::string_view g_fuzz_target;
static const TypeTestOneInput* g_test_one_input{nullptr};
+
+#if defined(__clang__) && defined(__linux__)
+extern "C" void __llvm_profile_reset_counters(void) __attribute__((weak));
+extern "C" void __gcov_reset(void) __attribute__((weak));
+
+void ResetCoverageCounters()
+{
+ if (__llvm_profile_reset_counters) {
+ __llvm_profile_reset_counters();
+ }
+
+ if (__gcov_reset) {
+ __gcov_reset();
+ }
+}
+#else
+void ResetCoverageCounters() {}
+#endif
+
+
void initialize()
{
// Terminate immediately if a fuzzing harness ever tries to create a TCP socket.
@@ -129,6 +149,8 @@ void initialize()
Assert(!g_test_one_input);
g_test_one_input = &it->second.test_one_input;
it->second.opts.init();
+
+ ResetCoverageCounters();
}
#if defined(PROVIDE_FUZZ_MAIN_FUNCTION)