blob: 5d7e7d80a1d3f6c727f931e784324d5d1d94fb0a [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()
Florian Mayer00ab5cf2022-08-31 18:30:18 +0000347 note_async := "note_memtag_heap_async"
348 note_sync := "note_memtag_heap_sync"
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400349
350 found := None
Florian Mayer00ab5cf2022-08-31 18:30:18 +0000351 implicits := m.Rule("ld").Implicits
352 for _, lib := range implicits {
353 if strings.Contains(lib.Rel(), note_async) {
354 found = Async
355 break
356 } else if strings.Contains(lib.Rel(), note_sync) {
357 found = Sync
358 break
359 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400360 }
361
362 if found != expected {
363 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
364 }
365}
366
367var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
368 android.FixtureModifyMockFS(func(fs android.MockFS) {
369 templateBp := `
370 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400371 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400372 gtest: false,
373 }
374
375 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400376 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400377 gtest: false,
378 sanitize: { memtag_heap: false },
379 }
380
381 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400382 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400383 gtest: false,
384 sanitize: { memtag_heap: true },
385 }
386
387 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400388 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400389 gtest: false,
390 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
391 }
392
393 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400394 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400395 gtest: false,
396 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
397 }
398
Liz Kammerd56ddb52021-06-21 17:37:39 -0400399 cc_test {
400 name: "unset_memtag_set_sync_test_%[1]s",
401 gtest: false,
402 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400403 }
404
405 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400406 name: "unset_binary_%[1]s",
407 }
408
409 cc_binary {
410 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400411 sanitize: { memtag_heap: false },
412 }
413
414 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400415 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400416 sanitize: { memtag_heap: true },
417 }
418
419 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400420 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400421 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
422 }
423
424 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400425 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400426 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
427 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400428
429 cc_binary {
430 name: "unset_memtag_set_sync_binary_%[1]s",
431 sanitize: { diag: { memtag_heap: true } },
432 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400433 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400434 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
435 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
436 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
437 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400438
439 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400440 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
441 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
442 "subdir_sync/Android.bp": []byte(subdirSyncBp),
443 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400444 })
445 }),
446 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400447 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
448 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
449 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
450 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400451 }),
452)
453
454func TestSanitizeMemtagHeap(t *testing.T) {
455 variant := "android_arm64_armv8-a"
456
457 result := android.GroupFixturePreparers(
458 prepareForCcTest,
459 prepareForTestWithMemtagHeap,
460 ).RunTest(t)
461 ctx := result.TestContext
462
Liz Kammerd56ddb52021-06-21 17:37:39 -0400463 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
464 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
465 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
466 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400467
Liz Kammerd56ddb52021-06-21 17:37:39 -0400468 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
469 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
470 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
471 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400472
Liz Kammerd56ddb52021-06-21 17:37:39 -0400473 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
474 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
475 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
476 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400477
Liz Kammer7b920b42021-06-22 16:57:27 -0400478 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
479 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
480 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400481 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400482
Liz Kammerd56ddb52021-06-21 17:37:39 -0400483 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
484 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
485 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
486 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400487
Liz Kammerd56ddb52021-06-21 17:37:39 -0400488 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
489 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
490 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
491 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400492
Liz Kammerd56ddb52021-06-21 17:37:39 -0400493 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
494 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
495 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
496 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400497
Liz Kammerd56ddb52021-06-21 17:37:39 -0400498 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
499 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
500 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
501 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
502
503 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
504 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
505 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
506 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
507 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
508 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
509
510 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
511 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
512 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
513 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
514
515 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
516 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
517 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
518 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
519
520 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
521 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
522 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
523 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400524}
525
526func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
527 variant := "android_arm64_armv8-a"
528
529 result := android.GroupFixturePreparers(
530 prepareForCcTest,
531 prepareForTestWithMemtagHeap,
532 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
533 variables.SanitizeDevice = []string{"memtag_heap"}
534 }),
535 ).RunTest(t)
536 ctx := result.TestContext
537
Liz Kammerd56ddb52021-06-21 17:37:39 -0400538 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
539 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
540 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
541 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400542
Liz Kammerd56ddb52021-06-21 17:37:39 -0400543 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
544 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
545 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
546 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400547
Liz Kammerd56ddb52021-06-21 17:37:39 -0400548 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
549 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
550 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
551 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400552
Liz Kammer7b920b42021-06-22 16:57:27 -0400553 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
554 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
555 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400556 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400557
Liz Kammerd56ddb52021-06-21 17:37:39 -0400558 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
559 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
560 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
561 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400562
Liz Kammerd56ddb52021-06-21 17:37:39 -0400563 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
564 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
565 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
566 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400567
Liz Kammerd56ddb52021-06-21 17:37:39 -0400568 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
569 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
570 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
571 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400572
Liz Kammerd56ddb52021-06-21 17:37:39 -0400573 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
574 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
575 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
576 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
577
578 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
579 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
580 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
581 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
582 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
583
584 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
585 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
586 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
587 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
588
589 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
590 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
591 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
592 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
593
594 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
595 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
596 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
597 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400598}
599
600func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
601 variant := "android_arm64_armv8-a"
602
603 result := android.GroupFixturePreparers(
604 prepareForCcTest,
605 prepareForTestWithMemtagHeap,
606 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
607 variables.SanitizeDevice = []string{"memtag_heap"}
608 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
609 }),
610 ).RunTest(t)
611 ctx := result.TestContext
612
Liz Kammerd56ddb52021-06-21 17:37:39 -0400613 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
614 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
615 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
616 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400617
Liz Kammerd56ddb52021-06-21 17:37:39 -0400618 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
619 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
620 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
621 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400622
Liz Kammerd56ddb52021-06-21 17:37:39 -0400623 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
624 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
625 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
626 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400627
Liz Kammerd56ddb52021-06-21 17:37:39 -0400628 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
629 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
630 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
631 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400632
Liz Kammerd56ddb52021-06-21 17:37:39 -0400633 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
634 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
635 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
636 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400637
Liz Kammerd56ddb52021-06-21 17:37:39 -0400638 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
639 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
640 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
641 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400642
Liz Kammerd56ddb52021-06-21 17:37:39 -0400643 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
644 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
645 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
646 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400647
Liz Kammerd56ddb52021-06-21 17:37:39 -0400648 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
649 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
650 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
651 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
652
653 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
654 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
655 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
656 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
657 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
658
659 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
660 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
661 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
662 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
663
664 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
665 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
666 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
667 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
668
669 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
670 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
671 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
672 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400673}