Skip to content

Commit 4a41319

Browse files
authored
Merge pull request #35 from rust-fuzz/frewsxcv-llvm-7
Update libfuzzer files from LLVM 7.0 release.
2 parents 47e480a + 1785b08 commit 4a41319

36 files changed

+1448
-372
lines changed

libfuzzer/CMakeLists.txt

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
set(LIBFUZZER_SOURCES
2-
FuzzerClangCounters.cpp
32
FuzzerCrossOver.cpp
3+
FuzzerDataFlowTrace.cpp
44
FuzzerDriver.cpp
55
FuzzerExtFunctionsDlsym.cpp
66
FuzzerExtFunctionsDlsymWin.cpp
@@ -13,6 +13,7 @@ set(LIBFUZZER_SOURCES
1313
FuzzerMerge.cpp
1414
FuzzerMutate.cpp
1515
FuzzerSHA1.cpp
16+
FuzzerShmemFuchsia.cpp
1617
FuzzerShmemPosix.cpp
1718
FuzzerShmemWindows.cpp
1819
FuzzerTracePC.cpp
@@ -21,8 +22,29 @@ set(LIBFUZZER_SOURCES
2122
FuzzerUtilFuchsia.cpp
2223
FuzzerUtilLinux.cpp
2324
FuzzerUtilPosix.cpp
24-
FuzzerUtilWindows.cpp
25-
)
25+
FuzzerUtilWindows.cpp)
26+
27+
set(LIBFUZZER_HEADERS
28+
FuzzerCommand.h
29+
FuzzerCorpus.h
30+
FuzzerDataFlowTrace.h
31+
FuzzerDefs.h
32+
FuzzerDictionary.h
33+
FuzzerExtFunctions.def
34+
FuzzerExtFunctions.h
35+
FuzzerFlags.def
36+
FuzzerIO.h
37+
FuzzerInterface.h
38+
FuzzerInternal.h
39+
FuzzerMerge.h
40+
FuzzerMutate.h
41+
FuzzerOptions.h
42+
FuzzerRandom.h
43+
FuzzerSHA1.h
44+
FuzzerShmem.h
45+
FuzzerTracePC.h
46+
FuzzerUtil.h
47+
FuzzerValueBitMap.h)
2648

2749
CHECK_CXX_SOURCE_COMPILES("
2850
static thread_local int blah;
@@ -33,10 +55,12 @@ CHECK_CXX_SOURCE_COMPILES("
3355

3456
set(LIBFUZZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
3557

36-
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)
58+
if(OS_NAME MATCHES "Linux|Fuchsia" AND COMPILER_RT_LIBCXX_PATH)
3759
list(APPEND LIBFUZZER_CFLAGS -nostdinc++ -D_LIBCPP_ABI_VERSION=Fuzzer)
3860
# Remove -stdlib= which is unused when passing -nostdinc++.
3961
string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
62+
elseif(TARGET cxx-headers OR HAVE_LIBCXX)
63+
set(LIBFUZZER_DEPS cxx-headers)
4064
endif()
4165

4266
append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS)
@@ -49,21 +73,22 @@ if(NOT HAS_THREAD_LOCAL)
4973
list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread)
5074
endif()
5175

52-
if(APPLE)
53-
set(FUZZER_SUPPORTED_OS osx)
54-
endif()
76+
set(FUZZER_SUPPORTED_OS ${SANITIZER_COMMON_SUPPORTED_OS})
5577

5678
add_compiler_rt_object_libraries(RTfuzzer
5779
OS ${FUZZER_SUPPORTED_OS}
5880
ARCHS ${FUZZER_SUPPORTED_ARCH}
5981
SOURCES ${LIBFUZZER_SOURCES}
60-
CFLAGS ${LIBFUZZER_CFLAGS})
82+
ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS}
83+
CFLAGS ${LIBFUZZER_CFLAGS}
84+
DEPS ${LIBFUZZER_DEPS})
6185

6286
add_compiler_rt_object_libraries(RTfuzzer_main
6387
OS ${FUZZER_SUPPORTED_OS}
6488
ARCHS ${FUZZER_SUPPORTED_ARCH}
6589
SOURCES FuzzerMain.cpp
66-
CFLAGS ${LIBFUZZER_CFLAGS})
90+
CFLAGS ${LIBFUZZER_CFLAGS}
91+
DEPS ${LIBFUZZER_DEPS})
6792

