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