blob: 580adfac75d089b74c3b98c3f7d11eccf6c23f44 [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) {
89 bp := `
90 cc_binary {
91 name: "bin_with_asan",
92 host_supported: true,
93 shared_libs: [
94 "libshared",
95 "libasan",
96 ],
97 static_libs: [
98 "libstatic",
99 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400100 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700101 ],
102 sanitize: {
103 address: true,
104 }
105 }
106
107 cc_binary {
108 name: "bin_no_asan",
109 host_supported: true,
110 shared_libs: [
111 "libshared",
112 "libasan",
113 ],
114 static_libs: [
115 "libstatic",
116 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400117 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700118 ],
119 }
120
121 cc_library_shared {
122 name: "libshared",
123 host_supported: true,
124 shared_libs: ["libtransitive"],
125 }
126
127 cc_library_shared {
128 name: "libasan",
129 host_supported: true,
130 shared_libs: ["libtransitive"],
131 sanitize: {
132 address: true,
133 }
134 }
135
136 cc_library_shared {
137 name: "libtransitive",
138 host_supported: true,
139 }
140
141 cc_library_static {
142 name: "libstatic",
143 host_supported: true,
144 }
145
146 cc_library_static {
147 name: "libnoasan",
148 host_supported: true,
149 sanitize: {
150 address: false,
151 }
152 }
Liz Kammerecc659c2022-10-28 16:27:13 -0400153
154 cc_library_static {
155 name: "libstatic_asan",
156 host_supported: true,
157 sanitize: {
158 address: true,
159 }
160 }
161
Colin Crossaf98f582021-05-12 17:27:32 -0700162 `
163
164 result := android.GroupFixturePreparers(
165 prepareForCcTest,
166 prepareForAsanTest,
167 ).RunTestWithBp(t, bp)
168
169 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400170 ctx := result.TestContext
Colin Crossaf98f582021-05-12 17:27:32 -0700171 asanVariant := variant + "_asan"
172 sharedVariant := variant + "_shared"
173 sharedAsanVariant := sharedVariant + "_asan"
174 staticVariant := variant + "_static"
175 staticAsanVariant := staticVariant + "_asan"
176
177 // The binaries, one with asan and one without
178 binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant)
179 binNoAsan := result.ModuleForTests("bin_no_asan", variant)
180
181 // Shared libraries that don't request asan
182 libShared := result.ModuleForTests("libshared", sharedVariant)
183 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
184
185 // Shared library that requests asan
186 libAsan := result.ModuleForTests("libasan", sharedAsanVariant)
187
188 // Static library that uses an asan variant for bin_with_asan and a non-asan variant
189 // for bin_no_asan.
190 libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant)
191 libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant)
192
193 // Static library that never uses asan.
194 libNoAsan := result.ModuleForTests("libnoasan", staticVariant)
195
Liz Kammerecc659c2022-10-28 16:27:13 -0400196 // Static library that specifies asan
197 libStaticAsan := result.ModuleForTests("libstatic_asan", staticAsanVariant)
198 libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
199
Liz Kammer92c72592022-10-31 14:44:28 -0400200 expectSharedLinkDep(t, ctx, binWithAsan, libShared)
201 expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
202 expectSharedLinkDep(t, ctx, libShared, libTransitive)
203 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700204
Liz Kammer92c72592022-10-31 14:44:28 -0400205 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsanVariant)
206 expectStaticLinkDep(t, ctx, binWithAsan, libNoAsan)
207 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsan)
Colin Crossaf98f582021-05-12 17:27:32 -0700208
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400209 expectInstallDep(t, binWithAsan, libShared)
210 expectInstallDep(t, binWithAsan, libAsan)
211 expectInstallDep(t, binWithAsan, libTransitive)
212 expectInstallDep(t, libShared, libTransitive)
213 expectInstallDep(t, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700214
Liz Kammer92c72592022-10-31 14:44:28 -0400215 expectSharedLinkDep(t, ctx, binNoAsan, libShared)
216 expectSharedLinkDep(t, ctx, binNoAsan, libAsan)
217 expectSharedLinkDep(t, ctx, libShared, libTransitive)
218 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700219
Liz Kammer92c72592022-10-31 14:44:28 -0400220 expectStaticLinkDep(t, ctx, binNoAsan, libStaticNoAsanVariant)
221 expectStaticLinkDep(t, ctx, binNoAsan, libNoAsan)
222 expectStaticLinkDep(t, ctx, binNoAsan, libStaticAsanNoAsanVariant)
Colin Crossaf98f582021-05-12 17:27:32 -0700223
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400224 expectInstallDep(t, binNoAsan, libShared)
225 expectInstallDep(t, binNoAsan, libAsan)
226 expectInstallDep(t, binNoAsan, libTransitive)
227 expectInstallDep(t, libShared, libTransitive)
228 expectInstallDep(t, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700229 }
230
231 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
232 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
233}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400234
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400235func TestTsan(t *testing.T) {
236 bp := `
237 cc_binary {
238 name: "bin_with_tsan",
239 host_supported: true,
240 shared_libs: [
241 "libshared",
242 "libtsan",
243 ],
244 sanitize: {
245 thread: true,
246 }
247 }
248
249 cc_binary {
250 name: "bin_no_tsan",
251 host_supported: true,
252 shared_libs: [
253 "libshared",
254 "libtsan",
255 ],
256 }
257
258 cc_library_shared {
259 name: "libshared",
260 host_supported: true,
261 shared_libs: ["libtransitive"],
262 }
263
264 cc_library_shared {
265 name: "libtsan",
266 host_supported: true,
267 shared_libs: ["libtransitive"],
268 sanitize: {
269 thread: true,
270 }
271 }
272
273 cc_library_shared {
274 name: "libtransitive",
275 host_supported: true,
276 }
277`
278
279 result := android.GroupFixturePreparers(
280 prepareForCcTest,
281 prepareForTsanTest,
282 ).RunTestWithBp(t, bp)
283
284 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400285 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400286 tsanVariant := variant + "_tsan"
287 sharedVariant := variant + "_shared"
288 sharedTsanVariant := sharedVariant + "_tsan"
289
290 // The binaries, one with tsan and one without
291 binWithTsan := result.ModuleForTests("bin_with_tsan", tsanVariant)
292 binNoTsan := result.ModuleForTests("bin_no_tsan", variant)
293
294 // Shared libraries that don't request tsan
295 libShared := result.ModuleForTests("libshared", sharedVariant)
296 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
297
298 // Shared library that requests tsan
299 libTsan := result.ModuleForTests("libtsan", sharedTsanVariant)
300
Liz Kammer92c72592022-10-31 14:44:28 -0400301 expectSharedLinkDep(t, ctx, binWithTsan, libShared)
302 expectSharedLinkDep(t, ctx, binWithTsan, libTsan)
303 expectSharedLinkDep(t, ctx, libShared, libTransitive)
304 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400305
Liz Kammer92c72592022-10-31 14:44:28 -0400306 expectSharedLinkDep(t, ctx, binNoTsan, libShared)
307 expectSharedLinkDep(t, ctx, binNoTsan, libTsan)
308 expectSharedLinkDep(t, ctx, libShared, libTransitive)
309 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
310 }
311
312 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
313 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
314}
315
316func TestMiscUndefined(t *testing.T) {
317 bp := `
318 cc_binary {
319 name: "bin_with_ubsan",
320 srcs: ["src.cc"],
321 host_supported: true,
322 static_libs: [
323 "libstatic",
324 "libubsan",
325 ],
326 sanitize: {
327 misc_undefined: ["integer"],
328 }
329 }
330
331 cc_binary {
332 name: "bin_no_ubsan",
333 host_supported: true,
334 srcs: ["src.cc"],
335 static_libs: [
336 "libstatic",
337 "libubsan",
338 ],
339 }
340
341 cc_library_static {
342 name: "libstatic",
343 host_supported: true,
344 srcs: ["src.cc"],
345 static_libs: ["libtransitive"],
346 }
347
348 cc_library_static {
349 name: "libubsan",
350 host_supported: true,
351 srcs: ["src.cc"],
352 whole_static_libs: ["libtransitive"],
353 sanitize: {
354 misc_undefined: ["integer"],
355 }
356 }
357
358 cc_library_static {
359 name: "libtransitive",
360 host_supported: true,
361 srcs: ["src.cc"],
362 }
363`
364
365 result := android.GroupFixturePreparers(
366 prepareForCcTest,
367 ).RunTestWithBp(t, bp)
368
369 check := func(t *testing.T, result *android.TestResult, variant string) {
370 ctx := result.TestContext
371 staticVariant := variant + "_static"
372
373 // The binaries, one with ubsan and one without
374 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
375 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
376
377 // Static libraries that don't request ubsan
378 libStatic := result.ModuleForTests("libstatic", staticVariant)
379 libTransitive := result.ModuleForTests("libtransitive", staticVariant)
380
381 libUbsan := result.ModuleForTests("libubsan", staticVariant)
382
383 libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
384
385 expectStaticLinkDep(t, ctx, binWithUbsan, libStatic)
386 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan)
387 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsanMinimal)
388
389 miscUndefinedSanFlag := "-fsanitize=integer"
390 binWithUbsanCflags := binWithUbsan.Rule("cc").Args["cFlags"]
391 if !strings.Contains(binWithUbsanCflags, miscUndefinedSanFlag) {
392 t.Errorf("'bin_with_ubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
393 }
394 libStaticCflags := libStatic.Rule("cc").Args["cFlags"]
395 if strings.Contains(libStaticCflags, miscUndefinedSanFlag) {
396 t.Errorf("'libstatic' Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
397 }
398 libUbsanCflags := libUbsan.Rule("cc").Args["cFlags"]
399 if !strings.Contains(libUbsanCflags, miscUndefinedSanFlag) {
400 t.Errorf("'libubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
401 }
402 libTransitiveCflags := libTransitive.Rule("cc").Args["cFlags"]
403 if strings.Contains(libTransitiveCflags, miscUndefinedSanFlag) {
404 t.Errorf("'libtransitive': Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
405 }
406
407 expectStaticLinkDep(t, ctx, binNoUbsan, libStatic)
408 expectStaticLinkDep(t, ctx, binNoUbsan, libUbsan)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400409 }
410
411 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
412 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
413}
414
415func TestFuzz(t *testing.T) {
416 bp := `
417 cc_binary {
418 name: "bin_with_fuzzer",
419 host_supported: true,
420 shared_libs: [
421 "libshared",
422 "libfuzzer",
423 ],
424 static_libs: [
425 "libstatic",
426 "libnofuzzer",
427 "libstatic_fuzzer",
428 ],
429 sanitize: {
430 fuzzer: true,
431 }
432 }
433
434 cc_binary {
435 name: "bin_no_fuzzer",
436 host_supported: true,
437 shared_libs: [
438 "libshared",
439 "libfuzzer",
440 ],
441 static_libs: [
442 "libstatic",
443 "libnofuzzer",
444 "libstatic_fuzzer",
445 ],
446 }
447
448 cc_library_shared {
449 name: "libshared",
450 host_supported: true,
451 shared_libs: ["libtransitive"],
452 }
453
454 cc_library_shared {
455 name: "libfuzzer",
456 host_supported: true,
457 shared_libs: ["libtransitive"],
458 sanitize: {
459 fuzzer: true,
460 }
461 }
462
463 cc_library_shared {
464 name: "libtransitive",
465 host_supported: true,
466 }
467
468 cc_library_static {
469 name: "libstatic",
470 host_supported: true,
471 }
472
473 cc_library_static {
474 name: "libnofuzzer",
475 host_supported: true,
476 sanitize: {
477 fuzzer: false,
478 }
479 }
480
481 cc_library_static {
482 name: "libstatic_fuzzer",
483 host_supported: true,
484 }
485
486 `
487
488 result := android.GroupFixturePreparers(
489 prepareForCcTest,
490 ).RunTestWithBp(t, bp)
491
492 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400493 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400494 fuzzerVariant := variant + "_fuzzer"
495 sharedVariant := variant + "_shared"
496 sharedFuzzerVariant := sharedVariant + "_fuzzer"
497 staticVariant := variant + "_static"
498 staticFuzzerVariant := staticVariant + "_fuzzer"
499
500 // The binaries, one with fuzzer and one without
501 binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant)
502 binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant)
503
504 // Shared libraries that don't request fuzzer
505 libShared := result.ModuleForTests("libshared", sharedVariant)
506 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
507
508 // Shared libraries that don't request fuzzer
509 libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant)
510 libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant)
511
512 // Shared library that requests fuzzer
513 libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant)
514
515 // Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant
516 // for bin_no_fuzzer.
517 libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant)
518 libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant)
519
520 // Static library that never uses fuzzer.
521 libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant)
522
523 // Static library that specifies fuzzer
524 libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant)
525 libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant)
526
Liz Kammer92c72592022-10-31 14:44:28 -0400527 expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer)
528 expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer)
529 expectSharedLinkDep(t, ctx, libSharedFuzzer, libTransitiveFuzzer)
530 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400531
Liz Kammer92c72592022-10-31 14:44:28 -0400532 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzerVariant)
533 expectStaticLinkDep(t, ctx, binWithFuzzer, libNoFuzzer)
534 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400535
Liz Kammer92c72592022-10-31 14:44:28 -0400536 expectSharedLinkDep(t, ctx, binNoFuzzer, libShared)
537 expectSharedLinkDep(t, ctx, binNoFuzzer, libFuzzer)
538 expectSharedLinkDep(t, ctx, libShared, libTransitive)
539 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400540
Liz Kammer92c72592022-10-31 14:44:28 -0400541 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticNoFuzzerVariant)
542 expectStaticLinkDep(t, ctx, binNoFuzzer, libNoFuzzer)
543 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticFuzzerNoFuzzerVariant)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400544 }
545
546 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
547}
548
Colin Cross3e5e7782022-06-17 22:17:05 +0000549func TestUbsan(t *testing.T) {
550 if runtime.GOOS != "linux" {
551 t.Skip("requires linux")
552 }
553
554 bp := `
555 cc_binary {
556 name: "bin_with_ubsan",
557 host_supported: true,
558 shared_libs: [
559 "libshared",
560 ],
561 static_libs: [
562 "libstatic",
563 "libnoubsan",
564 ],
565 sanitize: {
566 undefined: true,
567 }
568 }
569
570 cc_binary {
571 name: "bin_depends_ubsan",
572 host_supported: true,
573 shared_libs: [
574 "libshared",
575 ],
576 static_libs: [
577 "libstatic",
578 "libubsan",
579 "libnoubsan",
580 ],
581 }
582
583 cc_binary {
584 name: "bin_no_ubsan",
585 host_supported: true,
586 shared_libs: [
587 "libshared",
588 ],
589 static_libs: [
590 "libstatic",
591 "libnoubsan",
592 ],
593 }
594
595 cc_library_shared {
596 name: "libshared",
597 host_supported: true,
598 shared_libs: ["libtransitive"],
599 }
600
601 cc_library_shared {
602 name: "libtransitive",
603 host_supported: true,
604 }
605
606 cc_library_static {
607 name: "libubsan",
608 host_supported: true,
609 sanitize: {
610 undefined: true,
611 }
612 }
613
614 cc_library_static {
615 name: "libstatic",
616 host_supported: true,
617 }
618
619 cc_library_static {
620 name: "libnoubsan",
621 host_supported: true,
622 }
623 `
624
625 result := android.GroupFixturePreparers(
626 prepareForCcTest,
627 ).RunTestWithBp(t, bp)
628
629 check := func(t *testing.T, result *android.TestResult, variant string) {
630 staticVariant := variant + "_static"
631
632 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
633
634 // The binaries, one with ubsan and one without
635 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
636 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan", variant)
637 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
638
639 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
640 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
641 minimalRuntime.OutputFiles(t, "")[0].String())
642
643 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan static libs",
644 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
645 minimalRuntime.OutputFiles(t, "")[0].String())
646
647 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
648 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
649 minimalRuntime.OutputFiles(t, "")[0].String())
650
651 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
652 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
653 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
654
655 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan static libs",
656 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
657 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
658
659 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
660 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
661 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
662 }
663
664 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
665 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
666}
667
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400668type MemtagNoteType int
669
670const (
671 None MemtagNoteType = iota + 1
672 Sync
673 Async
674)
675
676func (t MemtagNoteType) str() string {
677 switch t {
678 case None:
679 return "none"
680 case Sync:
681 return "sync"
682 case Async:
683 return "async"
684 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400685 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400686 }
687}
688
689func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400690 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400691
692 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000693 ldFlags := m.Rule("ld").Args["ldFlags"]
694 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
695 found = Async
696 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
697 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400698 }
699
700 if found != expected {
701 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
702 }
703}
704
705var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
706 android.FixtureModifyMockFS(func(fs android.MockFS) {
707 templateBp := `
708 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400709 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400710 gtest: false,
711 }
712
713 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400714 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400715 gtest: false,
716 sanitize: { memtag_heap: false },
717 }
718
719 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400720 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400721 gtest: false,
722 sanitize: { memtag_heap: true },
723 }
724
725 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400726 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400727 gtest: false,
728 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
729 }
730
731 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400732 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400733 gtest: false,
734 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
735 }
736
Liz Kammerd56ddb52021-06-21 17:37:39 -0400737 cc_test {
738 name: "unset_memtag_set_sync_test_%[1]s",
739 gtest: false,
740 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400741 }
742
743 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400744 name: "unset_binary_%[1]s",
745 }
746
747 cc_binary {
748 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400749 sanitize: { memtag_heap: false },
750 }
751
752 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400753 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400754 sanitize: { memtag_heap: true },
755 }
756
757 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400758 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400759 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
760 }
761
762 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400763 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400764 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
765 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400766
767 cc_binary {
768 name: "unset_memtag_set_sync_binary_%[1]s",
769 sanitize: { diag: { memtag_heap: true } },
770 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400771 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400772 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
773 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
774 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
775 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400776
777 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400778 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
779 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
780 "subdir_sync/Android.bp": []byte(subdirSyncBp),
781 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400782 })
783 }),
784 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400785 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
786 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
787 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
788 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400789 }),
790)
791
792func TestSanitizeMemtagHeap(t *testing.T) {
793 variant := "android_arm64_armv8-a"
794
795 result := android.GroupFixturePreparers(
796 prepareForCcTest,
797 prepareForTestWithMemtagHeap,
798 ).RunTest(t)
799 ctx := result.TestContext
800
Liz Kammerd56ddb52021-06-21 17:37:39 -0400801 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
802 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
803 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
804 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400805
Liz Kammerd56ddb52021-06-21 17:37:39 -0400806 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
807 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
808 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
809 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400810
Liz Kammerd56ddb52021-06-21 17:37:39 -0400811 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
812 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
813 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
814 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400815
Liz Kammer7b920b42021-06-22 16:57:27 -0400816 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
817 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
818 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400819 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400820
Liz Kammerd56ddb52021-06-21 17:37:39 -0400821 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
822 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
823 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
824 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400825
Liz Kammerd56ddb52021-06-21 17:37:39 -0400826 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
827 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
828 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
829 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400830
Liz Kammerd56ddb52021-06-21 17:37:39 -0400831 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
832 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
833 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
834 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400835
Liz Kammerd56ddb52021-06-21 17:37:39 -0400836 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
837 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
838 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
839 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
840
841 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
842 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
843 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
844 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
845 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
846 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
847
848 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
849 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
850 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
851 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
852
853 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
854 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
855 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
856 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
857
858 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
859 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
860 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
861 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400862}
863
864func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
865 variant := "android_arm64_armv8-a"
866
867 result := android.GroupFixturePreparers(
868 prepareForCcTest,
869 prepareForTestWithMemtagHeap,
870 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
871 variables.SanitizeDevice = []string{"memtag_heap"}
872 }),
873 ).RunTest(t)
874 ctx := result.TestContext
875
Liz Kammerd56ddb52021-06-21 17:37:39 -0400876 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
877 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
878 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
879 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400880
Liz Kammerd56ddb52021-06-21 17:37:39 -0400881 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
882 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
883 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
884 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400885
Liz Kammerd56ddb52021-06-21 17:37:39 -0400886 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
887 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
888 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
889 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400890
Liz Kammer7b920b42021-06-22 16:57:27 -0400891 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
892 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
893 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400894 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400895
Liz Kammerd56ddb52021-06-21 17:37:39 -0400896 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
897 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
898 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
899 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400900
Liz Kammerd56ddb52021-06-21 17:37:39 -0400901 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
902 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
903 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
904 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400905
Liz Kammerd56ddb52021-06-21 17:37:39 -0400906 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
907 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
908 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
909 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400910
Liz Kammerd56ddb52021-06-21 17:37:39 -0400911 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
912 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
913 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
914 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
915
916 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
917 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
918 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
919 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
920 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
921
922 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
923 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
924 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
925 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
926
927 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
928 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
929 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
930 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
931
932 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
933 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
934 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
935 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400936}
937
938func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
939 variant := "android_arm64_armv8-a"
940
941 result := android.GroupFixturePreparers(
942 prepareForCcTest,
943 prepareForTestWithMemtagHeap,
944 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
945 variables.SanitizeDevice = []string{"memtag_heap"}
946 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
947 }),
948 ).RunTest(t)
949 ctx := result.TestContext
950
Liz Kammerd56ddb52021-06-21 17:37:39 -0400951 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
952 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
953 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
954 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400955
Liz Kammerd56ddb52021-06-21 17:37:39 -0400956 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
957 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
958 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
959 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400960
Liz Kammerd56ddb52021-06-21 17:37:39 -0400961 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
962 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
963 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
964 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400965
Liz Kammerd56ddb52021-06-21 17:37:39 -0400966 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
967 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
968 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
969 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400970
Liz Kammerd56ddb52021-06-21 17:37:39 -0400971 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
972 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
973 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
974 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400975
Liz Kammerd56ddb52021-06-21 17:37:39 -0400976 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
977 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
978 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
979 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400980
Liz Kammerd56ddb52021-06-21 17:37:39 -0400981 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
982 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
983 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
984 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400985
Liz Kammerd56ddb52021-06-21 17:37:39 -0400986 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
987 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
988 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
989 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
990
991 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
992 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
993 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
994 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
995 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
996
997 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
998 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
999 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1000 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1001
1002 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1003 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1004 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1005 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1006
1007 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1008 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1009 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1010 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001011}