Skip to content

Commit

Permalink
[libFuzzer] when tracing switch statements, handle only one case at a…
Browse files Browse the repository at this point in the history
… time (to make things faster). Also ensure that the signals from value profile do not intersect with the regular coverage

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290031 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
kcc committed Dec 17, 2016
1 parent 0fe2106 commit fdff3a8
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 6 deletions.
16 changes: 13 additions & 3 deletions lib/Fuzzer/FuzzerTracePC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,12 +290,22 @@ void __sanitizer_cov_trace_cmp1(uint8_t Arg1, uint8_t Arg2) {

__attribute__((visibility("default")))
void __sanitizer_cov_trace_switch(uint64_t Val, uint64_t *Cases) {
// Updates the value profile based on the relative position of Val and Cases.
// We want to handle one random case at every call (handling all is slow).
// Since none of the arguments contain any random bits we use a thread-local
// counter to choose the random case to handle.
static thread_local size_t Counter;
Counter++;
uint64_t N = Cases[0];
uint64_t *Vals = Cases + 2;
char *PC = (char*)__builtin_return_address(0);
for (size_t i = 0; i < N; i++)
if (Val != Vals[i])
fuzzer::TPC.HandleCmp(PC + i, Val, Vals[i]);
size_t Idx = Counter % N;
uint64_t TwoIn32 = 1ULL << 32;
if ((Val | Vals[Idx]) < TwoIn32)
fuzzer::TPC.HandleCmp(PC + Idx, static_cast<uint32_t>(Val),
static_cast<uint32_t>(Vals[Idx]));
else
fuzzer::TPC.HandleCmp(PC + Idx, Val, Vals[Idx]);
}

__attribute__((visibility("default")))
Expand Down
2 changes: 1 addition & 1 deletion lib/Fuzzer/FuzzerTracePC.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ size_t TracePC::CollectFeatures(Callback CB) {
}
if (UseValueProfile)
ValueProfileMap.ForEach([&](size_t Idx) {
if (CB(NumGuards + Idx))
if (CB(NumGuards * 8 + Idx))
Res++;
});
return Res;
Expand Down
4 changes: 2 additions & 2 deletions lib/Fuzzer/test/SwitchTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ bool Switch(const uint8_t *Data, size_t Size) {
case 101: Sink = __LINE__; break;
case 1001: Sink = __LINE__; break;
case 10001: Sink = __LINE__; break;
case 100001: Sink = __LINE__; break;
case 1000001: Sink = __LINE__; break;
// case 100001: Sink = __LINE__; break;
// case 1000001: Sink = __LINE__; break;
case 10000001: Sink = __LINE__; break;
case 100000001: return true;
}
Expand Down

0 comments on commit fdff3a8

Please sign in to comment.