brintos

brintos / llvm-project-archived public Read only

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