[libFuzzer] change the default max_len from 64 to 4096. This will affect cases where libFuzzer is run w/o initial corpus or with a corpus of very small items.

llvm-svn: 305521
This commit is contained in:
Kostya Serebryany 2017-06-15 22:43:40 +00:00
parent 56ed9deafc
commit 589eae515e
9 changed files with 17 additions and 8 deletions

View File

@ -553,12 +553,12 @@ int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) {
return RunInMultipleProcesses(Args, Flags.workers, Flags.jobs); return RunInMultipleProcesses(Args, Flags.workers, Flags.jobs);
const size_t kMaxSaneLen = 1 << 20; const size_t kMaxSaneLen = 1 << 20;
const size_t kMinDefaultLen = 64; const size_t kMinDefaultLen = 4096;
FuzzingOptions Options; FuzzingOptions Options;
Options.Verbosity = Flags.verbosity; Options.Verbosity = Flags.verbosity;
Options.MaxLen = Flags.max_len; Options.MaxLen = Flags.max_len;
Options.ExperimentalLenControl = Flags.experimental_len_control; Options.ExperimentalLenControl = Flags.experimental_len_control;
if (Flags.experimental_len_control && Flags.max_len == 64) if (Flags.experimental_len_control && Flags.max_len == kMinDefaultLen)
Options.MaxLen = 1 << 20; Options.MaxLen = 1 << 20;
Options.UnitTimeoutSec = Flags.timeout; Options.UnitTimeoutSec = Flags.timeout;
Options.ErrorExitCode = Flags.error_exitcode; Options.ErrorExitCode = Flags.error_exitcode;

View File

@ -301,7 +301,9 @@ void Fuzzer::SetMaxInputLen(size_t MaxInputLen) {
this->MaxInputLen = MaxInputLen; this->MaxInputLen = MaxInputLen;
this->MaxMutationLen = MaxInputLen; this->MaxMutationLen = MaxInputLen;
AllocateCurrentUnitData(); AllocateCurrentUnitData();
Printf("INFO: -max_len is not provided, using %zd\n", MaxInputLen); Printf("INFO: -max_len is not provided; "
"libFuzzer will not generate inputs larger than %zd bytes\n",
MaxInputLen);
} }
void Fuzzer::SetMaxMutationLen(size_t MaxMutationLen) { void Fuzzer::SetMaxMutationLen(size_t MaxMutationLen) {

View File

@ -9,7 +9,7 @@
#include <cstring> #include <cstring>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
if (Size < 16) return 0; if (Size < 16 || Size > 64) return 0;
int64_t x; int64_t x;
uint64_t y; uint64_t y;
memcpy(&x, Data, sizeof(x)); memcpy(&x, Data, sizeof(x));

View File

@ -8,6 +8,7 @@
#include <iostream> #include <iostream>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
if (Size > 64) return 0;
int bits = 0; int bits = 0;
if (Size > 0 && Data[0] == 'F') bits |= 1; if (Size > 0 && Data[0] == 'F') bits |= 1;
if (Size > 1 && Data[1] == 'U') bits |= 2; if (Size > 1 && Data[1] == 'U') bits |= 2;

View File

@ -11,6 +11,7 @@
static volatile int Sink; static volatile int Sink;
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
if (Size > 64) return 0;
int8_t Ids[256]; int8_t Ids[256];
memset(Ids, -1, sizeof(Ids)); memset(Ids, -1, sizeof(Ids));
for (size_t i = 0; i < Size; i++) for (size_t i = 0; i < Size; i++)

View File

@ -26,7 +26,7 @@ static uint32_t simple_hash(const uint8_t *Data, size_t Size) {
} }
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
if (Size < 14) if (Size < 14 || Size > 64)
return 0; return 0;
uint32_t Hash = simple_hash(&Data[0], Size - 4); uint32_t Hash = simple_hash(&Data[0], Size - 4);

View File

@ -8,6 +8,7 @@
#include <cstring> #include <cstring>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
if (Size > 64) return 0;
char *S = (char*)Data; char *S = (char*)Data;
volatile auto Strncmp = &(strncmp); // Make sure strncmp is not inlined. volatile auto Strncmp = &(strncmp); // Make sure strncmp is not inlined.
if (Size >= 6 && !Strncmp(S, "qwerty", 6)) { if (Size >= 6 && !Strncmp(S, "qwerty", 6)) {

View File

@ -5,9 +5,13 @@ RUN: echo b > %t/SUB1/SUB2/b
RUN: echo c > %t/SUB1/SUB2/SUB3/c RUN: echo c > %t/SUB1/SUB2/SUB3/c
RUN: LLVMFuzzer-SimpleTest %t/SUB1 -runs=0 2>&1 | FileCheck %s --check-prefix=SUBDIRS RUN: LLVMFuzzer-SimpleTest %t/SUB1 -runs=0 2>&1 | FileCheck %s --check-prefix=SUBDIRS
SUBDIRS: READ units: 3 SUBDIRS: READ units: 3
RUN: echo -n zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz > %t/SUB1/long RUN: echo -n zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz > %t/SUB1/f64
RUN: cat %t/SUB1/f64 %t/SUB1/f64 %t/SUB1/f64 %t/SUB1/f64 > %t/SUB1/f256
RUN: cat %t/SUB1/f256 %t/SUB1/f256 %t/SUB1/f256 %t/SUB1/f256 > %t/SUB1/f1024
RUN: cat %t/SUB1/f1024 %t/SUB1/f1024 %t/SUB1/f1024 %t/SUB1/f1024 > %t/SUB1/f4096
RUN: cat %t/SUB1/f4096 %t/SUB1/f4096 > %t/SUB1/f8192
RUN: LLVMFuzzer-SimpleTest %t/SUB1 -runs=0 2>&1 | FileCheck %s --check-prefix=LONG RUN: LLVMFuzzer-SimpleTest %t/SUB1 -runs=0 2>&1 | FileCheck %s --check-prefix=LONG
LONG: INFO: -max_len is not provided, using 93 LONG: INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 8192 bytes
RUN: rm -rf %t/SUB1 RUN: rm -rf %t/SUB1
RUN: not LLVMFuzzer-SimpleTest NONEXISTENT_DIR 2>&1 | FileCheck %s --check-prefix=NONEXISTENT_DIR RUN: not LLVMFuzzer-SimpleTest NONEXISTENT_DIR 2>&1 | FileCheck %s --check-prefix=NONEXISTENT_DIR

View File

@ -1,4 +1,4 @@
REQUIRES: linux REQUIRES: linux
CHECK: INFO: Loaded 1 modules with {{.*}} inline 8-bit counters CHECK: INFO: Loaded 1 modules with {{.*}} inline 8-bit counters
CHECK: BINGO CHECK: BINGO
RUN: LLVMFuzzer-SimpleTest-Inline8bitCounters -runs=100000 -seed=1 2>&1 | FileCheck %s RUN: LLVMFuzzer-SimpleTest-Inline8bitCounters -runs=1000000 -seed=1 2>&1 | FileCheck %s