1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef Fuzz_DEFINED 9 #define Fuzz_DEFINED 10 11 #include "SkData.h" 12 #include "SkTRegistry.h" 13 #include "SkTypes.h" 14 15 class Fuzz : SkNoncopyable { 16 public: 17 explicit Fuzz(SkData*); 18 19 bool nextBool(); 20 uint8_t nextB(); 21 uint32_t nextU(); 22 // This can be nan, +- infinity, 0, anything. 23 float nextF(); 24 25 // Return the next fuzzed value [min, max) as an unsigned 32bit integer. 26 uint32_t nextRangeU(uint32_t min, uint32_t max); 27 /** 28 * Returns next fuzzed value [min...max) as a float. 29 * Will not be Infinity or NaN. 30 */ 31 float nextRangeF(float min, float max); 32 33 void signalBug (); // Tell afl-fuzz these inputs found a bug. 34 void signalBoring(); // Tell afl-fuzz these inputs are not worth testing. 35 36 private: 37 template <typename T> 38 T nextT(); 39 40 SkAutoTUnref<SkData> fBytes; 41 int fNextByte; 42 }; 43 44 struct Fuzzable { 45 const char* name; 46 void (*fn)(Fuzz*); 47 }; 48 49 #define DEF_FUZZ(name, f) \ 50 static void fuzz_##name(Fuzz*); \ 51 SkTRegistry<Fuzzable> register_##name({#name, fuzz_##name}); \ 52 static void fuzz_##name(Fuzz* f) 53 54 #endif//Fuzz_DEFINED 55