[libFuzzer] be more robust when dealing with files on disk (e.g. don't crash if a...
[oota-llvm.git] / lib / Fuzzer / FuzzerCrossOver.cpp
index f03a94a54dd9a7b1f5967710af29093933a5a634..5203deaf91287ad05fa30d576e54fad1dd82fd26 100644 (file)
 namespace fuzzer {
 
 // Cross Data1 and Data2, store the result (up to MaxOutSize bytes) in Out.
-size_t CrossOver(const uint8_t *Data1, size_t Size1,
-                 const uint8_t *Data2, size_t Size2,
-                 uint8_t *Out, size_t MaxOutSize) {
-  MaxOutSize = rand() % MaxOutSize + 1;
+size_t MutationDispatcher::CrossOver(const uint8_t *Data1, size_t Size1,
+                                     const uint8_t *Data2, size_t Size2,
+                                     uint8_t *Out, size_t MaxOutSize) {
+  assert(Size1 || Size2);
+  MaxOutSize = Rand(MaxOutSize) + 1;
   size_t OutPos = 0;
   size_t Pos1 = 0;
   size_t Pos2 = 0;
@@ -33,7 +34,7 @@ size_t CrossOver(const uint8_t *Data1, size_t Size1,
     if (*InPos < InSize) {
       size_t InSizeLeft = InSize - *InPos;
       size_t MaxExtraSize = std::min(OutSizeLeft, InSizeLeft);
-      size_t ExtraSize = rand() % MaxExtraSize + 1;
+      size_t ExtraSize = Rand(MaxExtraSize) + 1;
       memcpy(Out + OutPos, Data + *InPos, ExtraSize);
       OutPos += ExtraSize;
       (*InPos) += ExtraSize;