contrib/fuzz/standalone_fuzz_target_runner.cc
author Pierre-Yves David <pierre-yves.david@octobus.net>
Fri, 21 Jan 2022 15:44:15 +0100
changeset 48619 e5313a1e0a26
parent 43814 e137338e926b
permissions -rw-r--r--
test-http-bad-server: move on test from bytes-count to pattern This specific test case is now using the new "close when a pattern is seen" approach compared to the more fragile "that many bytes were sent" approach. Since such change are still a bit noisy, we split each change in there own changesets. Differential Revision: https://phab.mercurial-scm.org/D12050
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43813
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
43814
e137338e926b fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents: 43813
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: 43813
diff changeset
    21
43813
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
{
43814
e137338e926b fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents: 43813
diff changeset
    24
	LLVMFuzzerInitialize(&argc, &argv);
e137338e926b fuzz: make standalone_fuzz_target_runner call LLVMFuzzerInitialize
Augie Fackler <augie@google.com>
parents: 43813
diff changeset
    25
43813
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