blob: 33dce4ecf764e5d8710cedf90be796aaf4f91006 [file] [log] [blame]
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This enables both the ubsan checking that happens in normal application code,
# and also some non-default checks that are a good idea for the kind of
# low-level and highly sensitive code likely to need a custom runtime.
_ubsan_sanitizers = [
"undefined",
# Checks whether an implicit truncation caused data loss. It's not
# undefined behavior but most of the time it is unintentional.
"implicit-integer-truncation",
# The kernel has some _Nonnull annotations, this would check
# them at runtime.
"nullability",
]
config("ubsan") {
cflags = []
foreach(sanitizer, _ubsan_sanitizers) {
cflags += [ "-fsanitize=$sanitizer" ]
}
# The ubsan variant adds rtti, but that is not used by the kernel variant.
configs = [ "//build/config:no_rtti" ]
}
# This disables all those, and can be appended to a configs list that has the
# "ubsan" config earlier in its list, or to one that doesn't.
config("no-ubsan") {
cflags = []
foreach(sanitizer, _ubsan_sanitizers) {
cflags += [ "-fno-sanitize=$sanitizer" ]
}
}
# This should only be in the deps of a source_set() for the single source file
# that does `#include <lib/ubsan-custom/handlers.h>`.
source_set("handlers") {
public = [ "handlers.h" ]
public_deps = [ ":types" ]
# The handlers themselves shouldn't be compiled with instrumentation, so
# apply a config to the dependent source_set() to disable it. Disabling it
# on the command-line not only saves adding NO_UBSAN annotations to each
# function, but covers inline functions from shared header files that
# shouldn't all be annotated for their other callers. The former could be
# addressed via `#pragma clang attribute`, but the latter cannot be.
public_configs = [ ":no-ubsan" ]
# This is meant to be read by authors depending on this target, but not
# `#include`d in their code; they use only `<lib/ubsan-custom/handlers.h>`.
# Since it contains `inline` declarations for functions not defined, it's
# meant to generate warnings if it's included in any translation unit other
# than the single one that should define those functions.
sources = [ "report.h" ]
}
# This can be used freely, for example if a custom ubsan::Report implementation
# wants to pass ubsan::SourceLocation to other code outside the single-file
# source_set() that includes <lib/ubsan-commit/handlers.h>.
source_set("types") {
public = [ "types.h" ]
public_configs = [ ":includes" ]
}
config("includes") {
visibility = [ ":*" ]
include_dirs = [ "//src" ]
}
group("tests") {
testonly = true
}