author | Martin von Zweigbergk <martinvonz@google.com> |
Thu, 12 Nov 2020 15:28:06 -0800 | |
changeset 45866 | d68618954ade |
parent 43832 | e137338e926b |
permissions | -rw-r--r-- |
43831
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 |
// Copyright 2017 Google Inc. All Rights Reserved. |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 |
// Licensed under the Apache License, Version 2.0 (the "License"); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
3 |
|
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 |
// Example of a standalone runner for "fuzz targets". |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 |
// It reads all files passed as parameters and feeds their contents |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 |
// one by one into the fuzz target (LLVMFuzzerTestOneInput). |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 |
// This runner does not do any fuzzing, but allows us to run the fuzz target |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 |
// on the test corpus (e.g. "do_stuff_test_data") or on a single file, |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
9 |
// e.g. the one that comes from a bug report. |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 |
|
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 |
#include <cassert> |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 |
#include <fstream> |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 |
#include <iostream> |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 |
#include <vector> |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 |
|
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 |
// Forward declare the "fuzz target" interface. |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 |
// We deliberately keep this inteface simple and header-free. |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 |
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 |
|
43832
e137338e926b
fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents:
43831
diff
changeset
|
20 |
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv); |
e137338e926b
fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents:
43831
diff
changeset
|
21 |
|
43831
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 |
int main(int argc, char **argv) |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 |
{ |
43832
e137338e926b
fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents:
43831
diff
changeset
|
24 |
LLVMFuzzerInitialize(&argc, &argv); |
e137338e926b
fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents:
43831
diff
changeset
|
25 |
|
43831
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 |
for (int i = 1; i < argc; i++) { |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 |
std::ifstream in(argv[i]); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
28 |
in.seekg(0, in.end); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
29 |
size_t length = in.tellg(); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
30 |
in.seekg(0, in.beg); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 |
std::cout << "Reading " << length << " bytes from " << argv[i] |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
32 |
<< std::endl; |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 |
// Allocate exactly length bytes so that we reliably catch |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
34 |
// buffer overflows. |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 |
std::vector<char> bytes(length); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 |
in.read(bytes.data(), bytes.size()); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 |
assert(in); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 |
LLVMFuzzerTestOneInput( |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 |
reinterpret_cast<const uint8_t *>(bytes.data()), |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 |
bytes.size()); |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 |
std::cout << "Execution successful" << std::endl; |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 |
} |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 |
return 0; |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 |
} |
5a9e2ae9899b
fuzz: use a more standard approach to allow local builds of fuzzers
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
45 |
// no-check-code since this is from a third party |