v8/test/fuzzer
Martin Bidlingmaier 5720d2056c [regexp] Add 'l' flag to force experimental engine
This commit adds the 'l' (linear) RegExp flag (as in e.g. /asdf|123/l)
that forces execution in linear time.  These regexps are handled by the
experimental engine.  If the experimental engine cannot handle the
pattern, an exception is thrown on creation of the regexp.

The commit also adds a new global V8 flag and changes an existing one:
* --enable-experimental-engine, which turns on recognition of the RegExp
  'l' flag.  Previously this flag also caused all supported regexps to
  be executed by the experimental engine; this is not the case anymore.
* --default-to-experimental-regexp-engine takes over the previous
  semantics of --enable-experimental-regexp-engine:  We execute all
  supported regexps with the experimental engine.

Cq-Include-Trybots: luci.v8.try:v8_linux64_fyi_rel_ng
Bug: v8:10765
Change-Id: I5622a89b19404105e8be280d454e9fdd63c003b3
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2461244
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Reviewed-by: Simon Zünd <szuend@chromium.org>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Commit-Queue: Martin Bidlingmaier <mbid@google.com>
Cr-Commit-Position: refs/heads/master@{#70892}
2020-10-30 08:33:06 +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
regexp
regexp_builtins [regexp] Initial go at a builtins fuzzer 2018-01-18 11:02:57 +00:00
wasm [wasm][fuzzer] Support functions returning i64 2020-09-15 17:23:22 +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 [fuzzer] Remove the wasm section fuzzers 2019-01-11 15:18:47 +00:00
DEPS
fuzzer-support.cc [wasm][fuzzer] Enable trap handlers only once 2020-09-01 12:03:59 +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 Reland "[wasm][fuzzer] Fix exception detection" 2020-08-18 09:00:05 +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 Reland "Reland "[deoptimizer] Change deopt entries into builtins"" 2020-10-21 06:01:38 +00:00
parser.cc [compiler] Fix double error reporting for parser errors 2020-06-10 08:36:41 +00:00
README.md [gyp] move build targets for tests to gypfiles. 2018-01-30 06:31:00 +00:00
regexp-builtins.cc [regexp] Add 'l' flag to force experimental engine 2020-10-30 08:33:06 +00:00
regexp.cc [regexp] Further narrow public API and restrict includes to regexp.h 2019-06-18 12:23:16 +00:00
testcfg.py [test] don't filter out the fuzzer tests 2020-08-04 19:50:28 +00:00
wasm_corpus.tar.gz.sha1 [wasm] Move the wasm fuzzer corpus to a different directory 2017-04-28 23:29:41 +00:00
wasm-async.cc [wasm][fuzzer] Fix data race when setting flags 2020-10-05 16:31:11 +00:00
wasm-code.cc [wasm] Move interpreter to test directory 2020-06-23 08:48:14 +00:00
wasm-compile.cc [wasm-simd][fuzzer] Add v128 load32_zero and load64_zero to fuzzer 2020-10-27 23:26:51 +00:00
wasm-fuzzer-common.cc [wasm][fuzzer] Fix data race when setting flags 2020-10-05 16:31:11 +00:00
wasm-fuzzer-common.h [wasm][fuzzer] Fix data race when setting flags 2020-10-05 16:31:11 +00:00
wasm.cc [wasm][fuzzer] Fix data race when setting flags 2020-10-05 16:31:11 +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