diff --git a/cc/sanitize.go b/cc/sanitize.go
index b0186d2..27d778e 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -25,14 +25,6 @@
 
 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 @@
 		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) 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 @@
 		}
 	}
 
-	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)
-	}
-
-	if s.Thread == nil {
-		found, globalSanitizers = removeFromList("thread", globalSanitizers)
-		s.Thread = boolPtr(found)
-	}
-
-	if s.Coverage == nil {
-		found, globalSanitizers = removeFromList("coverage", globalSanitizers)
-		s.Coverage = boolPtr(found)
-	}
-
-	if s.Safestack == nil {
-		found, globalSanitizers = removeFromList("safe-stack", globalSanitizers)
-		s.Safestack = boolPtr(found)
-	}
-
+	// The sanitizer specified by the environment wins over the module.
 	if len(globalSanitizers) > 0 {
-		ctx.ModuleErrorf("unknown global sanitizer option %s", 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 Bool(s.All_undefined) || Bool(s.Undefined) || Bool(s.Address) ||
-		Bool(s.Thread) || Bool(s.Coverage) || Bool(s.Safestack) {
+		if found, globalSanitizers = removeFromList("address", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Address = true
+		}
+
+		if found, globalSanitizers = removeFromList("thread", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Thread = true
+		}
+
+		if found, globalSanitizers = removeFromList("coverage", globalSanitizers); found {
+			sanitize.Properties.Sanitize.Coverage = true
+		}
+
+		if found, globalSanitizers = removeFromList("safe-stack", globalSanitizers); found {
+			sanitize.Properties.Sanitize.SafeStack = true
+		}
+
+		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 @@
 
 	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 @@
 
 	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 @@
 		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 @@
 		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 @@
 			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 @@
 
 	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) 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))
 	}
