diff options
author | Kostya Serebryany <kcc@google.com> | 2015-08-01 02:23:06 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2015-08-01 02:23:06 +0000 |
commit | 86a5fba71d5b5503591f28a6817f8808c756bdc4 (patch) | |
tree | 9fa3664d1200ba6c4e6ac9353a2884aa07dc9065 /llvm/lib/Fuzzer/FuzzerMutate.cpp | |
parent | 8ce7424e9c3150385de060334e5f3c61518ce64e (diff) | |
download | bcm5719-llvm-86a5fba71d5b5503591f28a6817f8808c756bdc4.tar.gz bcm5719-llvm-86a5fba71d5b5503591f28a6817f8808c756bdc4.zip |
[libFuzzer] more refactoring of the Mutator and adding tests to it
llvm-svn: 243818
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerMutate.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerMutate.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerMutate.cpp b/llvm/lib/Fuzzer/FuzzerMutate.cpp index eec6475f9b8..fc3176299c9 100644 --- a/llvm/lib/Fuzzer/FuzzerMutate.cpp +++ b/llvm/lib/Fuzzer/FuzzerMutate.cpp @@ -43,6 +43,30 @@ size_t Mutate_EraseByte(uint8_t *Data, size_t Size, size_t MaxSize, return Size - 1; } +size_t Mutate_InsertByte(uint8_t *Data, size_t Size, size_t MaxSize, + FuzzerRandomBase &Rand) { + if (Size == MaxSize) return Size; + size_t Idx = Rand(Size + 1); + // Insert new value at Data[Idx]. + memmove(Data + Idx + 1, Data + Idx, Size - Idx); + Data[Idx] = RandCh(Rand); + return Size + 1; +} + +size_t Mutate_ChangeByte(uint8_t *Data, size_t Size, size_t MaxSize, + FuzzerRandomBase &Rand) { + size_t Idx = Rand(Size); + Data[Idx] = RandCh(Rand); + return Size; +} + +size_t Mutate_ChangeBit(uint8_t *Data, size_t Size, size_t MaxSize, + FuzzerRandomBase &Rand) { + size_t Idx = Rand(Size); + Data[Idx] = FlipRandomBit(Data[Idx], Rand); + return Size; +} + // Mutates Data in place, returns new size. size_t Mutate(uint8_t *Data, size_t Size, size_t MaxSize, FuzzerRandomBase &Rand) { @@ -54,20 +78,11 @@ size_t Mutate(uint8_t *Data, size_t Size, size_t MaxSize, return MaxSize; } assert(Size > 0); - size_t Idx = Rand(Size); - switch (Rand(3)) { + switch (Rand(4)) { case 0: Size = Mutate_EraseByte(Data, Size, MaxSize, Rand); break; - case 1: - if (Size < MaxSize) { - // Insert new value at Data[Idx]. - memmove(Data + Idx + 1, Data + Idx, Size - Idx); - Data[Idx] = RandCh(Rand); - } - Data[Idx] = RandCh(Rand); - break; - case 2: - Data[Idx] = FlipRandomBit(Data[Idx], Rand); - break; + case 1: Size = Mutate_InsertByte(Data, Size, MaxSize, Rand); break; + case 2: Size = Mutate_ChangeByte(Data, Size, MaxSize, Rand); break; + case 3: Size = Mutate_ChangeBit(Data, Size, MaxSize, Rand); break; } assert(Size > 0); return Size; |