blob: f084c7698c6f0567edb29c15f523b726fdf07345 [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"
Liz Kammer92c72592022-10-31 14:44:28 -040024
25 "github.com/google/blueprint"
Colin Crossaf98f582021-05-12 17:27:32 -070026)
27
28var prepareForAsanTest = android.FixtureAddFile("asan/Android.bp", []byte(`
29 cc_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -080030 name: "libclang_rt.asan",
Colin Crossaf98f582021-05-12 17:27:32 -070031 }
32`))
33
Liz Kammerfd8a49f2022-10-31 10:31:11 -040034var prepareForTsanTest = android.FixtureAddFile("tsan/Android.bp", []byte(`
35 cc_library_shared {
36 name: "libclang_rt.tsan",
37 }
38`))
39
Liz Kammer92c72592022-10-31 14:44:28 -040040type providerInterface interface {
41 ModuleProvider(blueprint.Module, blueprint.ProviderKey) interface{}
42}
43
Liz Kammerfd8a49f2022-10-31 10:31:11 -040044// expectSharedLinkDep verifies that the from module links against the to module as a
45// shared library.
Liz Kammer92c72592022-10-31 14:44:28 -040046func expectSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040047 t.Helper()
48 fromLink := from.Description("link")
Liz Kammer92c72592022-10-31 14:44:28 -040049 toInfo := ctx.ModuleProvider(to.Module(), SharedLibraryInfoProvider).(SharedLibraryInfo)
Liz Kammerfd8a49f2022-10-31 10:31:11 -040050
Liz Kammer92c72592022-10-31 14:44:28 -040051 if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); !android.InList(w, g) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040052 t.Errorf("%s should link against %s, expected %q, got %q",
53 from.Module(), to.Module(), w, g)
54 }
55}
56
57// expectStaticLinkDep verifies that the from module links against the to module as a
58// static library.
Liz Kammer92c72592022-10-31 14:44:28 -040059func expectStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040060 t.Helper()
61 fromLink := from.Description("link")
Liz Kammer92c72592022-10-31 14:44:28 -040062 toInfo := ctx.ModuleProvider(to.Module(), StaticLibraryInfoProvider).(StaticLibraryInfo)
Liz Kammerfd8a49f2022-10-31 10:31:11 -040063
Liz Kammer92c72592022-10-31 14:44:28 -040064 if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); !android.InList(w, g) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040065 t.Errorf("%s should link against %s, expected %q, got %q",
66 from.Module(), to.Module(), w, g)
67 }
68
69}
70
71// expectInstallDep verifies that the install rule of the from module depends on the
72// install rule of the to module.
73func expectInstallDep(t *testing.T, from, to android.TestingModule) {
74 t.Helper()
75 fromInstalled := from.Description("install")
76 toInstalled := to.Description("install")
77
78 // combine implicits and order-only dependencies, host uses implicit but device uses
79 // order-only.
80 got := append(fromInstalled.Implicits.Strings(), fromInstalled.OrderOnly.Strings()...)
81 want := toInstalled.Output.String()
82 if !android.InList(want, got) {
83 t.Errorf("%s installation should depend on %s, expected %q, got %q",
84 from.Module(), to.Module(), want, got)
85 }
86}
87
Colin Crossaf98f582021-05-12 17:27:32 -070088func TestAsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -040089 t.Parallel()
Colin Crossaf98f582021-05-12 17:27:32 -070090 bp := `
91 cc_binary {
92 name: "bin_with_asan",
93 host_supported: true,
94 shared_libs: [
95 "libshared",
96 "libasan",
97 ],
98 static_libs: [
99 "libstatic",
100 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400101 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700102 ],
103 sanitize: {
104 address: true,
105 }
106 }
107
108 cc_binary {
109 name: "bin_no_asan",
110 host_supported: true,
111 shared_libs: [
112 "libshared",
113 "libasan",
114 ],
115 static_libs: [
116 "libstatic",
117 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400118 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700119 ],
120 }
121
122 cc_library_shared {
123 name: "libshared",
124 host_supported: true,
125 shared_libs: ["libtransitive"],
126 }
127
128 cc_library_shared {
129 name: "libasan",
130 host_supported: true,
131 shared_libs: ["libtransitive"],
132 sanitize: {
133 address: true,
134 }
135 }
136
137 cc_library_shared {
138 name: "libtransitive",
139 host_supported: true,
140 }
141
142 cc_library_static {
143 name: "libstatic",
144 host_supported: true,
145 }
146
147 cc_library_static {
148 name: "libnoasan",
149 host_supported: true,
150 sanitize: {
151 address: false,
152 }
153 }
Liz Kammerecc659c2022-10-28 16:27:13 -0400154
155 cc_library_static {
156 name: "libstatic_asan",
157 host_supported: true,
158 sanitize: {
159 address: true,
160 }
161 }
162
Colin Crossaf98f582021-05-12 17:27:32 -0700163 `
164
165 result := android.GroupFixturePreparers(
166 prepareForCcTest,
167 prepareForAsanTest,
168 ).RunTestWithBp(t, bp)
169
170 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400171 ctx := result.TestContext
Colin Crossaf98f582021-05-12 17:27:32 -0700172 asanVariant := variant + "_asan"
173 sharedVariant := variant + "_shared"
174 sharedAsanVariant := sharedVariant + "_asan"
175 staticVariant := variant + "_static"
176 staticAsanVariant := staticVariant + "_asan"
177
178 // The binaries, one with asan and one without
179 binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant)
180 binNoAsan := result.ModuleForTests("bin_no_asan", variant)
181
182 // Shared libraries that don't request asan
183 libShared := result.ModuleForTests("libshared", sharedVariant)
184 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
185
186 // Shared library that requests asan
187 libAsan := result.ModuleForTests("libasan", sharedAsanVariant)
188
189 // Static library that uses an asan variant for bin_with_asan and a non-asan variant
190 // for bin_no_asan.
191 libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant)
192 libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant)
193
194 // Static library that never uses asan.
195 libNoAsan := result.ModuleForTests("libnoasan", staticVariant)
196
Liz Kammerecc659c2022-10-28 16:27:13 -0400197 // Static library that specifies asan
198 libStaticAsan := result.ModuleForTests("libstatic_asan", staticAsanVariant)
199 libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
200
Liz Kammer92c72592022-10-31 14:44:28 -0400201 expectSharedLinkDep(t, ctx, binWithAsan, libShared)
202 expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
203 expectSharedLinkDep(t, ctx, libShared, libTransitive)
204 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700205
Liz Kammer92c72592022-10-31 14:44:28 -0400206 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsanVariant)
207 expectStaticLinkDep(t, ctx, binWithAsan, libNoAsan)
208 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsan)
Colin Crossaf98f582021-05-12 17:27:32 -0700209
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400210 expectInstallDep(t, binWithAsan, libShared)
211 expectInstallDep(t, binWithAsan, libAsan)
212 expectInstallDep(t, binWithAsan, libTransitive)
213 expectInstallDep(t, libShared, libTransitive)
214 expectInstallDep(t, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700215
Liz Kammer92c72592022-10-31 14:44:28 -0400216 expectSharedLinkDep(t, ctx, binNoAsan, libShared)
217 expectSharedLinkDep(t, ctx, binNoAsan, libAsan)
218 expectSharedLinkDep(t, ctx, libShared, libTransitive)
219 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700220
Liz Kammer92c72592022-10-31 14:44:28 -0400221 expectStaticLinkDep(t, ctx, binNoAsan, libStaticNoAsanVariant)
222 expectStaticLinkDep(t, ctx, binNoAsan, libNoAsan)
223 expectStaticLinkDep(t, ctx, binNoAsan, libStaticAsanNoAsanVariant)
Colin Crossaf98f582021-05-12 17:27:32 -0700224
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400225 expectInstallDep(t, binNoAsan, libShared)
226 expectInstallDep(t, binNoAsan, libAsan)
227 expectInstallDep(t, binNoAsan, libTransitive)
228 expectInstallDep(t, libShared, libTransitive)
229 expectInstallDep(t, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700230 }
231
232 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
233 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
234}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400235
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400236func TestTsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400237 t.Parallel()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400238 bp := `
239 cc_binary {
240 name: "bin_with_tsan",
241 host_supported: true,
242 shared_libs: [
243 "libshared",
244 "libtsan",
245 ],
246 sanitize: {
247 thread: true,
248 }
249 }
250
251 cc_binary {
252 name: "bin_no_tsan",
253 host_supported: true,
254 shared_libs: [
255 "libshared",
256 "libtsan",
257 ],
258 }
259
260 cc_library_shared {
261 name: "libshared",
262 host_supported: true,
263 shared_libs: ["libtransitive"],
264 }
265
266 cc_library_shared {
267 name: "libtsan",
268 host_supported: true,
269 shared_libs: ["libtransitive"],
270 sanitize: {
271 thread: true,
272 }
273 }
274
275 cc_library_shared {
276 name: "libtransitive",
277 host_supported: true,
278 }
279`
280
281 result := android.GroupFixturePreparers(
282 prepareForCcTest,
283 prepareForTsanTest,
284 ).RunTestWithBp(t, bp)
285
286 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400287 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400288 tsanVariant := variant + "_tsan"
289 sharedVariant := variant + "_shared"
290 sharedTsanVariant := sharedVariant + "_tsan"
291
292 // The binaries, one with tsan and one without
293 binWithTsan := result.ModuleForTests("bin_with_tsan", tsanVariant)
294 binNoTsan := result.ModuleForTests("bin_no_tsan", variant)
295
296 // Shared libraries that don't request tsan
297 libShared := result.ModuleForTests("libshared", sharedVariant)
298 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
299
300 // Shared library that requests tsan
301 libTsan := result.ModuleForTests("libtsan", sharedTsanVariant)
302
Liz Kammer92c72592022-10-31 14:44:28 -0400303 expectSharedLinkDep(t, ctx, binWithTsan, libShared)
304 expectSharedLinkDep(t, ctx, binWithTsan, libTsan)
305 expectSharedLinkDep(t, ctx, libShared, libTransitive)
306 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400307
Liz Kammer92c72592022-10-31 14:44:28 -0400308 expectSharedLinkDep(t, ctx, binNoTsan, libShared)
309 expectSharedLinkDep(t, ctx, binNoTsan, libTsan)
310 expectSharedLinkDep(t, ctx, libShared, libTransitive)
311 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
312 }
313
314 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
315 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
316}
317
318func TestMiscUndefined(t *testing.T) {
Liz Kammer2a109bc2022-12-02 09:36:01 -0500319 if runtime.GOOS != "linux" {
320 t.Skip("requires linux")
321 }
322
Liz Kammer7c5d1592022-10-31 16:27:38 -0400323 t.Parallel()
Liz Kammer92c72592022-10-31 14:44:28 -0400324 bp := `
325 cc_binary {
326 name: "bin_with_ubsan",
327 srcs: ["src.cc"],
328 host_supported: true,
329 static_libs: [
330 "libstatic",
331 "libubsan",
332 ],
333 sanitize: {
334 misc_undefined: ["integer"],
335 }
336 }
337
338 cc_binary {
339 name: "bin_no_ubsan",
340 host_supported: true,
341 srcs: ["src.cc"],
342 static_libs: [
343 "libstatic",
344 "libubsan",
345 ],
346 }
347
348 cc_library_static {
349 name: "libstatic",
350 host_supported: true,
351 srcs: ["src.cc"],
352 static_libs: ["libtransitive"],
353 }
354
355 cc_library_static {
356 name: "libubsan",
357 host_supported: true,
358 srcs: ["src.cc"],
359 whole_static_libs: ["libtransitive"],
360 sanitize: {
361 misc_undefined: ["integer"],
362 }
363 }
364
365 cc_library_static {
366 name: "libtransitive",
367 host_supported: true,
368 srcs: ["src.cc"],
369 }
370`
371
372 result := android.GroupFixturePreparers(
373 prepareForCcTest,
374 ).RunTestWithBp(t, bp)
375
376 check := func(t *testing.T, result *android.TestResult, variant string) {
377 ctx := result.TestContext
378 staticVariant := variant + "_static"
379
380 // The binaries, one with ubsan and one without
381 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
382 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
383
384 // Static libraries that don't request ubsan
385 libStatic := result.ModuleForTests("libstatic", staticVariant)
386 libTransitive := result.ModuleForTests("libtransitive", staticVariant)
387
388 libUbsan := result.ModuleForTests("libubsan", staticVariant)
389
390 libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
391
392 expectStaticLinkDep(t, ctx, binWithUbsan, libStatic)
393 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan)
394 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsanMinimal)
395
396 miscUndefinedSanFlag := "-fsanitize=integer"
397 binWithUbsanCflags := binWithUbsan.Rule("cc").Args["cFlags"]
398 if !strings.Contains(binWithUbsanCflags, miscUndefinedSanFlag) {
399 t.Errorf("'bin_with_ubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
400 }
401 libStaticCflags := libStatic.Rule("cc").Args["cFlags"]
402 if strings.Contains(libStaticCflags, miscUndefinedSanFlag) {
403 t.Errorf("'libstatic' Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
404 }
405 libUbsanCflags := libUbsan.Rule("cc").Args["cFlags"]
406 if !strings.Contains(libUbsanCflags, miscUndefinedSanFlag) {
407 t.Errorf("'libubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
408 }
409 libTransitiveCflags := libTransitive.Rule("cc").Args["cFlags"]
410 if strings.Contains(libTransitiveCflags, miscUndefinedSanFlag) {
411 t.Errorf("'libtransitive': Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
412 }
413
414 expectStaticLinkDep(t, ctx, binNoUbsan, libStatic)
415 expectStaticLinkDep(t, ctx, binNoUbsan, libUbsan)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400416 }
417
418 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
419 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
420}
421
422func TestFuzz(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400423 t.Parallel()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400424 bp := `
425 cc_binary {
426 name: "bin_with_fuzzer",
427 host_supported: true,
428 shared_libs: [
429 "libshared",
430 "libfuzzer",
431 ],
432 static_libs: [
433 "libstatic",
434 "libnofuzzer",
435 "libstatic_fuzzer",
436 ],
437 sanitize: {
438 fuzzer: true,
439 }
440 }
441
442 cc_binary {
443 name: "bin_no_fuzzer",
444 host_supported: true,
445 shared_libs: [
446 "libshared",
447 "libfuzzer",
448 ],
449 static_libs: [
450 "libstatic",
451 "libnofuzzer",
452 "libstatic_fuzzer",
453 ],
454 }
455
456 cc_library_shared {
457 name: "libshared",
458 host_supported: true,
459 shared_libs: ["libtransitive"],
460 }
461
462 cc_library_shared {
463 name: "libfuzzer",
464 host_supported: true,
465 shared_libs: ["libtransitive"],
466 sanitize: {
467 fuzzer: true,
468 }
469 }
470
471 cc_library_shared {
472 name: "libtransitive",
473 host_supported: true,
474 }
475
476 cc_library_static {
477 name: "libstatic",
478 host_supported: true,
479 }
480
481 cc_library_static {
482 name: "libnofuzzer",
483 host_supported: true,
484 sanitize: {
485 fuzzer: false,
486 }
487 }
488
489 cc_library_static {
490 name: "libstatic_fuzzer",
491 host_supported: true,
492 }
493
494 `
495
496 result := android.GroupFixturePreparers(
497 prepareForCcTest,
498 ).RunTestWithBp(t, bp)
499
500 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400501 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400502 fuzzerVariant := variant + "_fuzzer"
503 sharedVariant := variant + "_shared"
504 sharedFuzzerVariant := sharedVariant + "_fuzzer"
505 staticVariant := variant + "_static"
506 staticFuzzerVariant := staticVariant + "_fuzzer"
507
508 // The binaries, one with fuzzer and one without
509 binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant)
510 binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant)
511
512 // Shared libraries that don't request fuzzer
513 libShared := result.ModuleForTests("libshared", sharedVariant)
514 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
515
516 // Shared libraries that don't request fuzzer
517 libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant)
518 libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant)
519
520 // Shared library that requests fuzzer
521 libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant)
522
523 // Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant
524 // for bin_no_fuzzer.
525 libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant)
526 libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant)
527
528 // Static library that never uses fuzzer.
529 libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant)
530
531 // Static library that specifies fuzzer
532 libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant)
533 libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant)
534
Liz Kammer92c72592022-10-31 14:44:28 -0400535 expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer)
536 expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer)
537 expectSharedLinkDep(t, ctx, libSharedFuzzer, libTransitiveFuzzer)
538 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400539
Liz Kammer92c72592022-10-31 14:44:28 -0400540 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzerVariant)
541 expectStaticLinkDep(t, ctx, binWithFuzzer, libNoFuzzer)
542 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400543
Liz Kammer92c72592022-10-31 14:44:28 -0400544 expectSharedLinkDep(t, ctx, binNoFuzzer, libShared)
545 expectSharedLinkDep(t, ctx, binNoFuzzer, libFuzzer)
546 expectSharedLinkDep(t, ctx, libShared, libTransitive)
547 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400548
Liz Kammer92c72592022-10-31 14:44:28 -0400549 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticNoFuzzerVariant)
550 expectStaticLinkDep(t, ctx, binNoFuzzer, libNoFuzzer)
551 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticFuzzerNoFuzzerVariant)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400552 }
553
554 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
555}
556
Colin Cross3e5e7782022-06-17 22:17:05 +0000557func TestUbsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400558 t.Parallel()
Colin Cross3e5e7782022-06-17 22:17:05 +0000559 if runtime.GOOS != "linux" {
560 t.Skip("requires linux")
561 }
562
563 bp := `
564 cc_binary {
565 name: "bin_with_ubsan",
566 host_supported: true,
567 shared_libs: [
568 "libshared",
569 ],
570 static_libs: [
571 "libstatic",
572 "libnoubsan",
573 ],
574 sanitize: {
575 undefined: true,
576 }
577 }
578
579 cc_binary {
580 name: "bin_depends_ubsan",
581 host_supported: true,
582 shared_libs: [
583 "libshared",
584 ],
585 static_libs: [
586 "libstatic",
587 "libubsan",
588 "libnoubsan",
589 ],
590 }
591
592 cc_binary {
593 name: "bin_no_ubsan",
594 host_supported: true,
595 shared_libs: [
596 "libshared",
597 ],
598 static_libs: [
599 "libstatic",
600 "libnoubsan",
601 ],
602 }
603
604 cc_library_shared {
605 name: "libshared",
606 host_supported: true,
607 shared_libs: ["libtransitive"],
608 }
609
610 cc_library_shared {
611 name: "libtransitive",
612 host_supported: true,
613 }
614
615 cc_library_static {
616 name: "libubsan",
617 host_supported: true,
618 sanitize: {
619 undefined: true,
620 }
621 }
622
623 cc_library_static {
624 name: "libstatic",
625 host_supported: true,
626 }
627
628 cc_library_static {
629 name: "libnoubsan",
630 host_supported: true,
631 }
632 `
633
634 result := android.GroupFixturePreparers(
635 prepareForCcTest,
636 ).RunTestWithBp(t, bp)
637
638 check := func(t *testing.T, result *android.TestResult, variant string) {
639 staticVariant := variant + "_static"
640
641 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
642
643 // The binaries, one with ubsan and one without
644 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
645 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan", variant)
646 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
647
648 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
649 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
650 minimalRuntime.OutputFiles(t, "")[0].String())
651
652 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan static libs",
653 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
654 minimalRuntime.OutputFiles(t, "")[0].String())
655
656 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
657 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
658 minimalRuntime.OutputFiles(t, "")[0].String())
659
660 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
661 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
662 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
663
664 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan static libs",
665 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
666 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
667
668 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
669 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
670 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
671 }
672
673 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
674 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
675}
676
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400677type MemtagNoteType int
678
679const (
680 None MemtagNoteType = iota + 1
681 Sync
682 Async
683)
684
685func (t MemtagNoteType) str() string {
686 switch t {
687 case None:
688 return "none"
689 case Sync:
690 return "sync"
691 case Async:
692 return "async"
693 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400694 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400695 }
696}
697
698func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400699 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400700
701 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000702 ldFlags := m.Rule("ld").Args["ldFlags"]
703 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
704 found = Async
705 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
706 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400707 }
708
709 if found != expected {
710 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
711 }
712}
713
714var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
715 android.FixtureModifyMockFS(func(fs android.MockFS) {
716 templateBp := `
717 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400718 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400719 gtest: false,
720 }
721
722 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400723 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400724 gtest: false,
725 sanitize: { memtag_heap: false },
726 }
727
728 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400729 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400730 gtest: false,
731 sanitize: { memtag_heap: true },
732 }
733
734 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400735 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400736 gtest: false,
737 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
738 }
739
740 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400741 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400742 gtest: false,
743 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
744 }
745
Liz Kammerd56ddb52021-06-21 17:37:39 -0400746 cc_test {
747 name: "unset_memtag_set_sync_test_%[1]s",
748 gtest: false,
749 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400750 }
751
752 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400753 name: "unset_binary_%[1]s",
754 }
755
756 cc_binary {
757 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400758 sanitize: { memtag_heap: false },
759 }
760
761 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400762 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400763 sanitize: { memtag_heap: true },
764 }
765
766 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400767 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400768 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
769 }
770
771 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400772 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400773 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
774 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400775
776 cc_binary {
777 name: "unset_memtag_set_sync_binary_%[1]s",
778 sanitize: { diag: { memtag_heap: true } },
779 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400780 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400781 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
782 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
783 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
784 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400785
786 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400787 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
788 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
789 "subdir_sync/Android.bp": []byte(subdirSyncBp),
790 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400791 })
792 }),
793 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400794 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
795 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
796 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
797 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400798 }),
799)
800
801func TestSanitizeMemtagHeap(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400802 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400803 variant := "android_arm64_armv8-a"
804
805 result := android.GroupFixturePreparers(
806 prepareForCcTest,
807 prepareForTestWithMemtagHeap,
808 ).RunTest(t)
809 ctx := result.TestContext
810
Liz Kammerd56ddb52021-06-21 17:37:39 -0400811 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
812 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
813 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
814 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400815
Liz Kammerd56ddb52021-06-21 17:37:39 -0400816 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
817 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
818 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
819 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400820
Liz Kammerd56ddb52021-06-21 17:37:39 -0400821 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
822 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
823 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
824 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400825
Liz Kammer7b920b42021-06-22 16:57:27 -0400826 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
827 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
828 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400829 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400830
Liz Kammerd56ddb52021-06-21 17:37:39 -0400831 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
832 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
833 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
834 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400835
Liz Kammerd56ddb52021-06-21 17:37:39 -0400836 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
837 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
838 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
839 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400840
Liz Kammerd56ddb52021-06-21 17:37:39 -0400841 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
842 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
843 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
844 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400845
Liz Kammerd56ddb52021-06-21 17:37:39 -0400846 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
847 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
848 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
849 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
850
851 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
852 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
853 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
854 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
855 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
856 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
857
858 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
859 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
860 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
861 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
862
863 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
864 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
865 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
866 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
867
868 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
869 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
870 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
871 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400872}
873
874func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400875 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400876 variant := "android_arm64_armv8-a"
877
878 result := android.GroupFixturePreparers(
879 prepareForCcTest,
880 prepareForTestWithMemtagHeap,
881 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
882 variables.SanitizeDevice = []string{"memtag_heap"}
883 }),
884 ).RunTest(t)
885 ctx := result.TestContext
886
Liz Kammerd56ddb52021-06-21 17:37:39 -0400887 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
888 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
889 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
890 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400891
Liz Kammerd56ddb52021-06-21 17:37:39 -0400892 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
893 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
894 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
895 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400896
Liz Kammerd56ddb52021-06-21 17:37:39 -0400897 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
898 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
899 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
900 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400901
Liz Kammer7b920b42021-06-22 16:57:27 -0400902 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
903 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
904 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400905 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400906
Liz Kammerd56ddb52021-06-21 17:37:39 -0400907 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
908 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
909 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
910 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400911
Liz Kammerd56ddb52021-06-21 17:37:39 -0400912 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
913 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
914 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
915 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400916
Liz Kammerd56ddb52021-06-21 17:37:39 -0400917 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
918 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
919 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
920 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400921
Liz Kammerd56ddb52021-06-21 17:37:39 -0400922 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
923 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
924 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
925 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
926
927 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
928 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
929 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
930 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
931 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
932
933 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
934 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
935 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
936 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
937
938 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
939 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
940 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
941 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
942
943 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
944 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
945 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
946 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400947}
948
949func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400950 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400951 variant := "android_arm64_armv8-a"
952
953 result := android.GroupFixturePreparers(
954 prepareForCcTest,
955 prepareForTestWithMemtagHeap,
956 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
957 variables.SanitizeDevice = []string{"memtag_heap"}
958 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
959 }),
960 ).RunTest(t)
961 ctx := result.TestContext
962
Liz Kammerd56ddb52021-06-21 17:37:39 -0400963 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
964 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
965 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
966 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400967
Liz Kammerd56ddb52021-06-21 17:37:39 -0400968 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
969 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
970 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
971 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400972
Liz Kammerd56ddb52021-06-21 17:37:39 -0400973 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
974 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
975 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
976 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400977
Liz Kammerd56ddb52021-06-21 17:37:39 -0400978 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
979 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
980 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
981 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400982
Liz Kammerd56ddb52021-06-21 17:37:39 -0400983 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
984 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
985 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
986 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400987
Liz Kammerd56ddb52021-06-21 17:37:39 -0400988 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
989 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
990 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
991 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400992
Liz Kammerd56ddb52021-06-21 17:37:39 -0400993 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
994 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
995 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
996 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400997
Liz Kammerd56ddb52021-06-21 17:37:39 -0400998 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
999 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1000 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1001 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1002
1003 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1004 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1005 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1006 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1007 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1008
1009 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1010 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1011 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1012 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1013
1014 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1015 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1016 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1017 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1018
1019 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1020 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1021 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1022 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001023}