|  | # 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 | 
|  |  |