1 # Copyright 2023 The Chromium Authors
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 # This file is a partial translation of
6 # //third_party/fuzztest/src/centipede/BUILD
7 # into BUILD.gn format.
9 # It contains support for both:
10 # - centipede, a way of building and running Chromium's existing fuzzing
11 # targets using an out-of-process runner.
12 # - fuzztest, a way of building new fuzzing targets using simpler macros.
14 import("//build/config/sanitizers/sanitizers.gni")
16 config("fuzztest_internal_config") {
18 "-Wno-sign-compare", # https://github.com/google/centipede/issues/487,
19 "-Wno-unused-private-field",
20 "-Wno-unreachable-code-return",
21 "-Wno-unused-but-set-variable",
23 "-Wno-unused-const-variable",
24 "-Wno-unused-function",
27 # int_utils.h depends on an SSE 4.2 intrinsic.
28 if (current_cpu == "x64") {
29 cflags += [ "-msse4.2" ]
31 include_dirs = [ "src" ]
33 defines = [ "FUZZTEST_USE_CENTIPEDE" ]
34 } else if (use_fuzzing_engine) {
35 defines = [ "FUZZTEST_COMPATIBILITY_MODE" ]
40 source_set("centipede_common") {
42 "src/centipede/binary_info.cc",
43 "src/centipede/binary_info.h",
44 "src/centipede/byte_array_mutator.cc",
45 "src/centipede/byte_array_mutator.h",
46 "src/centipede/defs.h",
47 "src/centipede/execution_metadata.cc",
48 "src/centipede/execution_metadata.h",
49 "src/centipede/feature.cc",
50 "src/centipede/feature.h",
51 "src/centipede/knobs.cc",
52 "src/centipede/knobs.h",
53 "src/centipede/pc_info.cc",
54 "src/centipede/pc_info.h",
55 "src/centipede/reverse_pc_table.h",
56 "src/centipede/runner_cmp_trace.h",
57 "src/centipede/runner_request.cc",
58 "src/centipede/runner_request.h",
59 "src/centipede/runner_result.cc",
60 "src/centipede/runner_result.h",
61 "src/centipede/shared_memory_blob_sequence.cc",
62 "src/centipede/shared_memory_blob_sequence.h",
65 "//third_party/abseil-cpp:absl",
66 "//third_party/abseil-cpp/absl/log:check",
67 "//third_party/abseil-cpp/absl/log:log",
69 configs += [ ":fuzztest_internal_config" ]
70 configs -= fuzzing_engine_remove_configs
71 configs += fuzzing_engine_add_configs
74 source_set("centipede_runner_no_main") {
76 "src/centipede/runner.cc",
77 "src/centipede/runner.h",
78 "src/centipede/runner_dl_info.cc",
79 "src/centipede/runner_dl_info.h",
80 "src/centipede/runner_fork_server.cc",
81 "src/centipede/runner_interceptors.cc",
82 "src/centipede/runner_interface.h",
83 "src/centipede/runner_sancov.cc",
84 "src/centipede/runner_sancov_object.cc",
85 "src/centipede/runner_sancov_object.h",
86 "src/centipede/runner_sanitizer.cc",
87 "src/centipede/runner_utils.cc",
88 "src/centipede/runner_utils.h",
93 "//third_party/abseil-cpp:absl",
94 "//third_party/abseil-cpp/absl/log:log",
96 configs += [ ":fuzztest_internal_config" ]
97 configs -= fuzzing_engine_remove_configs
98 configs += fuzzing_engine_add_configs
100 # sancov symbols need to be exported for centipede to work correctly with
102 configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
103 configs += [ "//build/config/gcc:symbol_visibility_default" ]
106 source_set("centipede_runner_main") {
108 ":centipede_runner_no_main",
109 "//third_party/abseil-cpp:absl",
111 configs += [ ":fuzztest_internal_config" ]
112 sources = [ "src/centipede/runner_main.cc" ]
115 source_set("centipede_weak_sancov_stubs") {
116 sources = [ "src/centipede/weak_sancov_stubs.cc" ]
119 # The centipede out-of-process runner executable.
120 executable("centipede") {
121 configs += [ ":fuzztest_internal_config" ]
122 configs -= fuzzing_engine_remove_configs
123 configs += fuzzing_engine_add_configs
124 include_dirs = [ "src" ]
128 ":fuzztest_internal",
130 # Depend on fuzzing_engine so that we are automatically built in builds
131 # destined for ClusterFuzz.
132 "//testing/libfuzzer:fuzzing_engine",
133 "//third_party/abseil-cpp:absl",
134 "//third_party/abseil-cpp/absl/flags:config",
135 "//third_party/abseil-cpp/absl/flags:flag",
136 "//third_party/abseil-cpp/absl/flags:parse",
137 "//third_party/abseil-cpp/absl/flags:reflection",
138 "//third_party/abseil-cpp/absl/log",
139 "//third_party/abseil-cpp/absl/log:check",
140 "//third_party/abseil-cpp/absl/log:globals",
141 "//third_party/abseil-cpp/absl/log:initialize",
142 "//third_party/boringssl",
145 "src/centipede/analyze_corpora.cc",
146 "src/centipede/blob_file.cc",
147 "src/centipede/call_graph.cc",
148 "src/centipede/centipede.cc",
149 "src/centipede/centipede_callbacks.cc",
150 "src/centipede/centipede_default_callbacks.cc",
151 "src/centipede/centipede_interface.cc",
152 "src/centipede/centipede_main.cc",
153 "src/centipede/command.cc",
154 "src/centipede/config_file.cc",
155 "src/centipede/config_init.cc",
156 "src/centipede/config_util.cc",
157 "src/centipede/control_flow.cc",
158 "src/centipede/corpus.cc",
159 "src/centipede/coverage.cc",
160 "src/centipede/distill.cc",
161 "src/centipede/distill.h",
162 "src/centipede/environment.cc",
163 "src/centipede/environment_flags.cc",
164 "src/centipede/environment_flags.h",
165 "src/centipede/feature_set.cc",
166 "src/centipede/feature_set.h",
167 "src/centipede/fuzztest_mutator.cc",
168 "src/centipede/fuzztest_mutator.h",
169 "src/centipede/hash.cc",
170 "src/centipede/logging.cc",
171 "src/centipede/logging.h",
172 "src/centipede/minimize_crash.cc",
173 "src/centipede/remote_file.cc",
174 "src/centipede/rusage_profiler.cc",
175 "src/centipede/rusage_stats.cc",
176 "src/centipede/shard_reader.cc",
177 "src/centipede/stats.cc",
178 "src/centipede/symbol_table.cc",
179 "src/centipede/util.cc",
180 "src/centipede/workdir.cc",
181 "src/centipede/workdir.h",
186 source_set("fuzztest_internal") {
188 "src/fuzztest/domain.h",
189 "src/fuzztest/domain_core.h",
190 "src/fuzztest/fuzztest.cc",
191 "src/fuzztest/fuzztest.h",
192 "src/fuzztest/googletest_fixture_adapter.h",
193 "src/fuzztest/init_fuzztest.cc",
194 "src/fuzztest/init_fuzztest.h",
195 "src/fuzztest/internal/any.h",
196 "src/fuzztest/internal/centipede_adaptor.h",
197 "src/fuzztest/internal/compatibility_mode.cc",
198 "src/fuzztest/internal/compatibility_mode.h",
199 "src/fuzztest/internal/coverage.cc",
200 "src/fuzztest/internal/coverage.h",
201 "src/fuzztest/internal/domains/absl_helpers.h",
202 "src/fuzztest/internal/domains/aggregate_of_impl.h",
203 "src/fuzztest/internal/domains/arbitrary_impl.h",
204 "src/fuzztest/internal/domains/bit_flag_combination_of_impl.h",
205 "src/fuzztest/internal/domains/container_mutation_helpers.h",
206 "src/fuzztest/internal/domains/container_of_impl.h",
207 "src/fuzztest/internal/domains/domain_base.h",
208 "src/fuzztest/internal/domains/element_of_impl.h",
209 "src/fuzztest/internal/domains/filter_impl.h",
210 "src/fuzztest/internal/domains/flat_map_impl.h",
211 "src/fuzztest/internal/domains/in_grammar_impl.cc",
212 "src/fuzztest/internal/domains/in_grammar_impl.h",
213 "src/fuzztest/internal/domains/in_range_impl.h",
214 "src/fuzztest/internal/domains/in_regexp_impl.h",
215 "src/fuzztest/internal/domains/map_impl.h",
216 "src/fuzztest/internal/domains/one_of_impl.h",
217 "src/fuzztest/internal/domains/optional_of_impl.h",
218 "src/fuzztest/internal/domains/protobuf_domain_impl.h",
219 "src/fuzztest/internal/domains/regexp_dfa.cc",
220 "src/fuzztest/internal/domains/regexp_dfa.h",
221 "src/fuzztest/internal/domains/serialization_helpers.h",
222 "src/fuzztest/internal/domains/smart_pointer_of_impl.h",
223 "src/fuzztest/internal/domains/unique_elements_container_of_impl.h",
224 "src/fuzztest/internal/domains/value_mutation_helpers.h",
225 "src/fuzztest/internal/domains/variant_of_impl.h",
226 "src/fuzztest/internal/fixture_driver.cc",
227 "src/fuzztest/internal/fixture_driver.h",
228 "src/fuzztest/internal/googletest_adaptor.cc",
229 "src/fuzztest/internal/googletest_adaptor.h",
230 "src/fuzztest/internal/io.cc",
231 "src/fuzztest/internal/io.h",
232 "src/fuzztest/internal/logging.cc",
233 "src/fuzztest/internal/logging.h",
234 "src/fuzztest/internal/meta.h",
235 "src/fuzztest/internal/registration.h",
236 "src/fuzztest/internal/registry.cc",
237 "src/fuzztest/internal/registry.h",
238 "src/fuzztest/internal/runtime.cc",
239 "src/fuzztest/internal/runtime.h",
240 "src/fuzztest/internal/seed_seq.cc",
241 "src/fuzztest/internal/seed_seq.h",
242 "src/fuzztest/internal/serialization.cc",
243 "src/fuzztest/internal/serialization.h",
244 "src/fuzztest/internal/status.cc",
245 "src/fuzztest/internal/status.h",
246 "src/fuzztest/internal/subprocess.cc",
247 "src/fuzztest/internal/subprocess.h",
248 "src/fuzztest/internal/table_of_recent_compares.h",
249 "src/fuzztest/internal/type_support.cc",
250 "src/fuzztest/internal/type_support.h",
258 # Depends transitively on fuzzing_engine so that we are automatically built in builds
259 # destined for ClusterFuzz.
260 "//testing/libfuzzer:fuzzing_engine",
261 "//third_party/abseil-cpp/absl/flags:flag",
262 "//third_party/abseil-cpp/absl/random:bit_gen_ref",
266 "//third_party/abseil-cpp:absl",
268 # For RE2 mutators. It's questionable whether we want to pull this library
269 # into every fuzztest target, but this is the approach used in other
270 # fuzztest contexts so we'll do the same
274 public_configs = [ ":fuzztest_internal_config" ]
275 configs -= fuzzing_engine_remove_configs
276 configs += fuzzing_engine_add_configs
279 # Fuzztest support. This allows regular test executables to contain
280 # a FUZZ_TEST. Such tests/executables should depend directly on this target;
281 # at this time there's no need to use a special gn template for fuzz tests.
282 # The resulting executables may be used in a variety of modes:
283 # ./my_test # just runs. The FUZZ_TEST runs for 1 second.
284 # ./my_test --fuzz= # runs fuzzing indefinitely.
285 # # Requires enable_fuzztest_fuzz gn argument.
286 # ./my_test --fuzz= # If use_libfuzzer gn argument is enabled, this
287 # # causes the test to emulate a regular libfuzzer fuzzer.
288 # centipede --binary=./mytest # Allows the binary to be run using centipede
289 # # out of process execution environment.
290 # # Requires use_centipede gn argument.
291 source_set("fuzztest") {
293 # If we are building for centipede, we want to make fuzztest executables
294 # which can be used as centipede fuzzers.
295 sources = [ "src/fuzztest/internal/centipede_adaptor.cc" ]
296 deps = [ ":centipede_runner_no_main" ]
297 } else if (use_fuzzing_engine) {
298 deps = [ "//testing/libfuzzer:fuzzing_engine_no_main" ]
300 public_deps = [ ":fuzztest_internal" ]
301 public_configs = [ ":fuzztest_internal_config" ]
302 configs -= fuzzing_engine_remove_configs
303 configs += fuzzing_engine_add_configs
307 # Depend upon this if you need a main() function
308 source_set("fuzztest_gtest_main") {
311 "//third_party/abseil-cpp/absl/flags:flag",
312 "//third_party/abseil-cpp/absl/flags:parse",
314 sources = [ "src/fuzztest/fuzztest_gtest_main.cc" ]