Merge "Support enabling overflow sanitization by path."
diff --git a/android/config.go b/android/config.go
index 43d743b..5d38d71 100644
--- a/android/config.go
+++ b/android/config.go
@@ -712,6 +712,13 @@
return PrefixInList(path, *c.ProductVariables.CFIExcludePaths)
}
+func (c *config) IntegerOverflowEnabledForPath(path string) bool {
+ if c.ProductVariables.IntegerOverflowIncludePaths == nil {
+ return false
+ }
+ return PrefixInList(path, *c.ProductVariables.IntegerOverflowIncludePaths)
+}
+
func (c *config) CFIEnabledForPath(path string) bool {
if c.ProductVariables.CFIIncludePaths == nil {
return false
diff --git a/android/variable.go b/android/variable.go
index d58ed6a..aa751a0 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -167,6 +167,7 @@
MinimizeJavaDebugInfo *bool `json:",omitempty"`
IntegerOverflowExcludePaths *[]string `json:",omitempty"`
+ IntegerOverflowIncludePaths *[]string `json:",omitempty"`
EnableCFI *bool `json:",omitempty"`
CFIExcludePaths *[]string `json:",omitempty"`
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 1afec26..859478b 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -232,6 +232,14 @@
}
}
+ // Enable Integer Overflow for all components in the include paths
+ if !ctx.Host() && ctx.Config().IntegerOverflowEnabledForPath(ctx.ModuleDir()) && s.Integer_overflow == nil {
+ s.Integer_overflow = boolPtr(true)
+ if inList("integer_overflow", ctx.Config().SanitizeDeviceDiag()) {
+ s.Diag.Integer_overflow = boolPtr(true)
+ }
+ }
+
// CFI needs gold linker, and mips toolchain does not have one.
if !ctx.Config().EnableCFI() || ctx.Arch().ArchType == android.Mips || ctx.Arch().ArchType == android.Mips64 {
s.Cfi = nil
@@ -417,6 +425,7 @@
sanitizers = append(sanitizers, "unsigned-integer-overflow")
sanitizers = append(sanitizers, "signed-integer-overflow")
flags.CFlags = append(flags.CFlags, intOverflowCflags...)
+
if Bool(sanitize.Properties.Sanitize.Diag.Integer_overflow) {
diagSanitizers = append(diagSanitizers, "unsigned-integer-overflow")
diagSanitizers = append(diagSanitizers, "signed-integer-overflow")
@@ -424,6 +433,8 @@
}
}
+ diagSanitizeArgs := "-fno-sanitize-trap=" + strings.Join(diagSanitizers, ",")
+
if len(sanitizers) > 0 {
sanitizeArg := "-fsanitize=" + strings.Join(sanitizers, ",")
flags.CFlags = append(flags.CFlags, sanitizeArg)
@@ -436,10 +447,19 @@
} else {
flags.CFlags = append(flags.CFlags, "-fsanitize-trap=all", "-ftrap-function=abort")
}
+
+ // Specific settings for userdebug and eng builds
+ if Bool(ctx.Config().ProductVariables.Debuggable) {
+ // TODO(ivanlozano): uncomment after switch to clang-4536805.
+ // Run integer overflow sanitizers with the minimal runtime diagnostics.
+ if strings.Contains(sanitizeArg, "integer") && !strings.Contains(diagSanitizeArgs, "integer") && !Bool(sanitize.Properties.Sanitize.Address) {
+ //flags.CFlags = append(flags.CFlags, "-fsanitize-minimal-runtime")
+ }
+ }
}
if len(diagSanitizers) > 0 {
- flags.CFlags = append(flags.CFlags, "-fno-sanitize-trap="+strings.Join(diagSanitizers, ","))
+ flags.CFlags = append(flags.CFlags, diagSanitizeArgs)
}
// FIXME: enable RTTI if diag + (cfi or vptr)