summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer/FuzzerMutate.cpp
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2015-08-01 02:23:06 +0000
committerKostya Serebryany <kcc@google.com>2015-08-01 02:23:06 +0000
commit86a5fba71d5b5503591f28a6817f8808c756bdc4 (patch)
tree9fa3664d1200ba6c4e6ac9353a2884aa07dc9065 /llvm/lib/Fuzzer/FuzzerMutate.cpp
parent8ce7424e9c3150385de060334e5f3c61518ce64e (diff)
downloadbcm5719-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.cpp41
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;
OpenPOWER on IntegriCloud