xref: /openbsd-src/gnu/llvm/compiler-rt/lib/fuzzer/standalone/StandaloneFuzzTargetMain.c (revision 3cab2bb3f667058bece8e38b12449a63a9d73c4b)
1*3cab2bb3Spatrick /*===- StandaloneFuzzTargetMain.c - standalone main() for fuzz targets. ---===//
2*3cab2bb3Spatrick //
3*3cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*3cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3cab2bb3Spatrick //
7*3cab2bb3Spatrick //===----------------------------------------------------------------------===//
8*3cab2bb3Spatrick // This main() function can be linked to a fuzz target (i.e. a library
9*3cab2bb3Spatrick // that exports LLVMFuzzerTestOneInput() and possibly LLVMFuzzerInitialize())
10*3cab2bb3Spatrick // instead of libFuzzer. This main() function will not perform any fuzzing
11*3cab2bb3Spatrick // but will simply feed all input files one by one to the fuzz target.
12*3cab2bb3Spatrick //
13*3cab2bb3Spatrick // Use this file to provide reproducers for bugs when linking against libFuzzer
14*3cab2bb3Spatrick // or other fuzzing engine is undesirable.
15*3cab2bb3Spatrick //===----------------------------------------------------------------------===*/
16*3cab2bb3Spatrick #include <assert.h>
17*3cab2bb3Spatrick #include <stdio.h>
18*3cab2bb3Spatrick #include <stdlib.h>
19*3cab2bb3Spatrick 
20*3cab2bb3Spatrick extern int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size);
21*3cab2bb3Spatrick __attribute__((weak)) extern int LLVMFuzzerInitialize(int *argc, char ***argv);
main(int argc,char ** argv)22*3cab2bb3Spatrick int main(int argc, char **argv) {
23*3cab2bb3Spatrick   fprintf(stderr, "StandaloneFuzzTargetMain: running %d inputs\n", argc - 1);
24*3cab2bb3Spatrick   if (LLVMFuzzerInitialize)
25*3cab2bb3Spatrick     LLVMFuzzerInitialize(&argc, &argv);
26*3cab2bb3Spatrick   for (int i = 1; i < argc; i++) {
27*3cab2bb3Spatrick     fprintf(stderr, "Running: %s\n", argv[i]);
28*3cab2bb3Spatrick     FILE *f = fopen(argv[i], "r");
29*3cab2bb3Spatrick     assert(f);
30*3cab2bb3Spatrick     fseek(f, 0, SEEK_END);
31*3cab2bb3Spatrick     size_t len = ftell(f);
32*3cab2bb3Spatrick     fseek(f, 0, SEEK_SET);
33*3cab2bb3Spatrick     unsigned char *buf = (unsigned char*)malloc(len);
34*3cab2bb3Spatrick     size_t n_read = fread(buf, 1, len, f);
35*3cab2bb3Spatrick     fclose(f);
36*3cab2bb3Spatrick     assert(n_read == len);
37*3cab2bb3Spatrick     LLVMFuzzerTestOneInput(buf, len);
38*3cab2bb3Spatrick     free(buf);
39*3cab2bb3Spatrick     fprintf(stderr, "Done:    %s: (%zd bytes)\n", argv[i], n_read);
40*3cab2bb3Spatrick   }
41*3cab2bb3Spatrick }
42