diff options
author | Evgenii Stepanov <eugenis@google.com> | 2016-07-07 17:38:41 +0000 |
---|---|---|
committer | Evgenii Stepanov <eugenis@google.com> | 2016-07-07 17:38:41 +0000 |
commit | 05bafd3784c646c1b2d55a23edbf7e2ae9436064 (patch) | |
tree | 2ed063258882bc4dca305343910f7dba02892c85 /cc | |
parent | bb028864514ad8d49d554b7413a1802e0c098151 (diff) | |
download | build_soong-05bafd3784c646c1b2d55a23edbf7e2ae9436064.tar.gz build_soong-05bafd3784c646c1b2d55a23edbf7e2ae9436064.tar.bz2 build_soong-05bafd3784c646c1b2d55a23edbf7e2ae9436064.zip |
Revert "Target sanitize properties can disable the global sanitizer."
This reverts commit bb028864514ad8d49d554b7413a1802e0c098151.
Breaks SANITIZE_HOST=address
Change-Id: I9791a034e32a83d567b8739a7ec7b61890cb1b97
Diffstat (limited to 'cc')
-rw-r--r-- | cc/sanitize.go | 121 |
1 files changed, 52 insertions, 69 deletions
diff --git a/cc/sanitize.go b/cc/sanitize.go index b0186d21..27d778ec 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -25,14 +25,6 @@ import ( type sanitizerType int -func boolPtr(v bool) *bool { - if v { - return &v - } else { - return nil - } -} - func init() { pctx.StaticVariable("clangAsanLibDir", "${clangPath}/lib64/clang/3.8/lib/linux") } @@ -59,15 +51,15 @@ type SanitizeProperties struct { Never bool `android:"arch_variant"` // main sanitizers - Address *bool `android:"arch_variant"` - Thread *bool `android:"arch_variant"` + Address bool `android:"arch_variant"` + Thread bool `android:"arch_variant"` // local sanitizers - Undefined *bool `android:"arch_variant"` - All_undefined *bool `android:"arch_variant"` + Undefined bool `android:"arch_variant"` + All_undefined bool `android:"arch_variant"` Misc_undefined []string `android:"arch_variant"` - Coverage *bool `android:"arch_variant"` - Safestack *bool `android:"arch_variant"` + Coverage bool `android:"arch_variant"` + SafeStack bool `android:"arch_variant"` // value to pass to -fsantitize-recover= Recover []string @@ -90,18 +82,20 @@ func (sanitize *sanitize) props() []interface{} { } func (sanitize *sanitize) begin(ctx BaseModuleContext) { - s := &sanitize.Properties.Sanitize - // Don't apply sanitizers to NDK code. if ctx.sdk() { - s.Never = true + sanitize.Properties.Sanitize.Never = true } // Never always wins. - if s.Never { + if sanitize.Properties.Sanitize.Never { return } + if ctx.ContainsProperty("sanitize") { + sanitize.Properties.SanitizerEnabled = true + } + var globalSanitizers []string if ctx.clang() { if ctx.Host() { @@ -111,59 +105,48 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) { } } - var found bool - if s.All_undefined == nil { - found, globalSanitizers = removeFromList("undefined", globalSanitizers) - s.All_undefined = boolPtr(found) - } - - if s.Undefined == nil { - found, globalSanitizers = removeFromList("default-ub", globalSanitizers) - s.Undefined = boolPtr(found) - } - - if s.Address == nil { - found, globalSanitizers = removeFromList("address", globalSanitizers) - s.Address = boolPtr(found) - } + // The sanitizer specified by the environment wins over the module. + if len(globalSanitizers) > 0 { + // wipe the enabled sanitizers + sanitize.Properties = SanitizeProperties{} + var found bool + if found, globalSanitizers = removeFromList("undefined", globalSanitizers); found { + sanitize.Properties.Sanitize.All_undefined = true + } else if found, globalSanitizers = removeFromList("default-ub", globalSanitizers); found { + sanitize.Properties.Sanitize.Undefined = true + } - if s.Thread == nil { - found, globalSanitizers = removeFromList("thread", globalSanitizers) - s.Thread = boolPtr(found) - } + if found, globalSanitizers = removeFromList("address", globalSanitizers); found { + sanitize.Properties.Sanitize.Address = true + } - if s.Coverage == nil { - found, globalSanitizers = removeFromList("coverage", globalSanitizers) - s.Coverage = boolPtr(found) - } + if found, globalSanitizers = removeFromList("thread", globalSanitizers); found { + sanitize.Properties.Sanitize.Thread = true + } - if s.Safestack == nil { - found, globalSanitizers = removeFromList("safe-stack", globalSanitizers) - s.Safestack = boolPtr(found) - } + if found, globalSanitizers = removeFromList("coverage", globalSanitizers); found { + sanitize.Properties.Sanitize.Coverage = true + } - if len(globalSanitizers) > 0 { - ctx.ModuleErrorf("unknown global sanitizer option %s", globalSanitizers[0]) - } + if found, globalSanitizers = removeFromList("safe-stack", globalSanitizers); found { + sanitize.Properties.Sanitize.SafeStack = true + } - if Bool(s.All_undefined) || Bool(s.Undefined) || Bool(s.Address) || - Bool(s.Thread) || Bool(s.Coverage) || Bool(s.Safestack) { + if len(globalSanitizers) > 0 { + ctx.ModuleErrorf("unknown global sanitizer option %s", globalSanitizers[0]) + } sanitize.Properties.SanitizerEnabled = true } - if Bool(s.All_undefined) { - s.Undefined = nil - } - if !ctx.toolchain().Is64Bit() { // TSAN and SafeStack are not supported on 32-bit architectures - s.Thread = nil - s.Safestack = nil + sanitize.Properties.Sanitize.Thread = false + sanitize.Properties.Sanitize.SafeStack = false // TODO(ccross): error for compile_multilib = "32"? } - if Bool(s.Coverage) { - if !Bool(s.Address) { + if sanitize.Properties.Sanitize.Coverage { + if !sanitize.Properties.Sanitize.Address { ctx.ModuleErrorf(`Use of "coverage" also requires "address"`) } } @@ -176,7 +159,7 @@ func (sanitize *sanitize) deps(ctx BaseModuleContext, deps Deps) Deps { if ctx.Device() { deps.SharedLibs = append(deps.SharedLibs, "libdl") - if Bool(sanitize.Properties.Sanitize.Address) { + if sanitize.Properties.Sanitize.Address { deps.StaticLibs = append(deps.StaticLibs, "libasan") } } @@ -195,13 +178,13 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { var sanitizers []string - if Bool(sanitize.Properties.Sanitize.All_undefined) { + if sanitize.Properties.Sanitize.All_undefined { sanitizers = append(sanitizers, "undefined") if ctx.Device() { ctx.ModuleErrorf("ubsan is not yet supported on the device") } } else { - if Bool(sanitize.Properties.Sanitize.Undefined) { + if sanitize.Properties.Sanitize.Undefined { sanitizers = append(sanitizers, "bool", "integer-divide-by-zero", @@ -229,7 +212,7 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { sanitizers = append(sanitizers, sanitize.Properties.Sanitize.Misc_undefined...) } - if Bool(sanitize.Properties.Sanitize.Address) { + if sanitize.Properties.Sanitize.Address { if ctx.Arch().ArchType == android.Arm { // Frame pointer based unwinder in ASan requires ARM frame setup. // TODO: put in flags? @@ -258,11 +241,11 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { sanitizers = append(sanitizers, "address") } - if Bool(sanitize.Properties.Sanitize.Coverage) { + if sanitize.Properties.Sanitize.Coverage { flags.CFlags = append(flags.CFlags, "-fsanitize-coverage=edge,indirect-calls,8bit-counters,trace-cmp") } - if Bool(sanitize.Properties.Sanitize.Safestack) { + if sanitize.Properties.Sanitize.SafeStack { sanitizers = append(sanitizers, "safe-stack") } @@ -279,7 +262,7 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags { flags.LdFlags = append(flags.LdFlags, sanitizeArg) flags.LdFlags = append(flags.LdFlags, "-lrt", "-ldl") } else { - if !Bool(sanitize.Properties.Sanitize.Address) { + if !sanitize.Properties.Sanitize.Address { flags.CFlags = append(flags.CFlags, "-fsanitize-trap=all", "-ftrap-function=abort") } } @@ -305,9 +288,9 @@ func (sanitize *sanitize) Sanitizer(t sanitizerType) bool { switch t { case asan: - return Bool(sanitize.Properties.Sanitize.Address) + return sanitize.Properties.Sanitize.Address case tsan: - return Bool(sanitize.Properties.Sanitize.Thread) + return sanitize.Properties.Sanitize.Thread default: panic(fmt.Errorf("unknown sanitizerType %d", t)) } @@ -316,9 +299,9 @@ func (sanitize *sanitize) Sanitizer(t sanitizerType) bool { func (sanitize *sanitize) SetSanitizer(t sanitizerType, b bool) { switch t { case asan: - sanitize.Properties.Sanitize.Address = boolPtr(b) + sanitize.Properties.Sanitize.Address = b case tsan: - sanitize.Properties.Sanitize.Thread = boolPtr(b) + sanitize.Properties.Sanitize.Thread = b default: panic(fmt.Errorf("unknown sanitizerType %d", t)) } |