blob: 07c2c8456e248cc35ec7f65d1dd8f19f64d007ab [file] [log] [blame]
mtklein65e58242016-01-13 12:57:57 -08001/*
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"
mtklein65e58242016-01-13 12:57:57 -080014
15class Fuzz : SkNoncopyable {
16public:
17 explicit Fuzz(SkData*);
18
kjlubick5bd98a22016-02-18 06:27:38 -080019 bool nextBool();
mtklein24a22c72016-01-14 04:59:42 -080020 uint8_t nextB();
mtklein65e58242016-01-13 12:57:57 -080021 uint32_t nextU();
kjlubick5bd98a22016-02-18 06:27:38 -080022 // This can be nan, +- infinity, 0, anything.
mtklein65e58242016-01-13 12:57:57 -080023 float nextF();
kjlubick43195932016-04-05 12:48:47 -070024 // Returns a float between [0..1) as a IEEE float
25 float nextF1();
mtklein65e58242016-01-13 12:57:57 -080026
kjlubick5bd98a22016-02-18 06:27:38 -080027 // Return the next fuzzed value [min, max) as an unsigned 32bit integer.
28 uint32_t nextRangeU(uint32_t min, uint32_t max);
29 /**
30 * Returns next fuzzed value [min...max) as a float.
31 * Will not be Infinity or NaN.
32 */
33 float nextRangeF(float min, float max);
34
mtkleina1159422016-01-15 05:46:54 -080035 void signalBug (); // Tell afl-fuzz these inputs found a bug.
36 void signalBoring(); // Tell afl-fuzz these inputs are not worth testing.
37
mtklein65e58242016-01-13 12:57:57 -080038private:
mtkleina1159422016-01-15 05:46:54 -080039 template <typename T>
40 T nextT();
41
mtklein65e58242016-01-13 12:57:57 -080042 SkAutoTUnref<SkData> fBytes;
mtklein24a22c72016-01-14 04:59:42 -080043 int fNextByte;
mtklein65e58242016-01-13 12:57:57 -080044};
45
46struct Fuzzable {
47 const char* name;
48 void (*fn)(Fuzz*);
49};
50
51#define DEF_FUZZ(name, f) \
52 static void fuzz_##name(Fuzz*); \
53 SkTRegistry<Fuzzable> register_##name({#name, fuzz_##name}); \
54 static void fuzz_##name(Fuzz* f)
55
mtklein65e58242016-01-13 12:57:57 -080056#endif//Fuzz_DEFINED