10b57cec5SDimitry Andric//===- FuzzerFlags.def - Run-time flags -------------------------*- C++ -* ===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// Flags. FUZZER_FLAG_INT/FUZZER_FLAG_STRING macros should be defined at the 90b57cec5SDimitry Andric// point of inclusion. We are not using any flag parsing library for better 100b57cec5SDimitry Andric// portability and independence. 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry AndricFUZZER_FLAG_INT(verbosity, 1, "Verbosity level.") 130b57cec5SDimitry AndricFUZZER_FLAG_UNSIGNED(seed, 0, "Random seed. If 0, seed is generated.") 140b57cec5SDimitry AndricFUZZER_FLAG_INT(runs, -1, 150b57cec5SDimitry Andric "Number of individual test runs (-1 for infinite runs).") 160b57cec5SDimitry AndricFUZZER_FLAG_INT(max_len, 0, "Maximum length of the test input. " 170b57cec5SDimitry Andric "If 0, libFuzzer tries to guess a good value based on the corpus " 180b57cec5SDimitry Andric "and reports it. ") 190b57cec5SDimitry AndricFUZZER_FLAG_INT(len_control, 100, "Try generating small inputs first, " 200b57cec5SDimitry Andric "then try larger inputs over time. Specifies the rate at which the length " 210b57cec5SDimitry Andric "limit is increased (smaller == faster). If 0, immediately try inputs with " 220b57cec5SDimitry Andric "size up to max_len. Default value is 0, if LLVMFuzzerCustomMutator is used.") 230b57cec5SDimitry AndricFUZZER_FLAG_STRING(seed_inputs, "A comma-separated list of input files " 240b57cec5SDimitry Andric "to use as an additional seed corpus. Alternatively, an \"@\" followed by " 255ffd83dbSDimitry Andric "the name of a file containing the comma-separated list.") 26e8d8bef9SDimitry AndricFUZZER_FLAG_INT(keep_seed, 0, "If 1, keep seed inputs in the corpus even if " 27e8d8bef9SDimitry Andric "they do not produce new coverage. When used with |reduce_inputs==1|, the " 28e8d8bef9SDimitry Andric "seed inputs will never be reduced. This option can be useful when seeds are" 29e8d8bef9SDimitry Andric "not properly formed for the fuzz target but still have useful snippets.") 300b57cec5SDimitry AndricFUZZER_FLAG_INT(cross_over, 1, "If 1, cross over inputs.") 31e8d8bef9SDimitry AndricFUZZER_FLAG_INT(cross_over_uniform_dist, 0, "Experimental. If 1, use a " 32e8d8bef9SDimitry Andric "uniform probability distribution when choosing inputs to cross over with. " 33e8d8bef9SDimitry Andric "Some of the inputs in the corpus may never get chosen for mutation " 34e8d8bef9SDimitry Andric "depending on the input mutation scheduling policy. With this flag, all " 35e8d8bef9SDimitry Andric "inputs, regardless of the input mutation scheduling policy, can be chosen " 36e8d8bef9SDimitry Andric "as an input to cross over with. This can be particularly useful with " 37e8d8bef9SDimitry Andric "|keep_seed==1|; all the initial seed inputs, even though they do not " 38e8d8bef9SDimitry Andric "increase coverage because they are not properly formed, will still be " 39e8d8bef9SDimitry Andric "chosen as an input to cross over with.") 40e8d8bef9SDimitry Andric 410b57cec5SDimitry AndricFUZZER_FLAG_INT(mutate_depth, 5, 420b57cec5SDimitry Andric "Apply this number of consecutive mutations to each input.") 430b57cec5SDimitry AndricFUZZER_FLAG_INT(reduce_depth, 0, "Experimental/internal. " 440b57cec5SDimitry Andric "Reduce depth if mutations lose unique features") 450b57cec5SDimitry AndricFUZZER_FLAG_INT(shuffle, 1, "Shuffle inputs at startup") 460b57cec5SDimitry AndricFUZZER_FLAG_INT(prefer_small, 1, 470b57cec5SDimitry Andric "If 1, always prefer smaller inputs during the corpus shuffle.") 480b57cec5SDimitry AndricFUZZER_FLAG_INT( 490b57cec5SDimitry Andric timeout, 1200, 500b57cec5SDimitry Andric "Timeout in seconds (if positive). " 510b57cec5SDimitry Andric "If one unit runs more than this number of seconds the process will abort.") 520b57cec5SDimitry AndricFUZZER_FLAG_INT(error_exitcode, 77, "When libFuzzer itself reports a bug " 530b57cec5SDimitry Andric "this exit code will be used.") 540b57cec5SDimitry AndricFUZZER_FLAG_INT(timeout_exitcode, 70, "When libFuzzer reports a timeout " 550b57cec5SDimitry Andric "this exit code will be used.") 560b57cec5SDimitry AndricFUZZER_FLAG_INT(max_total_time, 0, "If positive, indicates the maximal total " 570b57cec5SDimitry Andric "time in seconds to run the fuzzer.") 580b57cec5SDimitry AndricFUZZER_FLAG_INT(help, 0, "Print help.") 590b57cec5SDimitry AndricFUZZER_FLAG_INT(fork, 0, "Experimental mode where fuzzing happens " 600b57cec5SDimitry Andric "in a subprocess") 61*349cc55cSDimitry AndricFUZZER_FLAG_INT(fork_corpus_groups, 0, "For fork mode, enable the corpus-group " 62*349cc55cSDimitry Andric "strategy, The main corpus will be grouped according to size, " 63*349cc55cSDimitry Andric "and each sub-process will randomly select seeds from different " 64*349cc55cSDimitry Andric "groups as the sub-corpus.") 650b57cec5SDimitry AndricFUZZER_FLAG_INT(ignore_timeouts, 1, "Ignore timeouts in fork mode") 660b57cec5SDimitry AndricFUZZER_FLAG_INT(ignore_ooms, 1, "Ignore OOMs in fork mode") 670b57cec5SDimitry AndricFUZZER_FLAG_INT(ignore_crashes, 0, "Ignore crashes in fork mode") 680b57cec5SDimitry AndricFUZZER_FLAG_INT(merge, 0, "If 1, the 2-nd, 3-rd, etc corpora will be " 690b57cec5SDimitry Andric "merged into the 1-st corpus. Only interesting units will be taken. " 700b57cec5SDimitry Andric "This flag can be used to minimize a corpus.") 71*349cc55cSDimitry AndricFUZZER_FLAG_INT(set_cover_merge, 0, "If 1, the 2-nd, 3-rd, etc corpora will be " 72*349cc55cSDimitry Andric "merged into the 1-st corpus. Same as the 'merge' flag, but uses the " 73*349cc55cSDimitry Andric "standard greedy algorithm for the set cover problem to " 74*349cc55cSDimitry Andric "compute an approximation of the minimum set of testcases that " 75*349cc55cSDimitry Andric "provide the same coverage as the initial corpora") 760b57cec5SDimitry AndricFUZZER_FLAG_STRING(stop_file, "Stop fuzzing ASAP if this file exists") 770b57cec5SDimitry AndricFUZZER_FLAG_STRING(merge_inner, "internal flag") 780b57cec5SDimitry AndricFUZZER_FLAG_STRING(merge_control_file, 790b57cec5SDimitry Andric "Specify a control file used for the merge process. " 800b57cec5SDimitry Andric "If a merge process gets killed it tries to leave this file " 810b57cec5SDimitry Andric "in a state suitable for resuming the merge. " 82480093f4SDimitry Andric "By default a temporary file will be used." 83480093f4SDimitry Andric "The same file can be used for multistep merge process.") 840b57cec5SDimitry AndricFUZZER_FLAG_INT(minimize_crash, 0, "If 1, minimizes the provided" 850b57cec5SDimitry Andric " crash input. Use with -runs=N or -max_total_time=N to limit " 860b57cec5SDimitry Andric "the number attempts." 870b57cec5SDimitry Andric " Use with -exact_artifact_path to specify the output." 880b57cec5SDimitry Andric " Combine with ASAN_OPTIONS=dedup_token_length=3 (or similar) to ensure that" 890b57cec5SDimitry Andric " the minimized input triggers the same crash." 900b57cec5SDimitry Andric ) 910b57cec5SDimitry AndricFUZZER_FLAG_INT(cleanse_crash, 0, "If 1, tries to cleanse the provided" 920b57cec5SDimitry Andric " crash input to make it contain fewer original bytes." 930b57cec5SDimitry Andric " Use with -exact_artifact_path to specify the output." 940b57cec5SDimitry Andric ) 950b57cec5SDimitry AndricFUZZER_FLAG_INT(minimize_crash_internal_step, 0, "internal flag") 960b57cec5SDimitry AndricFUZZER_FLAG_STRING(features_dir, "internal flag. Used to dump feature sets on disk." 970b57cec5SDimitry Andric "Every time a new input is added to the corpus, a corresponding file in the features_dir" 980b57cec5SDimitry Andric " is created containing the unique features of that input." 990b57cec5SDimitry Andric " Features are stored in binary format.") 100e8d8bef9SDimitry AndricFUZZER_FLAG_STRING(mutation_graph_file, "Saves a graph (in DOT format) to" 101e8d8bef9SDimitry Andric " mutation_graph_file. The graph contains a vertex for each input that has" 102e8d8bef9SDimitry Andric " unique coverage; directed edges are provided between parents and children" 103e8d8bef9SDimitry Andric " where the child has unique coverage, and are recorded with the type of" 104e8d8bef9SDimitry Andric " mutation that caused the child.") 1050b57cec5SDimitry AndricFUZZER_FLAG_INT(use_counters, 1, "Use coverage counters") 1060b57cec5SDimitry AndricFUZZER_FLAG_INT(use_memmem, 1, 1070b57cec5SDimitry Andric "Use hints from intercepting memmem, strstr, etc") 1080b57cec5SDimitry AndricFUZZER_FLAG_INT(use_value_profile, 0, 1090b57cec5SDimitry Andric "Experimental. Use value profile to guide fuzzing.") 1100b57cec5SDimitry AndricFUZZER_FLAG_INT(use_cmp, 1, "Use CMP traces to guide mutations") 1110b57cec5SDimitry AndricFUZZER_FLAG_INT(shrink, 0, "Experimental. Try to shrink corpus inputs.") 1120b57cec5SDimitry AndricFUZZER_FLAG_INT(reduce_inputs, 1, 1130b57cec5SDimitry Andric "Try to reduce the size of inputs while preserving their full feature sets") 1140b57cec5SDimitry AndricFUZZER_FLAG_UNSIGNED(jobs, 0, "Number of jobs to run. If jobs >= 1 we spawn" 1150b57cec5SDimitry Andric " this number of jobs in separate worker processes" 1160b57cec5SDimitry Andric " with stdout/stderr redirected to fuzz-JOB.log.") 1170b57cec5SDimitry AndricFUZZER_FLAG_UNSIGNED(workers, 0, 1180b57cec5SDimitry Andric "Number of simultaneous worker processes to run the jobs." 1190b57cec5SDimitry Andric " If zero, \"min(jobs,NumberOfCpuCores()/2)\" is used.") 1200b57cec5SDimitry AndricFUZZER_FLAG_INT(reload, 1, 1210b57cec5SDimitry Andric "Reload the main corpus every <N> seconds to get new units" 1220b57cec5SDimitry Andric " discovered by other processes. If 0, disabled") 1230b57cec5SDimitry AndricFUZZER_FLAG_INT(report_slow_units, 10, 1240b57cec5SDimitry Andric "Report slowest units if they run for more than this number of seconds.") 1250b57cec5SDimitry AndricFUZZER_FLAG_INT(only_ascii, 0, 1260b57cec5SDimitry Andric "If 1, generate only ASCII (isprint+isspace) inputs.") 1270b57cec5SDimitry AndricFUZZER_FLAG_STRING(dict, "Experimental. Use the dictionary file.") 1280b57cec5SDimitry AndricFUZZER_FLAG_STRING(artifact_prefix, "Write fuzzing artifacts (crash, " 1290b57cec5SDimitry Andric "timeout, or slow inputs) as " 1300b57cec5SDimitry Andric "$(artifact_prefix)file") 1310b57cec5SDimitry AndricFUZZER_FLAG_STRING(exact_artifact_path, 1320b57cec5SDimitry Andric "Write the single artifact on failure (crash, timeout) " 1330b57cec5SDimitry Andric "as $(exact_artifact_path). This overrides -artifact_prefix " 1340b57cec5SDimitry Andric "and will not use checksum in the file name. Do not " 1350b57cec5SDimitry Andric "use the same path for several parallel processes.") 1360b57cec5SDimitry AndricFUZZER_FLAG_INT(print_pcs, 0, "If 1, print out newly covered PCs.") 1370b57cec5SDimitry AndricFUZZER_FLAG_INT(print_funcs, 2, "If >=1, print out at most this number of " 1380b57cec5SDimitry Andric "newly covered functions.") 1390b57cec5SDimitry AndricFUZZER_FLAG_INT(print_final_stats, 0, "If 1, print statistics at exit.") 1400b57cec5SDimitry AndricFUZZER_FLAG_INT(print_corpus_stats, 0, 1410b57cec5SDimitry Andric "If 1, print statistics on corpus elements at exit.") 1420b57cec5SDimitry AndricFUZZER_FLAG_INT(print_coverage, 0, "If 1, print coverage information as text" 1430b57cec5SDimitry Andric " at exit.") 144e8d8bef9SDimitry AndricFUZZER_FLAG_INT(print_full_coverage, 0, "If 1, print full coverage information " 145e8d8bef9SDimitry Andric "(all branches) as text at exit.") 1460b57cec5SDimitry AndricFUZZER_FLAG_INT(dump_coverage, 0, "Deprecated.") 1470b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_segv, 1, "If 1, try to intercept SIGSEGV.") 1480b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_bus, 1, "If 1, try to intercept SIGBUS.") 1490b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_abrt, 1, "If 1, try to intercept SIGABRT.") 1500b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_ill, 1, "If 1, try to intercept SIGILL.") 1510b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_fpe, 1, "If 1, try to intercept SIGFPE.") 1520b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_int, 1, "If 1, try to intercept SIGINT.") 1530b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_term, 1, "If 1, try to intercept SIGTERM.") 1540b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_xfsz, 1, "If 1, try to intercept SIGXFSZ.") 1550b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_usr1, 1, "If 1, try to intercept SIGUSR1.") 1560b57cec5SDimitry AndricFUZZER_FLAG_INT(handle_usr2, 1, "If 1, try to intercept SIGUSR2.") 157e8d8bef9SDimitry AndricFUZZER_FLAG_INT(handle_winexcept, 1, "If 1, try to intercept uncaught Windows " 158e8d8bef9SDimitry Andric "Visual C++ Exceptions.") 1590b57cec5SDimitry AndricFUZZER_FLAG_INT(close_fd_mask, 0, "If 1, close stdout at startup; " 1600b57cec5SDimitry Andric "if 2, close stderr; if 3, close both. " 1610b57cec5SDimitry Andric "Be careful, this will also close e.g. stderr of asan.") 1620b57cec5SDimitry AndricFUZZER_FLAG_INT(detect_leaks, 1, "If 1, and if LeakSanitizer is enabled " 1630b57cec5SDimitry Andric "try to detect memory leaks during fuzzing (i.e. not only at shut down).") 1640b57cec5SDimitry AndricFUZZER_FLAG_INT(purge_allocator_interval, 1, "Purge allocator caches and " 1650b57cec5SDimitry Andric "quarantines every <N> seconds. When rss_limit_mb is specified (>0), " 1660b57cec5SDimitry Andric "purging starts when RSS exceeds 50% of rss_limit_mb. Pass " 1670b57cec5SDimitry Andric "purge_allocator_interval=-1 to disable this functionality.") 1680b57cec5SDimitry AndricFUZZER_FLAG_INT(trace_malloc, 0, "If >= 1 will print all mallocs/frees. " 1690b57cec5SDimitry Andric "If >= 2 will also print stack traces.") 1700b57cec5SDimitry AndricFUZZER_FLAG_INT(rss_limit_mb, 2048, "If non-zero, the fuzzer will exit upon " 1710b57cec5SDimitry Andric "reaching this limit of RSS memory usage.") 1720b57cec5SDimitry AndricFUZZER_FLAG_INT(malloc_limit_mb, 0, "If non-zero, the fuzzer will exit " 1730b57cec5SDimitry Andric "if the target tries to allocate this number of Mb with one malloc call. " 1740b57cec5SDimitry Andric "If zero (default) same limit as rss_limit_mb is applied.") 1750b57cec5SDimitry AndricFUZZER_FLAG_STRING(exit_on_src_pos, "Exit if a newly found PC originates" 1760b57cec5SDimitry Andric " from the given source location. Example: -exit_on_src_pos=foo.cc:123. " 1770b57cec5SDimitry Andric "Used primarily for testing libFuzzer itself.") 1780b57cec5SDimitry AndricFUZZER_FLAG_STRING(exit_on_item, "Exit if an item with a given sha1 sum" 1790b57cec5SDimitry Andric " was added to the corpus. " 1800b57cec5SDimitry Andric "Used primarily for testing libFuzzer itself.") 1810b57cec5SDimitry AndricFUZZER_FLAG_INT(ignore_remaining_args, 0, "If 1, ignore all arguments passed " 1820b57cec5SDimitry Andric "after this one. Useful for fuzzers that need to do their own " 1830b57cec5SDimitry Andric "argument parsing.") 1840b57cec5SDimitry AndricFUZZER_FLAG_STRING(focus_function, "Experimental. " 1850b57cec5SDimitry Andric "Fuzzing will focus on inputs that trigger calls to this function. " 1860b57cec5SDimitry Andric "If -focus_function=auto and -data_flow_trace is used, libFuzzer " 187e8d8bef9SDimitry Andric "will choose the focus functions automatically. Disables -entropic when " 188e8d8bef9SDimitry Andric "specified.") 189e8d8bef9SDimitry AndricFUZZER_FLAG_INT(entropic, 1, "Enables entropic power schedule.") 1905ffd83dbSDimitry AndricFUZZER_FLAG_INT(entropic_feature_frequency_threshold, 0xFF, "Experimental. If " 1915ffd83dbSDimitry Andric "entropic is enabled, all features which are observed less often than " 1925ffd83dbSDimitry Andric "the specified value are considered as rare.") 1935ffd83dbSDimitry AndricFUZZER_FLAG_INT(entropic_number_of_rarest_features, 100, "Experimental. If " 1945ffd83dbSDimitry Andric "entropic is enabled, we keep track of the frequencies only for the " 1955ffd83dbSDimitry Andric "Top-X least abundant features (union features that are considered as " 1965ffd83dbSDimitry Andric "rare).") 197e8d8bef9SDimitry AndricFUZZER_FLAG_INT(entropic_scale_per_exec_time, 0, "Experimental. If 1, " 198e8d8bef9SDimitry Andric "the Entropic power schedule gets scaled based on the input execution " 199e8d8bef9SDimitry Andric "time. Inputs with lower execution time get scheduled more (up to 30x). " 200e8d8bef9SDimitry Andric "Note that, if 1, fuzzer stops from being deterministic even if a " 201e8d8bef9SDimitry Andric "non-zero random seed is given.") 2020b57cec5SDimitry Andric 2030b57cec5SDimitry AndricFUZZER_FLAG_INT(analyze_dict, 0, "Experimental") 2040b57cec5SDimitry AndricFUZZER_DEPRECATED_FLAG(use_clang_coverage) 2050b57cec5SDimitry AndricFUZZER_FLAG_STRING(data_flow_trace, "Experimental: use the data flow trace") 2060b57cec5SDimitry AndricFUZZER_FLAG_STRING(collect_data_flow, 2070b57cec5SDimitry Andric "Experimental: collect the data flow trace") 208e8d8bef9SDimitry Andric 209e8d8bef9SDimitry AndricFUZZER_FLAG_INT(create_missing_dirs, 0, "Automatically attempt to create " 210e8d8bef9SDimitry Andric "directories for arguments that would normally expect them to already " 211e8d8bef9SDimitry Andric "exist (i.e. artifact_prefix, exact_artifact_path, features_dir, corpus)") 212