| # libFuzzer Integration Reference |
| |
| ## Additional Sanitizer Configuration |
| |
| ### MSan |
| |
| You need to [download prebuilt instrumented libraries](https://www.chromium.org/developers/testing/memorysanitizer#TOC-How-to-build-and-run) |
| to use MSan ([crbug/653712](https://bugs.chromium.org/p/chromium/issues/detail?id=653712)): |
| ```bash |
| GYP_DEFINES='use_goma=1 msan=1 use_prebuilt_instrumented_libraries=1' gclient runhooks |
| ``` |
| |
| ### UBSan |
| |
| By default, UBSan does not crash when undefined behavior is detected. |
| To make it crash, the following option needs to be set in environment: |
| ```bash |
| UBSAN_OPTIONS=halt_on_error=1 ./fuzzer <corpus_directory_or_single_testcase_path> |
| ``` |
| Other useful options are (also used by ClusterFuzz): |
| ```bash |
| UBSAN_OPTIONS=symbolize=1:halt_on_error=1:print_stacktrace=1 ./fuzzer <corpus_directory_or_single_testcase_path> |
| ``` |
| |
| ## Supported Platforms and Configurations |
| |
| ### Builder configurations |
| |
| The exact GN arguments that are used on our builders can be generated by |
| running: |
| |
| | Builder | Description | |
| |---------|-------------| |
| |Linux ASan | `tools/mb/mb.py gen -m chromium.fyi -b 'Libfuzzer Upload Linux ASan' out/Directory` | |
| |Linux ASan Debug | `tools/mb/mb.py gen -m chromium.fyi -b 'Libfuzzer Upload Linux ASan Debug' out/Directory` | |
| |Linux MSan \[[*](#MSan)\] | `tools/mb/mb.py gen -m chromium.fyi -b 'Libfuzzer Upload Linux MSan' out/Directory` | |
| |Linux UBSan \[[*](#UBSan)\]| `tools/mb/mb.py gen -m chromium.fyi -b 'Libfuzzer Upload Linux UBSan' out/Directory` | |
| |Mac ASan | `tools/mb/mb.py gen -m chromium.fyi -b 'Libfuzzer Upload Mac ASan' out/Directory` | |
| |
| |
| ### Linux |
| Linux is fully supported by libFuzzer and ClusterFuzz with following sanitizer |
| configurations: |
| |
| | GN Argument | Description | |
| |--------------|----| |
| | is_asan=true | enables [Address Sanitizer] to catch problems like buffer overruns. | |
| | is_msan=true | enables [Memory Sanitizer] to catch problems like uninitialized reads. \[[*](#MSan)\] | |
| | is_ubsan_security=true | enables [Undefined Behavior Sanitizer] to catch undefined behavior like integer overflow. \[[*](#UBSan)\] | |
| |
| Configuration example: |
| |
| ```bash |
| # With address sanitizer |
| gn gen out/libfuzzer '--args=use_libfuzzer=true is_asan=true enable_nacl=false' --check |
| ``` |
| |
| ### Mac |
| |
| Mac is supported by libFuzzer with `is_asan` configuration. |
| |
| Configuration example: |
| |
| ```bash |
| gn gen out/libfuzzer '--args=use_libfuzzer=true is_asan=true enable_nacl=false mac_deployment_target="10.7"' --check |
| ``` |
| |
| ## fuzzer_test GN Template |
| |
| Use `fuzzer_test` to define libFuzzer targets: |
| |
| ``` |
| fuzzer_test("my_fuzzer") { |
| ... |
| } |
| ``` |
| |
| Following arguments are supported: |
| |
| | Argument | Description | |
| |----------|-------------| |
| | `sources` | **required** list of fuzzer test source files | |
| | `deps` | fuzzer dependencies | |
| | `additional_configs` | additional GN configurations to be used for compilation | |
| | `dict` | a dictionary file for the fuzzer | |
| | `libfuzzer_options` | runtime options file for the fuzzer. See [Fuzzer Runtime Options](#Fuzzer-Runtime-Options) | |
| | `seed_corpus` | single directory containing test inputs, parsed recursively | |
| | `seed_corpuses` | multiple directories with the same purpose as `seed_corpus` | |
| |
| |
| ## Fuzzer Runtime Options |
| |
| There are many different runtime options supported by libFuzzer. Options |
| are passed as command line arguments: |
| |
| ``` |
| ./fuzzer [-flag1=val1 [-flag2=val2 ...] ] [dir1 [dir2 ...] ] |
| ``` |
| |
| Most common flags are: |
| |
| | Flag | Description | |
| |------|-------------| |
| | max_len | Maximum length of test input. | |
| | timeout | Timeout of seconds. Units slower than this value will be reported as bugs. | |
| |
| Full list of options can be found at [libFuzzer options] page and by running |
| the binary with `-help=1`. |
| |
| To specify these options for ClusterFuzz, list all parameters in |
| `libfuzzer_options` target attribute: |
| |
| ``` |
| fuzzer_test("my_fuzzer") { |
| ... |
| libfuzzer_options = [ |
| "max_len=2048", |
| "use_traces=1", |
| ] |
| } |
| ``` |
| |
| [libFuzzer options]: http://llvm.org/docs/LibFuzzer.html#options |
| [Address Sanitizer]: http://clang.llvm.org/docs/AddressSanitizer.html |
| [Memory Sanitizer]: http://clang.llvm.org/docs/MemorySanitizer.html |
| [Undefined Behavior Sanitizer]: http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html |
| |