v8/test/fuzzer
Manos Koukoutos 7981dc33d5 Reland "[wasm] Refactor initializer expression handling"
This is a reland of 071a1acf32

Changes compared to original:
Expect SIMD test to fail if SIMD is not supported.

Original change's description:
> [wasm] Refactor initializer expression handling
>
> Design doc: https://bit.ly/3xPxWUe
>
> This CL introduces two main changes:
> - Initializer expressions are now decoded by WasmFullDecoder. With
>   wasm-gc, initializer expressions are no longer just constants, and
>   require complex decoding (including stack tracking). This resulted in
>   extensive code duplication.
> - Initializer expressions are not stored explicitly by module-decoder as
>   an AST (WasmInitExpr), but rather as a WireBytesRef, and are decoded
>   again during module instantiation. This should reduce memory
>   consumption for globals and other module elements with initializer
>   expressions (which has been observed in the 40MB range in some
>   real-world benchmarks.
>
> Summary of changes:
> - Add a static parameter {kFunctionBody, kInitExpression} to the
>   WasmDecoder. Use it to specialize validation to function bodies/init.
>   expressions.
> - Introduce a new Interface for the WasmFullDecoder for init.
>   expressions.
> - Differentiate between constant and non-constant opcodes in
>   WasmFullDecoder.
> - Change representation of init. expressions in WasmModule to
>   WireBytesRef.
> - Reimplement EvaluateInitExpression in module-instantiate to re-decode
>   initializer expressions.
> - Remove some now-invalid module decoder tests.
>
> Pending changes:
> - Also refactor initializer expressions for element segment entries.
> - Reintroduce deleted tests.
>
> Bug: v8:11895
> Change-Id: I76512bfe1386c8338667d30fa6db93880a1e4b42
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2972910
> Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
> Commit-Queue: Manos Koukoutos <manoskouk@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#75476}

Bug: v8:11895
Change-Id: I2dface5ff28d5a2d439a65d3e5cb83135c061bb9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2997722
Commit-Queue: Manos Koukoutos <manoskouk@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#75492}
2021-06-30 21:33:46 +00:00
..
inspector [inspector] Handle isolate termination gracefully 2021-01-19 14:22:41 +00:00
json Add json fuzzer 2016-02-02 11:29:01 +00:00
multi_return [turbofan] Add fuzzer to test different signatures for multi-returns 2018-01-12 12:20:27 +00:00
parser Add a library suitable for libfuzzer with a small unit test runner shell 2016-01-26 10:39:03 +00:00
regexp [regexp] add fuzzer support for regexp parser and compiler. 2016-02-01 14:00:38 +00:00
regexp_builtins [regexp] Initial go at a builtins fuzzer 2018-01-18 11:02:57 +00:00
wasm [wasm] Install the exception constructor in InstallConditionalFeatures 2021-03-25 16:28:53 +00:00
wasm_async [wasm][fuzzer] Fix return value of interpreter 2020-08-13 10:08:53 +00:00
wasm_code [wasm] Create a new fuzzer for wasm code. 2016-08-29 13:56:00 +00:00
wasm_compile [wasm] Syntax- and Type-aware Fuzzer 2017-02-17 17:06:29 +00:00
BUILD.gn [no-wasm] Exclude more targets from build 2021-03-09 11:25:54 +00:00
DEPS Add a library suitable for libfuzzer with a small unit test runner shell 2016-01-26 10:39:03 +00:00
fuzzer-support.cc [wasm] Make --wasm-trap-handler a d8-only flag 2021-06-30 09:32:55 +00:00
fuzzer-support.h [iwyu] Add missing includes of <memory> for std::unique_ptr 2019-09-13 17:13:36 +00:00
fuzzer.cc [test/fuzzer] Fix cpplint complaints 2017-09-04 10:45:21 +00:00
fuzzer.status [test] Filter tests for third party heap 2021-04-27 10:17:33 +00:00
inspector-fuzzer.cc [base] Move utils/vector.h to base/vector.h 2021-06-18 13:33:13 +00:00
json.cc [fuzzer] Fix OOM in v8_json_parser_fuzzer due to unnecessary long input. 2018-07-17 14:25:27 +00:00
multi-return.cc [isolate][cleanup] Remove pointer to WasmEngine 2021-06-21 09:09:25 +00:00
parser.cc [base] Move utils/vector.h to base/vector.h 2021-06-18 13:33:13 +00:00
README.md [gyp] move build targets for tests to gypfiles. 2018-01-30 06:31:00 +00:00
regexp-builtins.cc [regexp] Implement the /d flag for RegExp indices 2021-01-26 04:14:10 +00:00
regexp.cc Reland "[base] Move most of src/numbers into base" 2021-06-24 15:00:27 +00:00
testcfg.py [inspector][fuzzer] Add inspector fuzzer 2020-11-02 14:29:08 +00:00
wasm_corpus.tar.gz.sha1 [wasm] Update and run script to generate fuzzer corpus 2020-12-01 16:21:51 +00:00
wasm-async.cc [isolate][cleanup] Remove pointer to WasmEngine 2021-06-21 09:09:25 +00:00
wasm-code.cc [base] Move utils/vector.h to base/vector.h 2021-06-18 13:33:13 +00:00
wasm-compile.cc [base] Move utils/vector.h to base/vector.h 2021-06-18 13:33:13 +00:00
wasm-fuzzer-common.cc Reland "[wasm] Refactor initializer expression handling" 2021-06-30 21:33:46 +00:00
wasm-fuzzer-common.h [base] Move utils/vector.h to base/vector.h 2021-06-18 13:33:13 +00:00
wasm.cc [isolate][cleanup] Remove pointer to WasmEngine 2021-06-21 09:09:25 +00:00

How to make a libFuzzer fuzzer in V8

This document describes how to make a new libFuzzer fuzzer for V8. A general introduction to libFuzzer can be found here. In short, libFuzzer is an in-process coverage-driven evolutionary fuzzer. libFuzzer serves you with a sequence of byte arrays that you can use to test your code. libFuzzer tries to generate this sequence of byte arrays in a way that maximizes test coverage.

Warning: By itself libFuzzer typically does not generate valid JavaScript code.

Changes to V8

tldr: Do the same as https://codereview.chromium.org/2280623002 to introduce a new fuzzer to V8.

This is a step by step guide on how to make a new fuzzer in V8. In the example the fuzzer is called foo.

  1. Copy one of the existing fuzzer implementations in test/fuzzer/, e.g. cp wasm.cc foo.cc

    • Copying an existing fuzzer is a good idea to get all the required setup, e.g. setting up the isolate
  2. Create a directory called foo in test/fuzzer/ which contains at least one file

    • The file is used by the trybots to check whether the fuzzer actually compiles and runs
  3. Copy the build rules of an existing fuzzer in BUILD.gn, e.g. the build rules for the wasm.cc fuzzer are v8_source_set("wasm_fuzzer") and v8_fuzzer("wasm_fuzzer"). Note that the name has to be the name of the directory created in Step 2 + _fuzzer so that the scripts on the trybots work

  4. Now you can already compile the fuzzer, e.g. with ninja -j 1000 -C out/x64.debug/v8_simple_foo_fuzzer

    • Use this binary to reproduce issues found by cluster fuzz, e.g. out/x64.debug/v8_simple_foo_fuzzer testcase.foo
  5. Copy the binary name and the test directory name in test/fuzzer/fuzzer.isolate

  6. Add the fuzzer to the FuzzerTestSuite in test/fuzzer/testcfg.py

    • This step is needed to run the fuzzer with the files created in Step 2 on the trybots
  7. Commit the changes described above to the V8 repository

Changes to Chromium

tldr: Do the same as https://codereview.chromium.org/2344823002 to add the new fuzzer to cluster fuzz.

  1. Copy the build rules of an existing fuzzer in testing/libfuzzer/fuzzers/BUILD.gn, e.g. the build rule for the wasm.cc fuzzer is v8_wasm_fuzzer. There is no need to set a dictionary , or a seed_corpus. See chromium-fuzzing-getting-started for more information.

  2. Compile the fuzzer in chromium (for different configurations see: https://chromium.googlesource.com/chromium/src/+/master/testing/libfuzzer/reference.md):

    • gn gen out/libfuzzer '--args=use_libfuzzer=true is_asan=true is_debug=false enable_nacl=false'

    • ninja -j 1000 -C out/libfuzzer/ v8_foo_fuzzer

  3. Run the fuzzer locally

    • mkdir /tmp/empty_corpus && out/libfuzzer/v8_foo_fuzzer /tmp/empty_corpus