diff --git a/cc/sanitize.go b/cc/sanitize.go index 9ceb1c8a0..6329e9769 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -1113,12 +1113,15 @@ func (sanitize *sanitize) isSanitizerExplicitlyDisabled(t SanitizerType) bool { // indirectly (via a mutator) sets the bool ptr to true, and you can't // distinguish between the cases. It isn't needed though - both cases can be // treated identically. -func (sanitize *sanitize) isSanitizerEnabled(t SanitizerType) bool { - if sanitize == nil { +func (s *sanitize) isSanitizerEnabled(t SanitizerType) bool { + if s == nil { + return false + } + if proptools.Bool(s.Properties.SanitizeMutated.Never) { return false } - sanitizerVal := sanitize.getSanitizerBoolPtr(t) + sanitizerVal := s.getSanitizerBoolPtr(t) return sanitizerVal != nil && *sanitizerVal == true } diff --git a/cc/sanitize_test.go b/cc/sanitize_test.go index 49117a082..31e668ea9 100644 --- a/cc/sanitize_test.go +++ b/cc/sanitize_test.go @@ -16,6 +16,7 @@ package cc import ( "fmt" + "reflect" "runtime" "strings" "testing" @@ -1273,3 +1274,122 @@ func TestCfi(t *testing.T) { t.Errorf("non-CFI variant of baz not expected to contain CFI flags ") } } + +func TestHwasan(t *testing.T) { + t.Parallel() + + bp := ` + cc_library_shared { + name: "shared_with_hwaddress", + static_libs: [ + "static_dep_with_hwaddress", + "static_dep_no_hwaddress", + ], + sanitize: { + hwaddress: true, + }, + sdk_version: "current", + stl: "c++_shared", + } + + cc_library_static { + name: "static_dep_with_hwaddress", + sanitize: { + hwaddress: true, + }, + sdk_version: "current", + stl: "c++_shared", + } + + cc_library_static { + name: "static_dep_no_hwaddress", + sdk_version: "current", + stl: "c++_shared", + } +` + + androidArm := "android_arm_armv7-a-neon" + androidArm64 := "android_arm64_armv8-a" + androidX86 := "android_x86_silvermont" + sharedSuffix := "_shared" + hwasanSuffix := "_hwasan" + staticSuffix := "_static" + sdkSuffix := "_sdk" + + sharedWithHwasanVariant := sharedSuffix + hwasanSuffix + sharedWithSdkVariant := sdkSuffix + sharedSuffix + staticWithHwasanVariant := staticSuffix + hwasanSuffix + staticWithSdkVariant := sdkSuffix + staticSuffix + + testCases := []struct { + buildOs string + extraPreparer android.FixturePreparer + expectedVariants map[string][]string + }{ + { + buildOs: androidArm64, + expectedVariants: map[string][]string{ + "shared_with_hwaddress": []string{ + androidArm64 + sharedWithHwasanVariant, + androidArm64 + sharedWithSdkVariant, + androidArm + sharedSuffix, + androidArm + sharedWithSdkVariant, + }, + "static_dep_with_hwaddress": []string{ + androidArm64 + staticSuffix, + androidArm64 + staticWithHwasanVariant, + androidArm64 + staticWithSdkVariant, + androidArm + staticSuffix, + androidArm + staticWithSdkVariant, + }, + "static_dep_no_hwaddress": []string{ + androidArm64 + staticSuffix, + androidArm64 + staticWithHwasanVariant, + androidArm64 + staticWithSdkVariant, + androidArm + staticSuffix, + androidArm + staticWithSdkVariant, + }, + }, + }, + { + buildOs: androidX86, + extraPreparer: android.FixtureModifyConfig(func(config android.Config) { + config.Targets[android.Android] = []android.Target{ + { + android.Android, + android.Arch{ + ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, android.NativeBridgeDisabled, "", "", false}, + } + }), + expectedVariants: map[string][]string{ + "shared_with_hwaddress": []string{ + androidX86 + sharedSuffix, + androidX86 + sharedWithSdkVariant, + }, + "static_dep_with_hwaddress": []string{ + androidX86 + staticSuffix, + androidX86 + staticWithSdkVariant, + }, + "static_dep_no_hwaddress": []string{ + androidX86 + staticSuffix, + androidX86 + staticWithSdkVariant, + }, + }, + }, + } + + for _, tc := range testCases { + preparer := android.GroupFixturePreparers( + prepareForCcTest, + android.OptionalFixturePreparer(tc.extraPreparer), + ) + result := preparer.RunTestWithBp(t, bp) + + for m, v := range tc.expectedVariants { + variants := result.ModuleVariantsForTests(m) + if !reflect.DeepEqual(variants, v) { + t.Errorf("Expected variants of %q to be %q, but got %q", m, v, variants) + } + } + } +}