From d1600411495c0bd52dd0f3809ed6bf0d6faca349 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Wed, 10 Jun 2015 16:33:43 -0700 Subject: [PATCH] Force some clang Werrors that *will* break things. Clang is really aggressive at optimizing a handful of cases (read: clang will ruin your day some if you write bad code). Fortunately, it also emits a warning when it's about to do this. To prevent anyone from suffering from these optimizations, make these warnings errors and make them impossible to disable. Change-Id: I5e10bb0fc2ca23190017da716b3b84635577a0bd --- core/binary.mk | 6 ++++++ core/config.mk | 7 ++++++- core/definitions.mk | 9 ++++++--- core/product.mk | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/core/binary.mk b/core/binary.mk index d3d050e68..ba559354f 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -40,6 +40,8 @@ my_shared_libraries := $(LOCAL_SHARED_LIBRARIES) my_cflags := $(LOCAL_CFLAGS) my_conlyflags := $(LOCAL_CONLYFLAGS) my_cppflags := $(LOCAL_CPPFLAGS) +my_cflags_no_override := $(GLOBAL_CFLAGS_NO_OVERRIDE) +my_cppflags_no_override := $(GLOBAL_CPPFLAGS_NO_OVERRIDE) my_ldflags := $(LOCAL_LDFLAGS) my_ldlibs := $(LOCAL_LDLIBS) my_asflags := $(LOCAL_ASFLAGS) @@ -1031,6 +1033,8 @@ ifeq ($(my_clang),true) my_cflags += $(LOCAL_CLANG_CFLAGS) my_conlyflags += $(LOCAL_CLANG_CONLYFLAGS) my_cppflags += $(LOCAL_CLANG_CPPFLAGS) +my_cflags_no_override += $(GLOBAL_CLANG_CFLAGS_NO_OVERRIDE) +my_cppflags_no_override += $(GLOBAL_CLANG_CPPFLAGS_NO_OVERRIDE) my_asflags += $(LOCAL_CLANG_ASFLAGS) my_ldflags += $(LOCAL_CLANG_LDFLAGS) my_cflags += $(LOCAL_CLANG_CFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CFLAGS_$(my_32_64_bit_suffix)) @@ -1055,6 +1059,8 @@ $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(my_asflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(my_conlyflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(my_cflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(my_cppflags) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS_NO_OVERRIDE := $(my_cflags_no_override) +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS_NO_OVERRIDE := $(my_cppflags_no_override) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(my_c_includes) diff --git a/core/config.mk b/core/config.mk index 502dd7a73..07c392adb 100644 --- a/core/config.mk +++ b/core/config.mk @@ -117,10 +117,15 @@ COMMON_RELEASE_CFLAGS:= -DNDEBUG -UDEBUG COMMON_GLOBAL_CPPFLAGS:= $(COMMON_GLOBAL_CFLAGS) -Wsign-promo -std=gnu++11 COMMON_RELEASE_CPPFLAGS:= $(COMMON_RELEASE_CFLAGS) -GLOBAL_CFLAGS_NO_OVERRIDE := \ +GLOBAL_CFLAGS_NO_OVERRIDE := \ -Werror=int-to-pointer-cast \ -Werror=pointer-to-int-cast \ +GLOBAL_CLANG_CFLAGS_NO_OVERRIDE := \ + -Werror=address-of-temporary \ + -Werror=null-dereference \ + -Werror=return-type \ + GLOBAL_CPPFLAGS_NO_OVERRIDE := # Set the extensions used for various packages diff --git a/core/definitions.mk b/core/definitions.mk index db51f9497..c1841dc2b 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -1032,8 +1032,8 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CPPFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ - $(GLOBAL_CFLAGS_NO_OVERRIDE) \ - $(GLOBAL_CPPFLAGS_NO_OVERRIDE) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE) \ + $(PRIVATE_CPPFLAGS_NO_OVERRIDE) \ -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< $(transform-d-to-p) endef @@ -1070,7 +1070,7 @@ $(call transform-c-or-s-to-o-no-deps, \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CONLYFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ - $(GLOBAL_CFLAGS_NO_OVERRIDE)) + $(PRIVATE_CFLAGS_NO_OVERRIDE)) endef define transform-s-to-o-no-deps @@ -1137,6 +1137,8 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CPPFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE) \ + $(PRIVATE_CPPFLAGS_NO_OVERRIDE) \ -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< $(transform-d-to-p) endef @@ -1163,6 +1165,7 @@ $(hide) $(PRIVATE_CC) \ $(PRIVATE_HOST_GLOBAL_CONLYFLAGS) \ ) \ $(1) \ + $(PRIVATE_CFLAGS_NO_OVERRIDE) \ -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< endef diff --git a/core/product.mk b/core/product.mk index 46fad8951..ac5f85440 100644 --- a/core/product.mk +++ b/core/product.mk @@ -270,6 +270,7 @@ _product_stash_var_list += \ _product_stash_var_list += \ GLOBAL_CFLAGS_NO_OVERRIDE \ GLOBAL_CPPFLAGS_NO_OVERRIDE \ + GLOBAL_CLANG_CFLAGS_NO_OVERRIDE \ # # Stash values of the variables in _product_stash_var_list.