blob: 48ac6507db3071bde84b18cad682f4581287ee50 [file] [log] [blame]
Colin Crossaf98f582021-05-12 17:27:32 -07001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17import (
Liz Kammerbb8d84f2021-06-21 12:53:03 -040018 "fmt"
Colin Cross3e5e7782022-06-17 22:17:05 +000019 "runtime"
Liz Kammerbb8d84f2021-06-21 12:53:03 -040020 "strings"
Colin Crossaf98f582021-05-12 17:27:32 -070021 "testing"
22
23 "android/soong/android"
24)
25
26var prepareForAsanTest = android.FixtureAddFile("asan/Android.bp", []byte(`
27 cc_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -080028 name: "libclang_rt.asan",
Colin Crossaf98f582021-05-12 17:27:32 -070029 }
30`))
31
32func TestAsan(t *testing.T) {
33 bp := `
34 cc_binary {
35 name: "bin_with_asan",
36 host_supported: true,
37 shared_libs: [
38 "libshared",
39 "libasan",
40 ],
41 static_libs: [
42 "libstatic",
43 "libnoasan",
44 ],
45 sanitize: {
46 address: true,
47 }
48 }
49
50 cc_binary {
51 name: "bin_no_asan",
52 host_supported: true,
53 shared_libs: [
54 "libshared",
55 "libasan",
56 ],
57 static_libs: [
58 "libstatic",
59 "libnoasan",
60 ],
61 }
62
63 cc_library_shared {
64 name: "libshared",
65 host_supported: true,
66 shared_libs: ["libtransitive"],
67 }
68
69 cc_library_shared {
70 name: "libasan",
71 host_supported: true,
72 shared_libs: ["libtransitive"],
73 sanitize: {
74 address: true,
75 }
76 }
77
78 cc_library_shared {
79 name: "libtransitive",
80 host_supported: true,
81 }
82
83 cc_library_static {
84 name: "libstatic",
85 host_supported: true,
86 }
87
88 cc_library_static {
89 name: "libnoasan",
90 host_supported: true,
91 sanitize: {
92 address: false,
93 }
94 }
95 `
96
97 result := android.GroupFixturePreparers(
98 prepareForCcTest,
99 prepareForAsanTest,
100 ).RunTestWithBp(t, bp)
101
102 check := func(t *testing.T, result *android.TestResult, variant string) {
103 asanVariant := variant + "_asan"
104 sharedVariant := variant + "_shared"
105 sharedAsanVariant := sharedVariant + "_asan"
106 staticVariant := variant + "_static"
107 staticAsanVariant := staticVariant + "_asan"
108
109 // The binaries, one with asan and one without
110 binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant)
111 binNoAsan := result.ModuleForTests("bin_no_asan", variant)
112
113 // Shared libraries that don't request asan
114 libShared := result.ModuleForTests("libshared", sharedVariant)
115 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
116
117 // Shared library that requests asan
118 libAsan := result.ModuleForTests("libasan", sharedAsanVariant)
119
120 // Static library that uses an asan variant for bin_with_asan and a non-asan variant
121 // for bin_no_asan.
122 libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant)
123 libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant)
124
125 // Static library that never uses asan.
126 libNoAsan := result.ModuleForTests("libnoasan", staticVariant)
127
128 // expectSharedLinkDep verifies that the from module links against the to module as a
129 // shared library.
130 expectSharedLinkDep := func(from, to android.TestingModule) {
131 t.Helper()
132 fromLink := from.Description("link")
133 toLink := to.Description("strip")
134
135 if g, w := fromLink.OrderOnly.Strings(), toLink.Output.String(); !android.InList(w, g) {
136 t.Errorf("%s should link against %s, expected %q, got %q",
137 from.Module(), to.Module(), w, g)
138 }
139 }
140
141 // expectStaticLinkDep verifies that the from module links against the to module as a
142 // static library.
143 expectStaticLinkDep := func(from, to android.TestingModule) {
144 t.Helper()
145 fromLink := from.Description("link")
146 toLink := to.Description("static link")
147
148 if g, w := fromLink.Implicits.Strings(), toLink.Output.String(); !android.InList(w, g) {
149 t.Errorf("%s should link against %s, expected %q, got %q",
150 from.Module(), to.Module(), w, g)
151 }
152
153 }
154
155 // expectInstallDep verifies that the install rule of the from module depends on the
156 // install rule of the to module.
157 expectInstallDep := func(from, to android.TestingModule) {
158 t.Helper()
159 fromInstalled := from.Description("install")
160 toInstalled := to.Description("install")
161
162 // combine implicits and order-only dependencies, host uses implicit but device uses
163 // order-only.
164 got := append(fromInstalled.Implicits.Strings(), fromInstalled.OrderOnly.Strings()...)
165 want := toInstalled.Output.String()
166 if !android.InList(want, got) {
167 t.Errorf("%s installation should depend on %s, expected %q, got %q",
168 from.Module(), to.Module(), want, got)
169 }
170 }
171
172 expectSharedLinkDep(binWithAsan, libShared)
173 expectSharedLinkDep(binWithAsan, libAsan)
174 expectSharedLinkDep(libShared, libTransitive)
175 expectSharedLinkDep(libAsan, libTransitive)
176
177 expectStaticLinkDep(binWithAsan, libStaticAsanVariant)
178 expectStaticLinkDep(binWithAsan, libNoAsan)
179
180 expectInstallDep(binWithAsan, libShared)
181 expectInstallDep(binWithAsan, libAsan)
182 expectInstallDep(binWithAsan, libTransitive)
183 expectInstallDep(libShared, libTransitive)
184 expectInstallDep(libAsan, libTransitive)
185
186 expectSharedLinkDep(binNoAsan, libShared)
187 expectSharedLinkDep(binNoAsan, libAsan)
188 expectSharedLinkDep(libShared, libTransitive)
189 expectSharedLinkDep(libAsan, libTransitive)
190
191 expectStaticLinkDep(binNoAsan, libStaticNoAsanVariant)
192 expectStaticLinkDep(binNoAsan, libNoAsan)
193
194 expectInstallDep(binNoAsan, libShared)
195 expectInstallDep(binNoAsan, libAsan)
196 expectInstallDep(binNoAsan, libTransitive)
197 expectInstallDep(libShared, libTransitive)
198 expectInstallDep(libAsan, libTransitive)
199 }
200
201 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
202 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
203}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400204
Colin Cross3e5e7782022-06-17 22:17:05 +0000205func TestUbsan(t *testing.T) {
206 if runtime.GOOS != "linux" {
207 t.Skip("requires linux")
208 }
209
210 bp := `
211 cc_binary {
212 name: "bin_with_ubsan",
213 host_supported: true,
214 shared_libs: [
215 "libshared",
216 ],
217 static_libs: [
218 "libstatic",
219 "libnoubsan",
220 ],
221 sanitize: {
222 undefined: true,
223 }
224 }
225
226 cc_binary {
227 name: "bin_depends_ubsan",
228 host_supported: true,
229 shared_libs: [
230 "libshared",
231 ],
232 static_libs: [
233 "libstatic",
234 "libubsan",
235 "libnoubsan",
236 ],
237 }
238
239 cc_binary {
240 name: "bin_no_ubsan",
241 host_supported: true,
242 shared_libs: [
243 "libshared",
244 ],
245 static_libs: [
246 "libstatic",
247 "libnoubsan",
248 ],
249 }
250
251 cc_library_shared {
252 name: "libshared",
253 host_supported: true,
254 shared_libs: ["libtransitive"],
255 }
256
257 cc_library_shared {
258 name: "libtransitive",
259 host_supported: true,
260 }
261
262 cc_library_static {
263 name: "libubsan",
264 host_supported: true,
265 sanitize: {
266 undefined: true,
267 }
268 }
269
270 cc_library_static {
271 name: "libstatic",
272 host_supported: true,
273 }
274
275 cc_library_static {
276 name: "libnoubsan",
277 host_supported: true,
278 }
279 `
280
281 result := android.GroupFixturePreparers(
282 prepareForCcTest,
283 ).RunTestWithBp(t, bp)
284
285 check := func(t *testing.T, result *android.TestResult, variant string) {
286 staticVariant := variant + "_static"
287
288 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
289
290 // The binaries, one with ubsan and one without
291 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
292 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan", variant)
293 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
294
295 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
296 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
297 minimalRuntime.OutputFiles(t, "")[0].String())
298
299 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan static libs",
300 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
301 minimalRuntime.OutputFiles(t, "")[0].String())
302
303 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
304 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
305 minimalRuntime.OutputFiles(t, "")[0].String())
306
307 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
308 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
309 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
310
311 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan static libs",
312 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
313 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
314
315 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
316 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
317 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
318 }
319
320 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
321 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
322}
323
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400324type MemtagNoteType int
325
326const (
327 None MemtagNoteType = iota + 1
328 Sync
329 Async
330)
331
332func (t MemtagNoteType) str() string {
333 switch t {
334 case None:
335 return "none"
336 case Sync:
337 return "sync"
338 case Async:
339 return "async"
340 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400341 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400342 }
343}
344
345func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400346 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400347
348 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000349 ldFlags := m.Rule("ld").Args["ldFlags"]
350 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
351 found = Async
352 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
353 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400354 }
355
356 if found != expected {
357 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
358 }
359}
360
361var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
362 android.FixtureModifyMockFS(func(fs android.MockFS) {
363 templateBp := `
364 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400365 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400366 gtest: false,
367 }
368
369 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400370 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400371 gtest: false,
372 sanitize: { memtag_heap: false },
373 }
374
375 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400376 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400377 gtest: false,
378 sanitize: { memtag_heap: true },
379 }
380
381 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400382 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400383 gtest: false,
384 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
385 }
386
387 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400388 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400389 gtest: false,
390 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
391 }
392
Liz Kammerd56ddb52021-06-21 17:37:39 -0400393 cc_test {
394 name: "unset_memtag_set_sync_test_%[1]s",
395 gtest: false,
396 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400397 }
398
399 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400400 name: "unset_binary_%[1]s",
401 }
402
403 cc_binary {
404 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400405 sanitize: { memtag_heap: false },
406 }
407
408 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400409 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400410 sanitize: { memtag_heap: true },
411 }
412
413 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400414 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400415 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
416 }
417
418 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400419 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400420 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
421 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400422
423 cc_binary {
424 name: "unset_memtag_set_sync_binary_%[1]s",
425 sanitize: { diag: { memtag_heap: true } },
426 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400427 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400428 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
429 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
430 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
431 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400432
433 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400434 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
435 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
436 "subdir_sync/Android.bp": []byte(subdirSyncBp),
437 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400438 })
439 }),
440 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400441 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
442 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
443 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
444 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400445 }),
446)
447
448func TestSanitizeMemtagHeap(t *testing.T) {
449 variant := "android_arm64_armv8-a"
450
451 result := android.GroupFixturePreparers(
452 prepareForCcTest,
453 prepareForTestWithMemtagHeap,
454 ).RunTest(t)
455 ctx := result.TestContext
456
Liz Kammerd56ddb52021-06-21 17:37:39 -0400457 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
458 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
459 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
460 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400461
Liz Kammerd56ddb52021-06-21 17:37:39 -0400462 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
463 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
464 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
465 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400466
Liz Kammerd56ddb52021-06-21 17:37:39 -0400467 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
468 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
469 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
470 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400471
Liz Kammer7b920b42021-06-22 16:57:27 -0400472 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
473 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
474 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400475 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400476
Liz Kammerd56ddb52021-06-21 17:37:39 -0400477 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
478 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
479 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
480 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400481
Liz Kammerd56ddb52021-06-21 17:37:39 -0400482 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
483 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
484 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
485 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400486
Liz Kammerd56ddb52021-06-21 17:37:39 -0400487 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
488 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
489 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
490 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400491
Liz Kammerd56ddb52021-06-21 17:37:39 -0400492 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
493 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
494 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
495 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
496
497 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
498 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
499 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
500 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
501 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
502 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
503
504 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
505 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
506 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
507 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
508
509 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
510 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
511 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
512 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
513
514 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
515 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
516 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
517 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400518}
519
520func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
521 variant := "android_arm64_armv8-a"
522
523 result := android.GroupFixturePreparers(
524 prepareForCcTest,
525 prepareForTestWithMemtagHeap,
526 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
527 variables.SanitizeDevice = []string{"memtag_heap"}
528 }),
529 ).RunTest(t)
530 ctx := result.TestContext
531
Liz Kammerd56ddb52021-06-21 17:37:39 -0400532 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
533 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
534 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
535 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400536
Liz Kammerd56ddb52021-06-21 17:37:39 -0400537 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
538 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
539 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
540 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400541
Liz Kammerd56ddb52021-06-21 17:37:39 -0400542 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
543 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
544 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
545 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400546
Liz Kammer7b920b42021-06-22 16:57:27 -0400547 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
548 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
549 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400550 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400551
Liz Kammerd56ddb52021-06-21 17:37:39 -0400552 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
553 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
554 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
555 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400556
Liz Kammerd56ddb52021-06-21 17:37:39 -0400557 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
558 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
559 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
560 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400561
Liz Kammerd56ddb52021-06-21 17:37:39 -0400562 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
563 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
564 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
565 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400566
Liz Kammerd56ddb52021-06-21 17:37:39 -0400567 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
568 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
569 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
570 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
571
572 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
573 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
574 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
575 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
576 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
577
578 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
579 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
580 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
581 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
582
583 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
584 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
585 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
586 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
587
588 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
589 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
590 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
591 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400592}
593
594func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
595 variant := "android_arm64_armv8-a"
596
597 result := android.GroupFixturePreparers(
598 prepareForCcTest,
599 prepareForTestWithMemtagHeap,
600 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
601 variables.SanitizeDevice = []string{"memtag_heap"}
602 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
603 }),
604 ).RunTest(t)
605 ctx := result.TestContext
606
Liz Kammerd56ddb52021-06-21 17:37:39 -0400607 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
608 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
609 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
610 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400611
Liz Kammerd56ddb52021-06-21 17:37:39 -0400612 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
613 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
614 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
615 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400616
Liz Kammerd56ddb52021-06-21 17:37:39 -0400617 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
618 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
619 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
620 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400621
Liz Kammerd56ddb52021-06-21 17:37:39 -0400622 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
623 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
624 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
625 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400626
Liz Kammerd56ddb52021-06-21 17:37:39 -0400627 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
628 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
629 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
630 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400631
Liz Kammerd56ddb52021-06-21 17:37:39 -0400632 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
633 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
634 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
635 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400636
Liz Kammerd56ddb52021-06-21 17:37:39 -0400637 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
638 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
639 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
640 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400641
Liz Kammerd56ddb52021-06-21 17:37:39 -0400642 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
643 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
644 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
645 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
646
647 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
648 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
649 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
650 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
651 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
652
653 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
654 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
655 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
656 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
657
658 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
659 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
660 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
661 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
662
663 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
664 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
665 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
666 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400667}