blob: 30620e513963fe0768d193c85b86317e981f0c7d [file] [log] [blame]
Kostya Serebryany016852c2015-02-19 18:45:37 +00001//===- FuzzerInterface.h - Interface header for the Fuzzer ------*- C++ -* ===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9// Define the interface between the Fuzzer and the library being tested.
10//===----------------------------------------------------------------------===//
11
Kostya Serebryanyf3424592015-05-22 22:35:31 +000012// WARNING: keep the interface free of STL or any other header-based C++ lib,
13// to avoid bad interactions between the code used in the fuzzer and
14// the code used in the target function.
15
Kostya Serebryany016852c2015-02-19 18:45:37 +000016#ifndef LLVM_FUZZER_INTERFACE_H
17#define LLVM_FUZZER_INTERFACE_H
18
19#include <cstddef>
20#include <cstdint>
21
Kostya Serebryany22cc5e22016-02-13 02:29:38 +000022// Plain C interface. Should be sufficient for most uses.
23extern "C" {
24// The target function, mandatory.
25// Must return 0.
26int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
27// The initialization function, optional.
28int LLVMFuzzerInitialize(int *argc, char ***argv);
29// Custom mutator, optional.
30// Mutates raw data in [Data, Data+Size] inplace.
31// Returns the new size, which is not greater than MaxSize.
32// Given the same Seed produces the same mutation.
33size_t LLVMFuzzerCustomMutator(uint8_t *Data, size_t Size, size_t MaxSize,
34 unsigned int Seed);
35
36} // extern "C"
37
Kostya Serebryany016852c2015-02-19 18:45:37 +000038namespace fuzzer {
39
Kostya Serebryany20bb5e72015-10-02 23:34:06 +000040/// Returns an int 0. Values other than zero are reserved for future.
41typedef int (*UserCallback)(const uint8_t *Data, size_t Size);
Kostya Serebryanye0d60ba2015-05-23 02:12:05 +000042/** Simple C-like interface with a single user-supplied callback.
43
44Usage:
45
46#\code
Kostya Serebryanyf3424592015-05-22 22:35:31 +000047#include "FuzzerInterface.h"
48
Kostya Serebryany20bb5e72015-10-02 23:34:06 +000049int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
Kostya Serebryanyf3424592015-05-22 22:35:31 +000050 DoStuffWithData(Data, Size);
Kostya Serebryany20bb5e72015-10-02 23:34:06 +000051 return 0;
Kostya Serebryanyf3424592015-05-22 22:35:31 +000052}
53
Kostya Serebryanyaca76962016-01-16 01:23:12 +000054// Optional.
55// Define this only if you need to read/modify argc/argv at startup
56// and you are using libFuzzer's main().
57// Must return 0.
58int LLVMFuzzerInitialize(int *argc, char ***argv) {
59 ReadAndMaybeModify(argc, argv);
60 return 0;
61}
62
Kostya Serebryanyf3424592015-05-22 22:35:31 +000063// Implement your own main() or use the one from FuzzerMain.cpp.
Kostya Serebryanyecab57b2016-02-13 02:39:30 +000064// *NOT* recommended for most cases.
Kostya Serebryanyf3424592015-05-22 22:35:31 +000065int main(int argc, char **argv) {
66 InitializeMeIfNeeded();
67 return fuzzer::FuzzerDriver(argc, argv, LLVMFuzzerTestOneInput);
68}
Kostya Serebryanye0d60ba2015-05-23 02:12:05 +000069#\endcode
70*/
Kostya Serebryany016852c2015-02-19 18:45:37 +000071int FuzzerDriver(int argc, char **argv, UserCallback Callback);
72
Kostya Serebryany1deb0492016-02-13 06:24:18 +000073// Mutates raw data in [Data, Data+Size] inplace.
74// Returns the new size, which is not greater than MaxSize.
Kostya Serebryanyecab57b2016-02-13 02:39:30 +000075// Can be used inside the user-supplied LLVMFuzzerTestOneInput.
Kostya Serebryany1deb0492016-02-13 06:24:18 +000076size_t Mutate(uint8_t *Data, size_t Size, size_t MaxSize);
Kostya Serebryanyecab57b2016-02-13 02:39:30 +000077
Kostya Serebryany016852c2015-02-19 18:45:37 +000078} // namespace fuzzer
79
80#endif // LLVM_FUZZER_INTERFACE_H