|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 09/14] fuzz/x86_emulate: Take multiple test files for inputs
On Fri, Aug 25, 2017 at 05:43:38PM +0100, George Dunlap wrote:
> Finding aggregate coverage for a set of test files means running each
> afl-generated test case through the harness. At the moment, this is
> done by re-executing afl-harness-cov with each input file. When a
> large number of test cases have been generated, this can take a
> significant amonut of time; a recent test with 30k total files
> generated by 4 parallel fuzzers took over 7 minutes.
>
> The vast majority of this time is taken up with 'exec', however.
> Since the harness is already designed to loop over multiple inputs for
> llvm "persistent mode", just allow it to take a large number of inputs
> on the same when *not* running in llvm "persistent mode".. Then the
> command can be efficiently executed like this:
>
> ls */queue/id* | xargs $path/afl-harness-cov
>
> For the above-mentioned test on 30k files, the time to generate
> coverage data was reduced from 7 minutes to under 30 seconds.
>
> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx>
> ---
> CC: Ian Jackson <ian.jackson@xxxxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> tools/fuzz/README.afl | 7 +++++++
> tools/fuzz/x86_instruction_emulator/afl-harness.c | 23
> ++++++++++++++++-------
> 2 files changed, 23 insertions(+), 7 deletions(-)
>
> diff --git a/tools/fuzz/README.afl b/tools/fuzz/README.afl
> index 0d955b2687..e8c23d734c 100644
> --- a/tools/fuzz/README.afl
> +++ b/tools/fuzz/README.afl
> @@ -49,6 +49,13 @@ generate coverage data. To do this, use the target
> `afl-cov`:
>
> $ make afl-cov #produces afl-harness-cov
>
> +In order to speed up the process of checking total coverage,
> +`afl-harness-cov` can take several test inputs on its command-line;
> +the speed-up effect should be similar to that of using afl-clang-fast.
> +You can use xargs to do this most efficiently, like so:
> +
> + $ ls queue/id* | xargs $path/afl-harness-cov
> +
> NOTE: Please also note that the coverage instrumentation hard-codes
> the absolute path for the instrumentation read and write files in the
> binary; so coverage data will always show up in the build directory no
> diff --git a/tools/fuzz/x86_instruction_emulator/afl-harness.c
> b/tools/fuzz/x86_instruction_emulator/afl-harness.c
> index 51e0183356..79f8aec653 100644
> --- a/tools/fuzz/x86_instruction_emulator/afl-harness.c
> +++ b/tools/fuzz/x86_instruction_emulator/afl-harness.c
> @@ -16,6 +16,8 @@ int main(int argc, char **argv)
> {
> size_t size;
> FILE *fp = NULL;
> + int count = 0;
> + int max;
unsigned int.
>
> setbuf(stdin, NULL);
> setbuf(stdout, NULL);
> @@ -42,8 +44,7 @@ int main(int argc, char **argv)
> break;
>
> case '?':
> - usage:
> - printf("Usage: %s $FILE | [--min-input-size]\n", argv[0]);
> + printf("Usage: %s $FILE [$FILE...] | [--min-input-size]\n",
> argv[0]);
> exit(-1);
> break;
>
> @@ -54,21 +55,27 @@ int main(int argc, char **argv)
> }
> }
>
> - if ( optind == argc ) /* No positional parameters. Use stdin. */
> + max = argc - optind;
> +
> + if ( !max ) /* No positional parameters. Use stdin. */
> + {
> + max = 1;
> fp = stdin;
> - else if ( optind != (argc - 1) )
> - goto usage;
> + }
>
> if ( LLVMFuzzerInitialize(&argc, &argv) )
> exit(-1);
>
> #ifdef __AFL_HAVE_MANUAL_CONTROL
> while ( __AFL_LOOP(1000) )
> +#else
> + for( count = 0; count < max; count++ )
> #endif
> {
> if ( fp != stdin ) /* If not using stdin, open the provided file. */
> {
> - fp = fopen(argv[optind], "rb");
> + printf("Opening file %s\n", argv[optind]);
optind + count
> + fp = fopen(argv[optind + count], "rb");
> if ( fp == NULL )
> {
> perror("fopen");
> @@ -87,7 +94,9 @@ int main(int argc, char **argv)
> if ( !feof(fp) || size > INPUT_SIZE )
> {
> printf("Input too large\n");
> - exit(-1);
> + if ( optind + 1 == argc )
What is this for?
> + exit(-1);
> + continue;
> }
>
> if ( fp != stdin )
> --
> 2.14.1
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |