[llvm] r252533 - [libFuzzer] make libFuzzer link if there is no sanitizer coverage instrumentation (it will fail at start-up time)
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 9 15:17:45 PST 2015
Author: kcc
Date: Mon Nov 9 17:17:45 2015
New Revision: 252533
URL: http://llvm.org/viewvc/llvm-project?rev=252533&view=rev
Log:
[libFuzzer] make libFuzzer link if there is no sanitizer coverage instrumentation (it will fail at start-up time)
Added:
llvm/trunk/lib/Fuzzer/test/uninstrumented/
llvm/trunk/lib/Fuzzer/test/uninstrumented/CMakeLists.txt
Modified:
llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp
llvm/trunk/lib/Fuzzer/test/CMakeLists.txt
llvm/trunk/lib/Fuzzer/test/fuzzer.test
Modified: llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp?rev=252533&r1=252532&r2=252533&view=diff
==============================================================================
--- llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp (original)
+++ llvm/trunk/lib/Fuzzer/FuzzerLoop.cpp Mon Nov 9 17:17:45 2015
@@ -14,13 +14,34 @@
#include <algorithm>
extern "C" {
+// Re-declare some of the sanitizer functions as "weak" so that
+// libFuzzer can be linked w/o the sanitizers and sanitizer-coveragte
+// (in which case it will complain at start-up time).
__attribute__((weak)) void __sanitizer_print_stack_trace();
__attribute__((weak)) size_t __sanitizer_get_total_unique_caller_callee_pairs();
+__attribute__((weak)) size_t __sanitizer_get_total_unique_coverage();
+__attribute__((weak))
+void __sanitizer_set_death_callback(void (*callback)(void));
+__attribute__((weak)) size_t __sanitizer_get_number_of_counters();
+__attribute__((weak))
+uintptr_t __sanitizer_update_counter_bitset_and_clear_counters(uint8_t *bitset);
}
namespace fuzzer {
static const size_t kMaxUnitSizeToPrint = 256;
+static void MissingWeakApiFunction(const char *FnName) {
+ Printf("ERROR: %s is not defined. Exiting.\n"
+ "Did you use -fsanitize-coverage=... to build your code?\n", FnName);
+ exit(1);
+}
+
+#define CHECK_WEAK_API_FUNCTION(fn) \
+ do { \
+ if (!fn) \
+ MissingWeakApiFunction(#fn); \
+ } while (false)
+
// Only one Fuzzer per process.
static Fuzzer *F;
@@ -33,6 +54,7 @@ Fuzzer::Fuzzer(UserSuppliedFuzzer &USF,
}
void Fuzzer::SetDeathCallback() {
+ CHECK_WEAK_API_FUNCTION(__sanitizer_set_death_callback);
__sanitizer_set_death_callback(StaticDeathCallback);
}
@@ -204,6 +226,7 @@ void Fuzzer::ExecuteCallback(const Unit
}
size_t Fuzzer::RecordBlockCoverage() {
+ CHECK_WEAK_API_FUNCTION(__sanitizer_get_total_unique_coverage);
return LastRecordedBlockCoverage = __sanitizer_get_total_unique_coverage();
}
Modified: llvm/trunk/lib/Fuzzer/test/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/test/CMakeLists.txt?rev=252533&r1=252532&r2=252533&view=diff
==============================================================================
--- llvm/trunk/lib/Fuzzer/test/CMakeLists.txt (original)
+++ llvm/trunk/lib/Fuzzer/test/CMakeLists.txt Mon Nov 9 17:17:45 2015
@@ -34,6 +34,10 @@ set(CustomMainTests
UserSuppliedFuzzerTest
)
+set(UninstrumentedTests
+ UninstrumentedTest
+ )
+
set(TestBinaries)
@@ -89,6 +93,12 @@ foreach(Test ${DFSanTests})
set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-DFSan)
endforeach()
+add_subdirectory(uninstrumented)
+
+foreach(Test ${UninstrumentedTests})
+ set(TestBinaries ${TestBinaries} LLVMFuzzer-${Test}-Uninstrumented)
+endforeach()
+
set_target_properties(${TestBinaries}
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
Modified: llvm/trunk/lib/Fuzzer/test/fuzzer.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/test/fuzzer.test?rev=252533&r1=252532&r2=252533&view=diff
==============================================================================
--- llvm/trunk/lib/Fuzzer/test/fuzzer.test (original)
+++ llvm/trunk/lib/Fuzzer/test/fuzzer.test Mon Nov 9 17:17:45 2015
@@ -60,3 +60,6 @@ RUN: LLVMFuzzer-SimpleDictionaryTest
RUN: not LLVMFuzzer-SimpleHashTest -use_traces=1 -seed=1 -runs=100000 2>&1 | FileCheck %s
RUN: LLVMFuzzer-SimpleHashTest -seed=1 -runs=1000000 2>&1 | FileCheck %s --check-prefix=Done1000000
+
+RUN: not LLVMFuzzer-UninstrumentedTest-Uninstrumented 2>&1 | FileCheck %s --check-prefix=UNINSTRUMENTED
+UNINSTRUMENTED: ERROR: __sanitizer_set_death_callback is not defined. Exiting.
Added: llvm/trunk/lib/Fuzzer/test/uninstrumented/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/test/uninstrumented/CMakeLists.txt?rev=252533&view=auto
==============================================================================
--- llvm/trunk/lib/Fuzzer/test/uninstrumented/CMakeLists.txt (added)
+++ llvm/trunk/lib/Fuzzer/test/uninstrumented/CMakeLists.txt Mon Nov 9 17:17:45 2015
@@ -0,0 +1,14 @@
+# These tests are not instrumented with coverage.
+
+set(CMAKE_CXX_FLAGS_RELEASE
+ "${LIBFUZZER_FLAGS_BASE} -O0 -fno-sanitize=all")
+
+foreach(Test ${UninstrumentedTests})
+ add_executable(LLVMFuzzer-${Test}-Uninstrumented
+ ../${Test}.cpp
+ )
+ target_link_libraries(LLVMFuzzer-${Test}-Uninstrumented
+ LLVMFuzzer
+ )
+endforeach()
+
More information about the llvm-commits
mailing list