1 //===- FuzzerMutate.cpp - Mutate a test input -----------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 // Mutate a test input.
10 //===----------------------------------------------------------------------===//
14 #include "FuzzerInternal.h"
18 static char FlipRandomBit(char X) {
30 static char RandCh() {
31 if (rand() % 2) return rand();
32 const char *Special = "!*'();:@&=+$,/?%#[]123ABCxyz-`~.";
33 return Special[rand() % (sizeof(Special) - 1)];
36 // Mutates Data in place, returns new size.
37 size_t Mutate(uint8_t *Data, size_t Size, size_t MaxSize) {
39 assert(Size <= MaxSize);
41 for (size_t i = 0; i < MaxSize; i++)
46 size_t Idx = rand() % Size;
51 memmove(Data + Idx, Data + Idx + 1, Size - Idx - 1);
54 [[clang::fallthrough]];
57 // Insert new value at Data[Idx].
58 memmove(Data + Idx + 1, Data + Idx, Size - Idx);
64 Data[Idx] = FlipRandomBit(Data[Idx]);