6893
add_compiler_rt_runtime(clang_rt.fuzzer
6994
STATIC
@@ -81,12 +106,12 @@ add_compiler_rt_runtime(clang_rt.fuzzer_no_main
81106
CFLAGS ${LIBFUZZER_CFLAGS}
82107
PARENT_TARGET fuzzer)
83108

84-
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)
109+
if(OS_NAME MATCHES "Linux|Fuchsia" AND COMPILER_RT_LIBCXX_PATH)
85110
macro(partially_link_libcxx name dir arch)
86111
set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/cxx_${arch}_merge.dir")
87112
file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir})
88113
add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD
89-
COMMAND ${CMAKE_LINKER} --whole-archive "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" --no-whole-archive ${dir}/src/libcxx_fuzzer_${arch}-build/lib/libc++.a -r -o ${name}.o
114+
COMMAND ${CMAKE_LINKER} --whole-archive "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" --no-whole-archive ${dir}/lib/libc++.a -r -o ${name}.o
90115
COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o
91116
COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>"
92117
COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" ${name}.o
@@ -102,11 +127,13 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND COMPILER_RT_LIBCXX_PATH)
102127
-D_LIBCPP_ABI_VERSION=Fuzzer
103128
-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=1
104129
-fvisibility=hidden
105-
CMAKE_ARGS -DLIBCXX_ENABLE_EXCEPTIONS=OFF
130+
CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON
131+
-DLIBCXX_ENABLE_EXCEPTIONS=OFF
132+
-DLIBCXX_ENABLE_SHARED=OFF
106133
-DLIBCXX_CXX_ABI=none)
107-
target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${COMPILER_RT_LIBCXX_PATH}/include)
134+
target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
108135
add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build)
109-
target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${COMPILER_RT_LIBCXX_PATH}/include)
136+
target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1)
110137
add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-build)
111138
partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch})
112139
partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch})

libfuzzer/FuzzerClangCounters.cpp

Lines changed: 0 additions & 49 deletions
This file was deleted.

