Add new fuzz binary.
This is designed to have short startup time, for maximum fuzzing throughput. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1589563002 Review URL: https://codereview.chromium.org/1589563002
This commit is contained in:
parent
fa8963252e
commit
65e5824d3a
43
fuzz/Fuzz.h
Normal file
43
fuzz/Fuzz.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright 2016 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef Fuzz_DEFINED
|
||||
#define Fuzz_DEFINED
|
||||
|
||||
#include "SkData.h"
|
||||
#include "SkTRegistry.h"
|
||||
#include "SkTypes.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
class Fuzz : SkNoncopyable {
|
||||
public:
|
||||
explicit Fuzz(SkData*);
|
||||
|
||||
uint32_t nextU();
|
||||
float nextF();
|
||||
|
||||
// These return a value in [min, max).
|
||||
uint32_t nextURange(uint32_t min, uint32_t max);
|
||||
float nextFRange(float min, float max);
|
||||
|
||||
private:
|
||||
SkAutoTUnref<SkData> fBytes;
|
||||
};
|
||||
|
||||
struct Fuzzable {
|
||||
const char* name;
|
||||
void (*fn)(Fuzz*);
|
||||
};
|
||||
|
||||
#define DEF_FUZZ(name, f) \
|
||||
static void fuzz_##name(Fuzz*); \
|
||||
SkTRegistry<Fuzzable> register_##name({#name, fuzz_##name}); \
|
||||
static void fuzz_##name(Fuzz* f)
|
||||
|
||||
#define ASSERT(cond) do { if (!(cond)) abort(); } while(false)
|
||||
|
||||
#endif//Fuzz_DEFINED
|
40
fuzz/FuzzPaeth.cpp
Normal file
40
fuzz/FuzzPaeth.cpp
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2016 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "Fuzz.h"
|
||||
|
||||
// This really is just an example Fuzz*.cpp file.
|
||||
// It tests that two different ways of calculating the Paeth predictor function are equivalent.
|
||||
|
||||
static uint8_t paeth_std(uint8_t a, uint8_t b, uint8_t c) {
|
||||
int p = a+b-c;
|
||||
|
||||
int pa = abs(p-a),
|
||||
pb = abs(p-b),
|
||||
pc = abs(p-c);
|
||||
|
||||
if (pb < pa) { pa = pb; a = b; }
|
||||
if (pc < pa) { a = c; }
|
||||
return a;
|
||||
}
|
||||
|
||||
static uint8_t paeth_alt(uint8_t a, uint8_t b, uint8_t c) {
|
||||
int min = SkTMin(a,b),
|
||||
max = SkTMax(a,b);
|
||||
int delta = (max-min)/3;
|
||||
|
||||
if (c <= min+delta) return max;
|
||||
if (c >= max-delta) return min;
|
||||
return c;
|
||||
}
|
||||
|
||||
DEF_FUZZ(Paeth, fuzz) {
|
||||
int a = fuzz->nextU(),
|
||||
b = fuzz->nextU(),
|
||||
c = fuzz->nextU();
|
||||
ASSERT(paeth_alt(a,b,c) == paeth_std(a,b,c));
|
||||
}
|
40
fuzz/fuzz.cpp
Normal file
40
fuzz/fuzz.cpp
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2016 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "Fuzz.h"
|
||||
#include "SkCommandLineFlags.h"
|
||||
|
||||
DEFINE_string2(match, m, "", "The usual match patterns, applied to name.");
|
||||
DEFINE_string2(bytes, b, "", "Path to file containing fuzzed bytes.");
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
SkCommandLineFlags::Parse(argc, argv);
|
||||
SkAutoTUnref<SkData> bytes;
|
||||
if (!FLAGS_bytes.isEmpty()) {
|
||||
bytes.reset(SkData::NewFromFileName(FLAGS_bytes[0]));
|
||||
}
|
||||
|
||||
for (auto r = SkTRegistry<Fuzzable>::Head(); r; r = r->next()) {
|
||||
auto fuzzable = r->factory();
|
||||
if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, fuzzable.name)) {
|
||||
SkDebugf("Running %s...\n", fuzzable.name);
|
||||
Fuzz fuzz(bytes);
|
||||
fuzzable.fn(&fuzz);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Fuzz::Fuzz(SkData* bytes) : fBytes(SkSafeRef(bytes)) {}
|
||||
|
||||
// These methods are all TODO(kjlubick).
|
||||
uint32_t Fuzz::nextU() { return 0; }
|
||||
float Fuzz::nextF() { return 0.0f; }
|
||||
uint32_t Fuzz::nextURange(uint32_t min, uint32_t max) { return min; }
|
||||
float Fuzz::nextFRange(float min, float max) { return min; }
|
||||
|
17
gyp/fuzz.gyp
Normal file
17
gyp/fuzz.gyp
Normal file
@ -0,0 +1,17 @@
|
||||
# Copyright 2016 Google Inc.
|
||||
#
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
{
|
||||
'includes': [ 'apptype_console.gypi' ],
|
||||
'targets': [{
|
||||
'target_name': 'fuzz',
|
||||
'type': 'executable',
|
||||
'sources': [ '<!@(python find.py ../fuzz "*.cpp")' ],
|
||||
'dependencies': [
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
}],
|
||||
}
|
15
gyp/most.gyp
15
gyp/most.gyp
@ -27,12 +27,13 @@
|
||||
'pathops_skpclip.gyp:*',
|
||||
'dm.gyp:dm',
|
||||
'visualbench.gyp:visualbench',
|
||||
'fuzz.gyp:fuzz',
|
||||
],
|
||||
'conditions': [
|
||||
[ 'skia_gpu == 0', {
|
||||
'dependencies!': [
|
||||
'visualbench.gyp:visualbench'
|
||||
]
|
||||
[ 'skia_gpu == 0', {
|
||||
'dependencies!': [
|
||||
'visualbench.gyp:visualbench'
|
||||
]
|
||||
}],
|
||||
[ 'skia_gpu == 0 or skia_os == "android"', {
|
||||
'dependencies!': [
|
||||
@ -40,13 +41,13 @@
|
||||
],
|
||||
}],
|
||||
['skia_os == "android"', {
|
||||
'dependencies': [
|
||||
'android_system.gyp:SampleApp_APK',
|
||||
'dependencies': [
|
||||
'android_system.gyp:SampleApp_APK',
|
||||
],
|
||||
'conditions': [
|
||||
[ 'skia_gpu == 1', {
|
||||
'dependencies': [
|
||||
'android_system.gyp:VisualBench_APK',
|
||||
'android_system.gyp:VisualBench_APK',
|
||||
],
|
||||
}],
|
||||
],
|
||||
|
Loading…
Reference in New Issue
Block a user