Include/exclude lists for memtag_heap sanitizer.
Bug: b/135772972 Test: cc_test.go / TestSanitizeMemtagHeap Change-Id: I263b23647f1874ae3024101dce1b07091c1c9403
This commit is contained in:
parent
193ac2eb96
commit
4beaa0c964
|
@ -1256,6 +1256,27 @@ func (c *config) CFIEnabledForPath(path string) bool {
|
||||||
return HasAnyPrefix(path, c.productVariables.CFIIncludePaths)
|
return HasAnyPrefix(path, c.productVariables.CFIIncludePaths)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *config) MemtagHeapDisabledForPath(path string) bool {
|
||||||
|
if len(c.productVariables.MemtagHeapExcludePaths) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return HasAnyPrefix(path, c.productVariables.MemtagHeapExcludePaths)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *config) MemtagHeapAsyncEnabledForPath(path string) bool {
|
||||||
|
if len(c.productVariables.MemtagHeapAsyncIncludePaths) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return HasAnyPrefix(path, c.productVariables.MemtagHeapAsyncIncludePaths)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *config) MemtagHeapSyncEnabledForPath(path string) bool {
|
||||||
|
if len(c.productVariables.MemtagHeapSyncIncludePaths) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return HasAnyPrefix(path, c.productVariables.MemtagHeapSyncIncludePaths)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *config) VendorConfig(name string) VendorConfig {
|
func (c *config) VendorConfig(name string) VendorConfig {
|
||||||
return soongconfig.Config(c.productVariables.VendorVars[name])
|
return soongconfig.Config(c.productVariables.VendorVars[name])
|
||||||
}
|
}
|
||||||
|
|
|
@ -260,6 +260,10 @@ type productVariables struct {
|
||||||
|
|
||||||
DisableScudo *bool `json:",omitempty"`
|
DisableScudo *bool `json:",omitempty"`
|
||||||
|
|
||||||
|
MemtagHeapExcludePaths []string `json:",omitempty"`
|
||||||
|
MemtagHeapAsyncIncludePaths []string `json:",omitempty"`
|
||||||
|
MemtagHeapSyncIncludePaths []string `json:",omitempty"`
|
||||||
|
|
||||||
VendorPath *string `json:",omitempty"`
|
VendorPath *string `json:",omitempty"`
|
||||||
OdmPath *string `json:",omitempty"`
|
OdmPath *string `json:",omitempty"`
|
||||||
ProductPath *string `json:",omitempty"`
|
ProductPath *string `json:",omitempty"`
|
||||||
|
|
|
@ -4483,7 +4483,7 @@ func checkDoesNotHaveImplicitDep(t *testing.T, m android.TestingModule, name str
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSanitizeMemtagHeap(t *testing.T) {
|
func TestSanitizeMemtagHeap(t *testing.T) {
|
||||||
ctx := testCc(t, `
|
rootBp := `
|
||||||
cc_library_static {
|
cc_library_static {
|
||||||
name: "libstatic",
|
name: "libstatic",
|
||||||
sanitize: { memtag_heap: true },
|
sanitize: { memtag_heap: true },
|
||||||
|
@ -4543,7 +4543,37 @@ func TestSanitizeMemtagHeap(t *testing.T) {
|
||||||
sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
|
sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
|
||||||
}
|
}
|
||||||
|
|
||||||
`)
|
`
|
||||||
|
|
||||||
|
subdirAsyncBp := `
|
||||||
|
cc_binary {
|
||||||
|
name: "binary_async",
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
subdirSyncBp := `
|
||||||
|
cc_binary {
|
||||||
|
name: "binary_sync",
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
mockFS := map[string][]byte{
|
||||||
|
"subdir_async/Android.bp": []byte(subdirAsyncBp),
|
||||||
|
"subdir_sync/Android.bp": []byte(subdirSyncBp),
|
||||||
|
}
|
||||||
|
|
||||||
|
config := TestConfig(buildDir, android.Android, nil, rootBp, mockFS)
|
||||||
|
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||||
|
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||||
|
config.TestProductVariables.MemtagHeapAsyncIncludePaths = []string{"subdir_async"}
|
||||||
|
config.TestProductVariables.MemtagHeapSyncIncludePaths = []string{"subdir_sync"}
|
||||||
|
ctx := CreateTestContext(config)
|
||||||
|
ctx.Register()
|
||||||
|
|
||||||
|
_, errs := ctx.ParseFileList(".", []string{"Android.bp", "subdir_sync/Android.bp", "subdir_async/Android.bp"})
|
||||||
|
android.FailIfErrored(t, errs)
|
||||||
|
_, errs = ctx.PrepareBuildActions(config)
|
||||||
|
android.FailIfErrored(t, errs)
|
||||||
|
|
||||||
variant := "android_arm64_armv8-a"
|
variant := "android_arm64_armv8-a"
|
||||||
note_async := "note_memtag_heap_async"
|
note_async := "note_memtag_heap_async"
|
||||||
|
@ -4562,4 +4592,7 @@ func TestSanitizeMemtagHeap(t *testing.T) {
|
||||||
checkHasImplicitDep(t, ctx.ModuleForTests("test_true", variant), note_async)
|
checkHasImplicitDep(t, ctx.ModuleForTests("test_true", variant), note_async)
|
||||||
checkDoesNotHaveImplicitDep(t, ctx.ModuleForTests("test_false", variant), note_any)
|
checkDoesNotHaveImplicitDep(t, ctx.ModuleForTests("test_false", variant), note_any)
|
||||||
checkHasImplicitDep(t, ctx.ModuleForTests("test_true_async", variant), note_async)
|
checkHasImplicitDep(t, ctx.ModuleForTests("test_true_async", variant), note_async)
|
||||||
|
|
||||||
|
checkHasImplicitDep(t, ctx.ModuleForTests("binary_async", variant), note_async)
|
||||||
|
checkHasImplicitDep(t, ctx.ModuleForTests("binary_sync", variant), note_sync)
|
||||||
}
|
}
|
||||||
|
|
|
@ -338,7 +338,9 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) {
|
||||||
s.Writeonly = boolPtr(true)
|
s.Writeonly = boolPtr(true)
|
||||||
}
|
}
|
||||||
if found, globalSanitizers = removeFromList("memtag_heap", globalSanitizers); found && s.Memtag_heap == nil {
|
if found, globalSanitizers = removeFromList("memtag_heap", globalSanitizers); found && s.Memtag_heap == nil {
|
||||||
s.Memtag_heap = boolPtr(true)
|
if !ctx.Config().MemtagHeapDisabledForPath(ctx.ModuleDir()) {
|
||||||
|
s.Memtag_heap = boolPtr(true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(globalSanitizers) > 0 {
|
if len(globalSanitizers) > 0 {
|
||||||
|
@ -363,8 +365,21 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) {
|
||||||
|
|
||||||
// cc_test targets default to SYNC MemTag.
|
// cc_test targets default to SYNC MemTag.
|
||||||
if ctx.testBinary() && s.Memtag_heap == nil {
|
if ctx.testBinary() && s.Memtag_heap == nil {
|
||||||
s.Memtag_heap = boolPtr(true)
|
if !ctx.Config().MemtagHeapDisabledForPath(ctx.ModuleDir()) {
|
||||||
s.Diag.Memtag_heap = boolPtr(true)
|
s.Memtag_heap = boolPtr(true)
|
||||||
|
s.Diag.Memtag_heap = boolPtr(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable Memtag for all components in the include paths (for Aarch64 only)
|
||||||
|
if s.Memtag_heap == nil && ctx.Arch().ArchType == android.Arm64 {
|
||||||
|
if ctx.Config().MemtagHeapSyncEnabledForPath(ctx.ModuleDir()) {
|
||||||
|
s.Memtag_heap = boolPtr(true)
|
||||||
|
s.Diag.Memtag_heap = boolPtr(true)
|
||||||
|
} else if ctx.Config().MemtagHeapAsyncEnabledForPath(ctx.ModuleDir()) {
|
||||||
|
s.Memtag_heap = boolPtr(true)
|
||||||
|
s.Diag.Memtag_heap = boolPtr(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable CFI for all components in the include paths (for Aarch64 only)
|
// Enable CFI for all components in the include paths (for Aarch64 only)
|
||||||
|
|
Loading…
Reference in New Issue