[llvm] r246828 - [libFuzzer] when a single mutation fails try a few more times with other mutations before returning un-mutated data

Kostya Serebryany via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 3 17:40:29 PDT 2015


Author: kcc
Date: Thu Sep  3 19:40:29 2015
New Revision: 246828

URL: http://llvm.org/viewvc/llvm-project?rev=246828&view=rev
Log:
[libFuzzer] when a single mutation fails try a few more times with other mutations before returning un-mutated data

Modified:
    llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp

Modified: llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp?rev=246828&r1=246827&r2=246828&view=diff
==============================================================================
--- llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp (original)
+++ llvm/trunk/lib/Fuzzer/FuzzerMutate.cpp Thu Sep  3 19:40:29 2015
@@ -71,7 +71,7 @@ size_t MutationDispatcher::Mutate_Shuffl
 size_t MutationDispatcher::Mutate_EraseByte(uint8_t *Data, size_t Size,
                                             size_t MaxSize) {
   assert(Size);
-  if (Size == 1) return Size;
+  if (Size == 1) return 0;
   size_t Idx = Rand(Size);
   // Erase Data[Idx].
   memmove(Data + Idx, Data + Idx + 1, Size - Idx - 1);
@@ -80,7 +80,7 @@ size_t MutationDispatcher::Mutate_EraseB
 
 size_t MutationDispatcher::Mutate_InsertByte(uint8_t *Data, size_t Size,
                                              size_t MaxSize) {
-  if (Size == MaxSize) return Size;
+  if (Size == MaxSize) return 0;
   size_t Idx = Rand(Size + 1);
   // Insert new value at Data[Idx].
   memmove(Data + Idx + 1, Data + Idx, Size - Idx);
@@ -106,9 +106,10 @@ size_t MutationDispatcher::Mutate_AddWor
                                                         size_t Size,
                                                         size_t MaxSize) {
   auto &D = MDImpl->Dictionary;
-  if (D.empty()) return Size;  // FIXME: indicate failure.
+  assert(!D.empty());
+  if (D.empty()) return 0;
   const Unit &Word = D[Rand(D.size())];
-  if (Size + Word.size() > MaxSize) return Size;
+  if (Size + Word.size() > MaxSize) return 0;
   size_t Idx = Rand(Size + 1);
   memmove(Data + Idx + Word.size(), Data + Idx, Size - Idx);
   memcpy(Data + Idx, Word.data(), Word.size());
@@ -125,9 +126,15 @@ size_t MutationDispatcher::Mutate(uint8_
     return MaxSize;
   }
   assert(Size > 0);
-  size_t MutatorIdx = Rand(MDImpl->Mutators.size());
-  Size = (this->*(MDImpl->Mutators[MutatorIdx]))(Data, Size, MaxSize);
-  assert(Size > 0);
+  // Some mutations may fail (e.g. can't insert more bytes if Size == MaxSize),
+  // in which case they will return 0.
+  // Try several times before returning un-mutated data.
+  for (int Iter = 0; Iter < 10; Iter++) {
+    size_t MutatorIdx = Rand(MDImpl->Mutators.size());
+    size_t NewSize =
+        (this->*(MDImpl->Mutators[MutatorIdx]))(Data, Size, MaxSize);
+    if (NewSize) return NewSize;
+  }
   return Size;
 }
 




More information about the llvm-commits mailing list