[llvm] r303125 - [libFuzzer] improve the afl driver and it's tests. Make it possible to run individual inputs with afl driver
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Mon May 15 16:18:01 PDT 2017
fixed already in r303128.
On Mon, May 15, 2017 at 4:14 PM, Vitaly Buka <vitalybuka at google.com> wrote:
> Breaks Windows bot http://lab.llvm.org:8011/builders/sanitizer-windows/
> builds/11357/steps/run%20fuzzer%20tests/logs/stdio
>
> On Mon, May 15, 2017 at 3:51 PM Kostya Serebryany via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: kcc
>> Date: Mon May 15 17:38:29 2017
>> New Revision: 303125
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=303125&view=rev
>> Log:
>> [libFuzzer] improve the afl driver and it's tests. Make it possible to
>> run individual inputs with afl driver
>>
>> Added:
>> llvm/trunk/lib/Fuzzer/test/afl-driver.test
>> Modified:
>> llvm/trunk/lib/Fuzzer/afl/afl_driver.cpp
>> llvm/trunk/lib/Fuzzer/test/AFLDriverTest.cpp
>>
>> Modified: llvm/trunk/lib/Fuzzer/afl/afl_driver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/
>> afl/afl_driver.cpp?rev=303125&r1=303124&r2=303125&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Fuzzer/afl/afl_driver.cpp (original)
>> +++ llvm/trunk/lib/Fuzzer/afl/afl_driver.cpp Mon May 15 17:38:29 2017
>> @@ -59,6 +59,11 @@ statistics from the file. If that fails
>> #include <signal.h>
>> #include <sys/resource.h>
>> #include <sys/time.h>
>> +
>> +#include <iostream>
>> +#include <fstream>
>> +#include <vector>
>> +
>> // Platform detection. Copied from FuzzerInternal.h
>> #ifdef __linux__
>> #define LIBFUZZER_LINUX 1
>> @@ -245,17 +250,39 @@ extern "C" size_t LLVMFuzzerMutate(uint8
>> return 0;
>> }
>>
>> +// Execute any files provided as parameters.
>> +int ExecuteFilesOnyByOne(int argc, char **argv) {
>> + for (int i = 1; i < argc; i++) {
>> + std::ifstream in(argv[i]);
>> + in.seekg(0, in.end);
>> + size_t length = in.tellg();
>> + in.seekg (0, in.beg);
>> + std::cout << "Reading " << length << " bytes from " << argv[i] <<
>> std::endl;
>> + // Allocate exactly length bytes so that we reliably catch buffer
>> overflows.
>> + std::vector<char> bytes(length);
>> + in.read(bytes.data(), bytes.size());
>> + assert(in);
>> + LLVMFuzzerTestOneInput(reinterpret_cast<const uint8_t
>> *>(bytes.data()),
>> + bytes.size());
>> + std::cout << "Execution successfull" << std::endl;
>> + }
>> + return 0;
>> +}
>> +
>> int main(int argc, char **argv) {
>> - fprintf(stderr, "======================= INFO
>> =========================\n"
>> - "This binary is built for AFL-fuzz.\n"
>> - "To run the target function on a single input execute
>> this:\n"
>> - " %s < INPUT_FILE\n"
>> - "To run the fuzzing execute this:\n"
>> - " afl-fuzz [afl-flags] %s [N] "
>> - "-- run N fuzzing iterations before "
>> - "re-spawning the process (default: 1000)\n"
>> - "=============================
>> =========================\n",
>> - argv[0], argv[0]);
>> + fprintf(stderr,
>> + "======================= INFO =========================\n"
>> + "This binary is built for AFL-fuzz.\n"
>> + "To run the target function on individual input(s) execute this:\n"
>> + " %s < INPUT_FILE\n"
>> + "or\n"
>> + " %s INPUT_FILE1 [INPUT_FILE2 ... ]\n"
>> + "To fuzz with afl-fuzz execute this:\n"
>> + " afl-fuzz [afl-flags] %s [-N]\n"
>> + "afl-fuzz will run N iterations before "
>> + "re-spawning the process (default: 1000)\n"
>> + "======================================================\n",
>> + argv[0], argv[0], argv[0]);
>> if (LLVMFuzzerInitialize)
>> LLVMFuzzerInitialize(&argc, &argv);
>> // Do any other expensive one-time initialization here.
>> @@ -266,8 +293,14 @@ int main(int argc, char **argv) {
>> __afl_manual_init();
>>
>> int N = 1000;
>> - if (argc >= 2)
>> - N = atoi(argv[1]);
>> + if (argc == 2 && argv[1][0] == '-')
>> + N = atoi(argv[1] + 1);
>> + else if(argc == 2 && (N = atoi(argv[1])) > 0)
>> + fprintf(stderr, "WARNING: using the deprecated call style `%s
>> %d`\n",
>> + argv[0], N);
>> + else if (argc > 1)
>> + return ExecuteFilesOnyByOne(argc, argv);
>> +
>> assert(N > 0);
>> time_t unit_time_secs;
>> int num_runs = 0;
>>
>> Modified: llvm/trunk/lib/Fuzzer/test/AFLDriverTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/
>> test/AFLDriverTest.cpp?rev=303125&r1=303124&r2=303125&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Fuzzer/test/AFLDriverTest.cpp (original)
>> +++ llvm/trunk/lib/Fuzzer/test/AFLDriverTest.cpp Mon May 15 17:38:29 2017
>> @@ -4,19 +4,25 @@
>> // Contains dummy functions used to avoid dependency on AFL.
>> #include <stdint.h>
>> #include <stdlib.h>
>> +#include <stdio.h>
>>
>> extern "C" void __afl_manual_init() {}
>>
>> -extern "C" int __afl_persistent_loop(unsigned int) {
>> +extern "C" int __afl_persistent_loop(unsigned int N) {
>> + static int Count = N;
>> + fprintf(stderr, "__afl_persistent_loop calle, Count = %d\n", Count);
>> + if (Count--) return 1;
>> return 0;
>> }
>>
>> // This declaration exists to prevent the Darwin linker
>> // from complaining about this being a missing weak symbol.
>> extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) {
>> + fprintf(stderr, "LLVMFuzzerInitialize called\n");
>> return 0;
>> }
>>
>> extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
>> + fprintf(stderr, "LLVMFuzzerTestOneInput called; Size = %zd\n", Size);
>> return 0;
>> }
>>
>> Added: llvm/trunk/lib/Fuzzer/test/afl-driver.test
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/
>> test/afl-driver.test?rev=303125&view=auto
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Fuzzer/test/afl-driver.test (added)
>> +++ llvm/trunk/lib/Fuzzer/test/afl-driver.test Mon May 15 17:38:29 2017
>> @@ -0,0 +1,25 @@
>> +RUN: echo -n "abc" > %t.file3
>> +RUN: echo -n "abcd" > %t.file4
>> +
>> +RUN: AFLDriverTest < %t.file3 2>&1 | FileCheck %s --check-prefix=CHECK1
>> +CHECK1: __afl_persistent_loop calle, Count = 1000
>> +CHECK1: LLVMFuzzerTestOneInput called; Size = 3
>> +
>> +
>> +RUN: AFLDriverTest < %t.file3 -42 2>&1 | FileCheck %s
>> --check-prefix=CHECK2
>> +CHECK2: __afl_persistent_loop calle, Count = 42
>> +CHECK2: LLVMFuzzerTestOneInput called; Size = 3
>> +
>> +
>> +RUN: AFLDriverTest < %t.file3 666 2>&1 | FileCheck %s
>> --check-prefix=CHECK3
>> +CHECK3: WARNING: using the deprecated call style
>> +CHECK3: __afl_persistent_loop calle, Count = 666
>> +CHECK3: LLVMFuzzerTestOneInput called; Size = 3
>> +
>> +
>> +RUN: AFLDriverTest %t.file3 2>&1 | FileCheck %s --check-prefix=CHECK4
>> +CHECK4: LLVMFuzzerTestOneInput called; Size = 3
>> +
>> +RUN: AFLDriverTest %t.file3 %t.file4 2>&1 | FileCheck %s
>> --check-prefix=CHECK5
>> +CHECK5: LLVMFuzzerTestOneInput called; Size = 3
>> +CHECK5: LLVMFuzzerTestOneInput called; Size = 4
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170515/10960cb7/attachment.html>
More information about the llvm-commits
mailing list