blob: fe592dcb6c747cbc00703afe788f2995925a5c4a [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 {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000580 name: "bin_depends_ubsan_static",
Colin Cross3e5e7782022-06-17 22:17:05 +0000581 host_supported: true,
582 shared_libs: [
583 "libshared",
584 ],
585 static_libs: [
586 "libstatic",
587 "libubsan",
588 "libnoubsan",
589 ],
590 }
591
592 cc_binary {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000593 name: "bin_depends_ubsan_shared",
594 host_supported: true,
595 shared_libs: [
596 "libsharedubsan",
597 ],
598 }
599
600 cc_binary {
Colin Cross3e5e7782022-06-17 22:17:05 +0000601 name: "bin_no_ubsan",
602 host_supported: true,
603 shared_libs: [
604 "libshared",
605 ],
606 static_libs: [
607 "libstatic",
608 "libnoubsan",
609 ],
610 }
611
612 cc_library_shared {
613 name: "libshared",
614 host_supported: true,
615 shared_libs: ["libtransitive"],
616 }
617
618 cc_library_shared {
619 name: "libtransitive",
620 host_supported: true,
621 }
622
Trevor Radcliffe99815552022-11-14 21:35:05 +0000623 cc_library_shared {
624 name: "libsharedubsan",
625 host_supported: true,
626 sanitize: {
627 undefined: true,
628 }
629 }
630
Colin Cross3e5e7782022-06-17 22:17:05 +0000631 cc_library_static {
632 name: "libubsan",
633 host_supported: true,
634 sanitize: {
635 undefined: true,
636 }
637 }
638
639 cc_library_static {
640 name: "libstatic",
641 host_supported: true,
642 }
643
644 cc_library_static {
645 name: "libnoubsan",
646 host_supported: true,
647 }
648 `
649
650 result := android.GroupFixturePreparers(
651 prepareForCcTest,
652 ).RunTestWithBp(t, bp)
653
654 check := func(t *testing.T, result *android.TestResult, variant string) {
655 staticVariant := variant + "_static"
Trevor Radcliffe99815552022-11-14 21:35:05 +0000656 sharedVariant := variant + "_shared"
Colin Cross3e5e7782022-06-17 22:17:05 +0000657
658 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
659
660 // The binaries, one with ubsan and one without
661 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
Trevor Radcliffe99815552022-11-14 21:35:05 +0000662 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan_static", variant)
663 libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant)
664 binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant)
Colin Cross3e5e7782022-06-17 22:17:05 +0000665 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
666
667 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
668 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
669 minimalRuntime.OutputFiles(t, "")[0].String())
670
Trevor Radcliffe99815552022-11-14 21:35:05 +0000671 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000672 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
673 minimalRuntime.OutputFiles(t, "")[0].String())
674
Trevor Radcliffe99815552022-11-14 21:35:05 +0000675 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in libsharedubsan static libs",
676 strings.Split(libSharedUbsan.Rule("ld").Args["libFlags"], " "),
677 minimalRuntime.OutputFiles(t, "")[0].String())
678
679 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_depends_ubsan_shared static libs",
680 strings.Split(binDependsUbsanShared.Rule("ld").Args["libFlags"], " "),
681 minimalRuntime.OutputFiles(t, "")[0].String())
682
Colin Cross3e5e7782022-06-17 22:17:05 +0000683 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
684 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
685 minimalRuntime.OutputFiles(t, "")[0].String())
686
687 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
688 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
689 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
690
Trevor Radcliffe99815552022-11-14 21:35:05 +0000691 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000692 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
693 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
694
Trevor Radcliffe99815552022-11-14 21:35:05 +0000695 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in libsharedubsan static libs",
696 strings.Split(libSharedUbsan.Rule("ld").Args["ldFlags"], " "),
697 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
698
699 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_shared static libs",
700 strings.Split(binDependsUbsanShared.Rule("ld").Args["ldFlags"], " "),
701 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
702
Colin Cross3e5e7782022-06-17 22:17:05 +0000703 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
704 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
705 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
706 }
707
708 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
709 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
710}
711
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400712type MemtagNoteType int
713
714const (
715 None MemtagNoteType = iota + 1
716 Sync
717 Async
718)
719
720func (t MemtagNoteType) str() string {
721 switch t {
722 case None:
723 return "none"
724 case Sync:
725 return "sync"
726 case Async:
727 return "async"
728 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400729 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400730 }
731}
732
733func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400734 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400735
736 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000737 ldFlags := m.Rule("ld").Args["ldFlags"]
738 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
739 found = Async
740 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
741 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400742 }
743
744 if found != expected {
745 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
746 }
747}
748
749var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
750 android.FixtureModifyMockFS(func(fs android.MockFS) {
751 templateBp := `
752 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400753 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400754 gtest: false,
755 }
756
757 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400758 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400759 gtest: false,
760 sanitize: { memtag_heap: false },
761 }
762
763 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400764 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400765 gtest: false,
766 sanitize: { memtag_heap: true },
767 }
768
769 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400770 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400771 gtest: false,
772 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
773 }
774
775 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400776 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400777 gtest: false,
778 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
779 }
780
Liz Kammerd56ddb52021-06-21 17:37:39 -0400781 cc_test {
782 name: "unset_memtag_set_sync_test_%[1]s",
783 gtest: false,
784 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400785 }
786
787 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400788 name: "unset_binary_%[1]s",
789 }
790
791 cc_binary {
792 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400793 sanitize: { memtag_heap: false },
794 }
795
796 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400797 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400798 sanitize: { memtag_heap: true },
799 }
800
801 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400802 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400803 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
804 }
805
806 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400807 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400808 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
809 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400810
811 cc_binary {
812 name: "unset_memtag_set_sync_binary_%[1]s",
813 sanitize: { diag: { memtag_heap: true } },
814 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400815 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400816 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
817 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
818 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
819 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400820
821 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400822 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
823 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
824 "subdir_sync/Android.bp": []byte(subdirSyncBp),
825 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400826 })
827 }),
828 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400829 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
830 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
831 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
832 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400833 }),
834)
835
836func TestSanitizeMemtagHeap(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400837 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400838 variant := "android_arm64_armv8-a"
839
840 result := android.GroupFixturePreparers(
841 prepareForCcTest,
842 prepareForTestWithMemtagHeap,
843 ).RunTest(t)
844 ctx := result.TestContext
845
Liz Kammerd56ddb52021-06-21 17:37:39 -0400846 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
847 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
848 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
849 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400850
Liz Kammerd56ddb52021-06-21 17:37:39 -0400851 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
852 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
853 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
854 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400855
Liz Kammerd56ddb52021-06-21 17:37:39 -0400856 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
857 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
858 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
859 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400860
Liz Kammer7b920b42021-06-22 16:57:27 -0400861 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
862 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
863 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400864 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400865
Liz Kammerd56ddb52021-06-21 17:37:39 -0400866 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
867 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
868 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
869 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400870
Liz Kammerd56ddb52021-06-21 17:37:39 -0400871 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
872 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
873 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
874 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400875
Liz Kammerd56ddb52021-06-21 17:37:39 -0400876 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
877 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
878 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
879 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400880
Liz Kammerd56ddb52021-06-21 17:37:39 -0400881 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
882 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
883 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
884 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
885
886 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
887 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
888 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
889 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
890 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
891 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
892
893 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
894 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
895 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
896 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
897
898 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
899 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
900 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
901 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
902
903 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
904 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
905 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
906 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400907}
908
909func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400910 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400911 variant := "android_arm64_armv8-a"
912
913 result := android.GroupFixturePreparers(
914 prepareForCcTest,
915 prepareForTestWithMemtagHeap,
916 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
917 variables.SanitizeDevice = []string{"memtag_heap"}
918 }),
919 ).RunTest(t)
920 ctx := result.TestContext
921
Liz Kammerd56ddb52021-06-21 17:37:39 -0400922 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
923 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
924 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
925 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400926
Liz Kammerd56ddb52021-06-21 17:37:39 -0400927 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
928 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
929 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
930 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400931
Liz Kammerd56ddb52021-06-21 17:37:39 -0400932 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
933 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
934 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
935 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400936
Liz Kammer7b920b42021-06-22 16:57:27 -0400937 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
938 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
939 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400940 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400941
Liz Kammerd56ddb52021-06-21 17:37:39 -0400942 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
943 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
944 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
945 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400946
Liz Kammerd56ddb52021-06-21 17:37:39 -0400947 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
948 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
949 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
950 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400951
Liz Kammerd56ddb52021-06-21 17:37:39 -0400952 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
953 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
954 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
955 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400956
Liz Kammerd56ddb52021-06-21 17:37:39 -0400957 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
958 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
959 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
960 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
961
962 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
963 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
964 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
965 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
966 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
967
968 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
969 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
970 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
971 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
972
973 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
974 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
975 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
976 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
977
978 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
979 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
980 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
981 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400982}
983
984func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400985 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400986 variant := "android_arm64_armv8-a"
987
988 result := android.GroupFixturePreparers(
989 prepareForCcTest,
990 prepareForTestWithMemtagHeap,
991 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
992 variables.SanitizeDevice = []string{"memtag_heap"}
993 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
994 }),
995 ).RunTest(t)
996 ctx := result.TestContext
997
Liz Kammerd56ddb52021-06-21 17:37:39 -0400998 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
999 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1000 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1001 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001002
Liz Kammerd56ddb52021-06-21 17:37:39 -04001003 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1004 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1005 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1006 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001007
Liz Kammerd56ddb52021-06-21 17:37:39 -04001008 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
1009 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
1010 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
1011 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001012
Liz Kammerd56ddb52021-06-21 17:37:39 -04001013 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1014 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1015 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1016 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001017
Liz Kammerd56ddb52021-06-21 17:37:39 -04001018 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1019 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1020 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1021 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001022
Liz Kammerd56ddb52021-06-21 17:37:39 -04001023 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1024 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1025 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1026 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001027
Liz Kammerd56ddb52021-06-21 17:37:39 -04001028 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1029 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1030 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1031 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001032
Liz Kammerd56ddb52021-06-21 17:37:39 -04001033 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1034 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1035 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1036 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1037
1038 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1039 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1040 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1041 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1042 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1043
1044 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1045 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1046 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1047 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1048
1049 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1050 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1051 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1052 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1053
1054 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1055 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1056 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1057 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001058}