From b5b2ffe3be103325db681e671cbbde7c7d89e768 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 16 Apr 2015 18:07:07 -0700 Subject: [PATCH] Add support for a partial ubsan build. Some of the ubsan checks expose a few pathological performance cases in clang, and thus aren't suited to be used in SANITIZE_HOST. This mode is also supported on the target despite not having the target runtime libraries for ubsan by generating traps. Change-Id: I0b0f0a08ca84d72e44e2174a66726b1c5e5cad7e --- core/clang/config.mk | 26 ++++++++++++++++++++++++++ core/config_sanitizers.mk | 12 ++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/core/clang/config.mk b/core/clang/config.mk index e2a4c088cd..24c06b63c7 100644 --- a/core/clang/config.mk +++ b/core/clang/config.mk @@ -98,6 +98,32 @@ CLANG_CONFIG_TARGET_EXTRA_CFLAGS := -nostdlibinc CLANG_CONFIG_TARGET_EXTRA_CPPFLAGS := -nostdlibinc CLANG_CONFIG_TARGET_EXTRA_LDFLAGS := +CLANG_DEFAULT_UB_CHECKS := \ + bool \ + integer-divide-by-zero \ + return \ + returns-nonnull-attribute \ + shift-exponent \ + unreachable \ + vla-bound \ + +# TODO(danalbert): The following checks currently have compiler performance +# issues. +# CLANG_DEFAULT_UB_CHECKS += alignment +# CLANG_DEFAULT_UB_CHECKS += bounds +# CLANG_DEFAULT_UB_CHECKS += enum +# CLANG_DEFAULT_UB_CHECKS += float-cast-overflow +# CLANG_DEFAULT_UB_CHECKS += float-divide-by-zero +# CLANG_DEFAULT_UB_CHECKS += nonnull-attribute +# CLANG_DEFAULT_UB_CHECKS += null +# CLANG_DEFAULT_UB_CHECKS += shift-base +# CLANG_DEFAULT_UB_CHECKS += signed-integer-overflow + +# TODO(danalbert): Fix UB in libc++'s __tree so we can turn this on. +# https://llvm.org/PR19302 +# http://reviews.llvm.org/D6974 +# CLANG_DEFAULT_UB_CHECKS += object-size + # HOST config clang_2nd_arch_prefix := include $(BUILD_SYSTEM)/clang/HOST_$(HOST_ARCH).mk diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk index b433712305..210d442409 100644 --- a/core/config_sanitizers.mk +++ b/core/config_sanitizers.mk @@ -50,11 +50,15 @@ ifneq ($(my_clang),true) endif endif -unknown_sanitizers := $(filter-out address, \ - $(filter-out undefined,$(my_sanitize))) +ifneq ($(filter default-ub,$(my_sanitize)),) + my_sanitize := $(CLANG_DEFAULT_UB_CHECKS) + my_ldlibs += -ldl -ifneq ($(unknown_sanitizers),) - $(error Unknown sanitizers: $(unknown_sanitizers)) + ifdef LOCAL_IS_HOST_MODULE + my_cflags += -fno-sanitize-recover=all + else + my_cflags += -fsanitize-undefined-trap-on-error + endif endif ifneq ($(my_sanitize),)