blob: 9aa417006ffdb498135e72a459a8f904ac80d705 [file] [log] [blame]
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This file is a partial translation of
# //third_party/fuzztest/src/centipede/BUILD
# into BUILD.gn format.
#
# It contains support for both:
# - centipede, a way of building and running Chromium's existing fuzzing
# targets using an out-of-process runner.
# - fuzztest, a way of building new fuzzing targets using simpler macros.
import("//build/config/sanitizers/sanitizers.gni")
import("//build_overrides/build.gni")
# Retain full optimization level for the engine parts independent of the
# optimizations set for the fuzz target.
fuzztest_remove_configs = fuzzing_engine_remove_configs +
[ "//build/config/compiler:default_optimization" ]
fuzztest_add_configs =
fuzzing_engine_add_configs + [ "//build/config/compiler:optimize" ]
config("fuzztest_internal_config") {
cflags = [
"-Wno-sign-compare", # https://github.com/google/centipede/issues/487,
"-Wno-unused-private-field",
"-Wno-unreachable-code-return",
"-Wno-unused-but-set-variable",
"-Wno-shadow",
"-Wno-unused-const-variable",
"-Wno-unused-function",
"-Wno-inconsistent-missing-override",
]
# int_utils.h depends on an SSE 4.2 intrinsic.
if (current_cpu == "x64") {
cflags += [ "-msse4.2" ]
}
include_dirs = [ "src" ]
# Riegeli is a library which centipede can use to store data more
# efficiently. It's not yet available in Chromium, so disable
# for now.
defines = [ "CENTIPEDE_DISABLE_RIEGELI" ]
if (use_centipede) {
defines += [ "FUZZTEST_USE_CENTIPEDE" ]
} else if (use_fuzzing_engine && fuzzing_engine_supports_custom_main) {
defines += [ "FUZZTEST_COMPATIBILITY_MODE" ]
}
}
if (use_centipede) {
source_set("centipede_common") {
sources = [
"src/centipede/binary_info.cc",
"src/centipede/binary_info.h",
"src/centipede/byte_array_mutator.cc",
"src/centipede/byte_array_mutator.h",
"src/centipede/defs.h",
"src/centipede/execution_metadata.cc",
"src/centipede/execution_metadata.h",
"src/centipede/feature.cc",
"src/centipede/feature.h",
"src/centipede/knobs.cc",
"src/centipede/knobs.h",
"src/centipede/logging.h",
"src/centipede/pc_info.cc",
"src/centipede/pc_info.h",
"src/centipede/remote_file.cc",
"src/centipede/remote_file.h",
"src/centipede/reverse_pc_table.h",
"src/centipede/runner_cmp_trace.h",
"src/centipede/runner_request.cc",
"src/centipede/runner_request.h",
"src/centipede/runner_result.cc",
"src/centipede/runner_result.h",
"src/centipede/shared_memory_blob_sequence.cc",
"src/centipede/shared_memory_blob_sequence.h",
]
deps = [ "//third_party/abseil-cpp:absl_full" ]
configs += [ ":fuzztest_internal_config" ]
configs -= fuzztest_remove_configs
configs += fuzztest_add_configs
}
source_set("centipede_runner_no_main") {
sources = [
"src/centipede/runner.cc",
"src/centipede/runner.h",
"src/centipede/runner_dl_info.cc",
"src/centipede/runner_dl_info.h",
"src/centipede/runner_fork_server.cc",
"src/centipede/runner_interceptors.cc",
"src/centipede/runner_interface.h",
"src/centipede/runner_sancov.cc",
"src/centipede/runner_sancov_object.cc",
"src/centipede/runner_sancov_object.h",
"src/centipede/runner_utils.cc",
"src/centipede/runner_utils.h",
]
deps = [
":centipede_common",
"//third_party/abseil-cpp:absl_full",
]
configs += [ ":fuzztest_internal_config" ]
configs -= fuzztest_remove_configs
configs += fuzztest_add_configs
# sancov symbols need to be exported for centipede to work correctly with
# multi-dso.
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
configs += [ "//build/config/gcc:symbol_visibility_default" ]
}
source_set("centipede_runner_main") {
deps = [
":centipede_runner_no_main",
"//third_party/abseil-cpp:absl",
]
configs += [ ":fuzztest_internal_config" ]
sources = [ "src/centipede/runner_main.cc" ]
}
# Parts of centipede which are used for the external execution executable,
# but are also now built into fuzztests themselves so that they no longer
# depend on an external runner
source_set("centipede_executable_engine") {
configs += [ ":fuzztest_internal_config" ]
configs -= fuzztest_remove_configs
configs += fuzztest_add_configs
include_dirs = [ "src" ]
testonly = true
public_deps = [ ":centipede_common" ]
libs = [ "atomic" ]
deps = [
":fuzztest_internal",
"//third_party/abseil-cpp:absl_full",
"//third_party/boringssl",
]
sources = [
"src/centipede/analyze_corpora.cc",
"src/centipede/blob_file.cc",
"src/centipede/call_graph.cc",
"src/centipede/centipede.cc",
"src/centipede/centipede_callbacks.cc",
"src/centipede/centipede_default_callbacks.cc",
"src/centipede/centipede_interface.cc",
"src/centipede/command.cc",
"src/centipede/config_file.cc",
"src/centipede/config_init.cc",
"src/centipede/config_util.cc",
"src/centipede/control_flow.cc",
"src/centipede/corpus.cc",
"src/centipede/corpus_io.cc",
"src/centipede/coverage.cc",
"src/centipede/distill.cc",
"src/centipede/distill.h",
"src/centipede/early_exit.cc",
"src/centipede/early_exit.h",
"src/centipede/environment.cc",
"src/centipede/feature_set.cc",
"src/centipede/feature_set.h",
"src/centipede/fuzztest_mutator.cc",
"src/centipede/fuzztest_mutator.h",
"src/centipede/hash.cc",
"src/centipede/minimize_crash.cc",
"src/centipede/resource_pool.cc",
"src/centipede/rusage_profiler.cc",
"src/centipede/rusage_stats.cc",
"src/centipede/stats.cc",
"src/centipede/symbol_table.cc",
"src/centipede/util.cc",
"src/centipede/workdir.cc",
"src/centipede/workdir.h",
]
if (build_with_chromium) {
deps += [
# Depend on fuzzing_engine so that we are automatically built in builds
# destined for ClusterFuzz.
"//testing/libfuzzer:fuzzing_engine",
]
}
}
# The centipede out-of-process runner executable.
executable("centipede") {
testonly = true
configs += [ ":fuzztest_internal_config" ]
configs -= fuzztest_remove_configs
configs += fuzztest_add_configs
deps = [
":centipede_executable_engine",
"//third_party/abseil-cpp:absl_full",
]
sources = [
"src/centipede/centipede_main.cc",
"src/centipede/environment_flags.cc",
"src/centipede/environment_flags.h",
]
}
}
if (use_centipede || enable_fuzztest_fuzz) {
source_set("centipede_weak_sancov_stubs") {
sources = [ "src/centipede/weak_sancov_stubs.cc" ]
}
}
source_set("fuzztest_internal") {
sources = [
"src/fuzztest/domain.h",
"src/fuzztest/domain_core.h",
"src/fuzztest/fuzztest.h",
"src/fuzztest/googletest_fixture_adapter.h",
"src/fuzztest/internal/any.h",
"src/fuzztest/internal/centipede_adaptor.h",
"src/fuzztest/internal/compatibility_mode.cc",
"src/fuzztest/internal/compatibility_mode.h",
"src/fuzztest/internal/configuration.cc",
"src/fuzztest/internal/configuration.h",
"src/fuzztest/internal/corpus_database.cc",
"src/fuzztest/internal/corpus_database.h",
"src/fuzztest/internal/coverage.cc",
"src/fuzztest/internal/coverage.h",
"src/fuzztest/internal/domains/absl_helpers.h",
"src/fuzztest/internal/domains/aggregate_of_impl.h",
"src/fuzztest/internal/domains/arbitrary_impl.h",
"src/fuzztest/internal/domains/bit_flag_combination_of_impl.h",
"src/fuzztest/internal/domains/container_mutation_helpers.h",
"src/fuzztest/internal/domains/container_of_impl.h",
"src/fuzztest/internal/domains/domain_base.cc",
"src/fuzztest/internal/domains/domain_base.h",
"src/fuzztest/internal/domains/element_of_impl.h",
"src/fuzztest/internal/domains/filter_impl.h",
"src/fuzztest/internal/domains/flat_map_impl.h",
"src/fuzztest/internal/domains/in_grammar_impl.cc",
"src/fuzztest/internal/domains/in_grammar_impl.h",
"src/fuzztest/internal/domains/in_range_impl.h",
"src/fuzztest/internal/domains/in_regexp_impl.h",
"src/fuzztest/internal/domains/map_impl.h",
"src/fuzztest/internal/domains/one_of_impl.h",
"src/fuzztest/internal/domains/optional_of_impl.h",
"src/fuzztest/internal/domains/protobuf_domain_impl.h",
"src/fuzztest/internal/domains/regexp_dfa.cc",
"src/fuzztest/internal/domains/regexp_dfa.h",
"src/fuzztest/internal/domains/serialization_helpers.h",
"src/fuzztest/internal/domains/smart_pointer_of_impl.h",
"src/fuzztest/internal/domains/unique_elements_container_of_impl.h",
"src/fuzztest/internal/domains/value_mutation_helpers.h",
"src/fuzztest/internal/domains/variant_of_impl.h",
"src/fuzztest/internal/fixture_driver.cc",
"src/fuzztest/internal/fixture_driver.h",
"src/fuzztest/internal/googletest_adaptor.cc",
"src/fuzztest/internal/googletest_adaptor.h",
"src/fuzztest/internal/io.cc",
"src/fuzztest/internal/io.h",
"src/fuzztest/internal/logging.cc",
"src/fuzztest/internal/logging.h",
"src/fuzztest/internal/meta.h",
"src/fuzztest/internal/registration.h",
"src/fuzztest/internal/registry.cc",
"src/fuzztest/internal/registry.h",
"src/fuzztest/internal/runtime.cc",
"src/fuzztest/internal/runtime.h",
"src/fuzztest/internal/seed_seq.cc",
"src/fuzztest/internal/seed_seq.h",
"src/fuzztest/internal/serialization.cc",
"src/fuzztest/internal/serialization.h",
"src/fuzztest/internal/status.cc",
"src/fuzztest/internal/status.h",
"src/fuzztest/internal/subprocess.cc",
"src/fuzztest/internal/subprocess.h",
"src/fuzztest/internal/table_of_recent_compares.h",
"src/fuzztest/internal/type_support.cc",
"src/fuzztest/internal/type_support.h",
]
testonly = true
deps = [
"//testing/gtest",
"//third_party/abseil-cpp:absl_full",
]
if (build_with_chromium) {
deps += [
# Depends transitively on fuzzing_engine so that we are automatically
# built in builds destined for ClusterFuzz.
"//testing/libfuzzer:fuzzing_engine",
]
}
public_deps = [
"//third_party/abseil-cpp:absl",
# For RE2 mutators. It's questionable whether we want to pull this library
# into every fuzztest target, but this is the approach used in other
# fuzztest contexts so we'll do the same
"//third_party/re2",
]
public_configs = [ ":fuzztest_internal_config" ]
configs -= fuzztest_remove_configs
configs += fuzztest_add_configs
}
# Fuzztest support. This allows regular test executables to contain
# a FUZZ_TEST. Such tests/executables should depend directly on this target;
# at this time there's no need to use a special gn template for fuzz tests.
# The resulting executables may be used in a variety of modes:
# ./my_test # just runs. The FUZZ_TEST runs for 1 second.
# ./my_test --fuzz= # runs fuzzing indefinitely.
# # Requires enable_fuzztest_fuzz gn argument.
# ./my_test --fuzz= # If use_libfuzzer gn argument is enabled, this
# # causes the test to emulate a regular libfuzzer fuzzer.
# centipede --binary=./mytest # Allows the binary to be run using centipede
# # out of process execution environment.
# # Requires use_centipede gn argument.
source_set("fuzztest") {
sources = [
"src/fuzztest/init_fuzztest.cc",
"src/fuzztest/init_fuzztest.h",
]
deps = [
"//testing/gtest",
"//third_party/abseil-cpp:absl_full",
]
if (use_centipede) {
# If we are building for centipede, we want to make fuzztest executables
# which can be used as centipede fuzzers.
sources += [ "src/fuzztest/internal/centipede_adaptor.cc" ]
deps += [
":centipede_executable_engine",
":centipede_runner_no_main",
]
} else if (use_fuzzing_engine && fuzzing_engine_supports_custom_main) {
# Typically, libfuzzer.
deps += [ "//testing/libfuzzer:fuzzing_engine_no_main" ]
}
public_deps = [ ":fuzztest_internal" ]
public_configs = [ ":fuzztest_internal_config" ]
configs -= fuzztest_remove_configs
configs += fuzztest_add_configs
testonly = true
}
# Depend upon this if you need a main() function
source_set("fuzztest_gtest_main") {
deps = [
"//testing/gtest",
"//third_party/abseil-cpp:absl_full",
]
sources = [ "src/fuzztest/fuzztest_gtest_main.cc" ]
public_deps = [
":fuzztest",
"//testing/gtest",
]
if (use_centipede) {
data_deps = [ ":centipede" ]
}
testonly = true
}