libfuzzer/FuzzerCommand.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ class Command final {
2929
// is immutable, meaning this flag effectively marks the end of the mutable
3030
// argument list.
3131
static inline const char *ignoreRemainingArgs() {
32-
static const char *kIgnoreRemaining = "-ignore_remaining_args=1";
33-
return kIgnoreRemaining;
32+
return "-ignore_remaining_args=1";
3433
}
3534

3635
Command() : CombinedOutAndErr(false) {}

libfuzzer/FuzzerCorpus.h

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#ifndef LLVM_FUZZER_CORPUS
1313
#define LLVM_FUZZER_CORPUS
1414

15+
#include "FuzzerDataFlowTrace.h"
1516
#include "FuzzerDefs.h"
1617
#include "FuzzerIO.h"
1718
#include "FuzzerRandom.h"
@@ -35,8 +36,9 @@ struct InputInfo {
3536
size_t NumSuccessfullMutations = 0;
3637
bool MayDeleteFile = false;
3738
bool Reduced = false;
39+
bool HasFocusFunction = false;
3840
Vector<uint32_t> UniqFeatureSet;
39-
float FeatureFrequencyScore = 1.0;
41+
Vector<uint8_t> DataFlowTraceForFocusFunction;
4042
};
4143

4244
class InputCorpus {
@@ -45,7 +47,6 @@ class InputCorpus {
4547
InputCorpus(const std::string &OutputCorpus) : OutputCorpus(OutputCorpus) {
4648
memset(InputSizesPerFeature, 0, sizeof(InputSizesPerFeature));
4749
memset(SmallestElementPerFeature, 0, sizeof(SmallestElementPerFeature));
48-
memset(FeatureFrequency, 0, sizeof(FeatureFrequency));
4950
}
5051
~InputCorpus() {
5152
for (auto II : Inputs)
@@ -70,10 +71,24 @@ class InputCorpus {
7071
Res = std::max(Res, II->U.size());
7172
return Res;
7273
}
74+
75+
size_t NumInputsThatTouchFocusFunction() {
76+
return std::count_if(Inputs.begin(), Inputs.end(), [](const InputInfo *II) {
77+
return II->HasFocusFunction;
78+
});
79+
}
80+
81+
size_t NumInputsWithDataFlowTrace() {
82+
return std::count_if(Inputs.begin(), Inputs.end(), [](const InputInfo *II) {
83+
return !II->DataFlowTraceForFocusFunction.empty();
84+
});
85+
}
86+
7387
bool empty() const { return Inputs.empty(); }
7488
const Unit &operator[] (size_t Idx) const { return Inputs[Idx]->U; }
7589
void AddToCorpus(const Unit &U, size_t NumFeatures, bool MayDeleteFile,
76-
const Vector<uint32_t> &FeatureSet) {
90+
bool HasFocusFunction, const Vector<uint32_t> &FeatureSet,
91+
const DataFlowTrace &DFT, const InputInfo *BaseII) {
7792
assert(!U.empty());
7893
if (FeatureDebug)
7994
Printf("ADD_TO_CORPUS %zd NF %zd\n", Inputs.size(), NumFeatures);
@@ -83,9 +98,19 @@ class InputCorpus {
8398
II.NumFeatures = NumFeatures;
8499
II.MayDeleteFile = MayDeleteFile;
85100
II.UniqFeatureSet = FeatureSet;
101+
II.HasFocusFunction = HasFocusFunction;
86102
std::sort(II.UniqFeatureSet.begin(), II.UniqFeatureSet.end());
87103
ComputeSHA1(U.data(), U.size(), II.Sha1);
88-
Hashes.insert(Sha1ToString(II.Sha1));
104+
auto Sha1Str = Sha1ToString(II.Sha1);
105+
Hashes.insert(Sha1Str);
106+
if (HasFocusFunction)
107+
if (auto V = DFT.Get(Sha1Str))
108+
II.DataFlowTraceForFocusFunction = *V;
109+
// This is a gross heuristic.
110+
// Ideally, when we add an element to a corpus we need to know its DFT.
111+
// But if we don't, we'll use the DFT of its base input.
112+
if (II.DataFlowTraceForFocusFunction.empty() && BaseII)
113+
II.DataFlowTraceForFocusFunction = BaseII->DataFlowTraceForFocusFunction;
89114
UpdateCorpusDistribution();
90115
PrintCorpus();
91116
// ValidateFeatureSet();
@@ -157,9 +182,9 @@ class InputCorpus {
157182
void PrintStats() {
158183
for (size_t i = 0; i < Inputs.size(); i++) {
159184
const auto &II = *Inputs[i];
160-
Printf(" [%zd %s]\tsz: %zd\truns: %zd\tsucc: %zd\n", i,
185+
Printf(" [% 3zd %s] sz: % 5zd runs: % 5zd succ: % 5zd focus: %d\n", i,
161186
Sha1ToString(II.Sha1).c_str(), II.U.size(),
162-
II.NumExecutedMutations, II.NumSuccessfullMutations);
187+
II.NumExecutedMutations, II.NumSuccessfullMutations, II.HasFocusFunction);
163188
}
164189
}
165190

@@ -213,18 +238,10 @@ class InputCorpus {
213238
return false;
214239
}
215240

216-
void UpdateFeatureFrequency(size_t Idx) {
217-
FeatureFrequency[Idx % kFeatureSetSize]++;
218-
}
219-
float GetFeatureFrequency(size_t Idx) const {
220-
return FeatureFrequency[Idx % kFeatureSetSize];
221-
}
222-
void UpdateFeatureFrequencyScore(InputInfo *II) {
223-
const float kMin = 0.01, kMax = 100.;
224-
II->FeatureFrequencyScore = kMin;
225-
for (auto Idx : II->UniqFeatureSet)
226-
II->FeatureFrequencyScore += 1. / (GetFeatureFrequency(Idx) + 1.);
227-
II->FeatureFrequencyScore = Min(II->FeatureFrequencyScore, kMax);
241+
bool IsFeatureNew(size_t Idx, uint32_t NewSize, bool Shrink) {
242+
assert(NewSize);
243+
uint32_t OldSize = GetFeature(Idx % kFeatureSetSize);
244+
return OldSize == 0 || (Shrink && OldSize > NewSize);
228245
}
229246

230247
size_t NumFeatures() const { return NumAddedFeatures; }
@@ -264,14 +281,11 @@ class InputCorpus {
264281
std::iota(Intervals.begin(), Intervals.end(), 0);
265282
for (size_t i = 0; i < N; i++)
266283
Weights[i] = Inputs[i]->NumFeatures
267-
? (i + 1) * Inputs[i]->FeatureFrequencyScore
284+
? (i + 1) * (Inputs[i]->HasFocusFunction ? 1000 : 1)
268285
: 0.;
269286
if (FeatureDebug) {
270287
for (size_t i = 0; i < N; i++)
271288
Printf("%zd ", Inputs[i]->NumFeatures);
272-
Printf("NUM\n");
273-
for (size_t i = 0; i < N; i++)
274-
Printf("%f ", Inputs[i]->FeatureFrequencyScore);
275289
Printf("SCORE\n");
276290
for (size_t i = 0; i < N; i++)
277291
Printf("%f ", Weights[i]);
@@ -292,7 +306,6 @@ class InputCorpus {
292306
size_t NumUpdatedFeatures = 0;
293307
uint32_t InputSizesPerFeature[kFeatureSetSize];
294308
uint32_t SmallestElementPerFeature[kFeatureSetSize];
295-
float FeatureFrequency[kFeatureSetSize];
296309

297310
std::string OutputCorpus;
298311
};

0 commit comments

Comments
 (0)