Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[libFuzzer] Implement stat::stability_rate based on the percentage of…
… unstable edges. Summary: Created a -print_unstable_stats flag. When -print_unstable_stats=1, we run it 2 more times on interesting inputs poisoning unstable edges in an array. On program termination, we run PrintUnstableStats() which will print a line with a stability percentage like AFL does. Patch by Kyungtak Woo (@kevinwkt). Reviewers: metzman, Dor1s, kcc, morehouse Reviewed By: metzman, Dor1s, morehouse Subscribers: delcypher, llvm-commits, #sanitizers, kcc, morehouse, Dor1s Differential Revision: https://reviews.llvm.org/D49212 llvm-svn: 337187
- Loading branch information
Showing
9 changed files
with
159 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
#include <assert.h> | ||
#include <cstdint> | ||
#include <cstdio> | ||
#include <cstdlib> | ||
|
||
int x = 0; | ||
bool skip0 = false; | ||
bool skip1 = false; | ||
bool skip2 = false; | ||
|
||
__attribute__((noinline)) void det0() { x++; } | ||
__attribute__((noinline)) void det1() { x++; } | ||
__attribute__((noinline)) void det2() { x++; } | ||
__attribute__((noinline)) void det3() { x++; } | ||
__attribute__((noinline)) void det4() { x++; } | ||
|
||
__attribute__((noinline)) void ini0() { x++; } | ||
__attribute__((noinline)) void ini1() { x++; } | ||
__attribute__((noinline)) void ini2() { x++; } | ||
|
||
__attribute__((noinline)) void t0() { x++; } | ||
__attribute__((noinline)) void t1() { x++; } | ||
__attribute__((noinline)) void t2() { x++; } | ||
__attribute__((noinline)) void t3() { x++; } | ||
__attribute__((noinline)) void t4() { x++; } | ||
|
||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { | ||
if (Size == 1 && Data[0] == 'A' && !skip0) { | ||
skip0 = true; | ||
ini0(); | ||
} | ||
if (Size == 1 && Data[0] == 'B' && !skip1) { | ||
skip1 = true; | ||
ini1(); | ||
} | ||
if (Size == 1 && Data[0] == 'C' && !skip2) { | ||
skip2 = true; | ||
ini2(); | ||
} | ||
|
||
det0(); | ||
det1(); | ||
int a = rand(); | ||
det2(); | ||
|
||
switch (a % 5) { | ||
case 0: | ||
t0(); | ||
break; | ||
case 1: | ||
t1(); | ||
break; | ||
case 2: | ||
t2(); | ||
break; | ||
case 3: | ||
t3(); | ||
break; | ||
case 4: | ||
t4(); | ||
break; | ||
default: | ||
assert(false); | ||
} | ||
|
||
det3(); | ||
det4(); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
RUN: %cpp_compiler %S/PrintUnstableStatsTest.cpp -o %t-PrintUnstableStatsTest | ||
RUN: %run %t-PrintUnstableStatsTest -print_unstable_stats=1 -runs=100000 2>&1 | FileCheck %s --check-prefix=LONG | ||
LONG: stat::stability_rate: 27.59 |