blob: b102d33f8060e4280dce8eca228184f75018c864 [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) {
Liz Kammer2a109bc2022-12-02 09:36:01 -0500317 if runtime.GOOS != "linux" {
318 t.Skip("requires linux")
319 }
320
Liz Kammer92c72592022-10-31 14:44:28 -0400321 bp := `
322 cc_binary {
323 name: "bin_with_ubsan",
324 srcs: ["src.cc"],
325 host_supported: true,
326 static_libs: [
327 "libstatic",
328 "libubsan",
329 ],
330 sanitize: {
331 misc_undefined: ["integer"],
332 }
333 }
334
335 cc_binary {
336 name: "bin_no_ubsan",
337 host_supported: true,
338 srcs: ["src.cc"],
339 static_libs: [
340 "libstatic",
341 "libubsan",
342 ],
343 }
344
345 cc_library_static {
346 name: "libstatic",
347 host_supported: true,
348 srcs: ["src.cc"],
349 static_libs: ["libtransitive"],
350 }
351
352 cc_library_static {
353 name: "libubsan",
354 host_supported: true,
355 srcs: ["src.cc"],
356 whole_static_libs: ["libtransitive"],
357 sanitize: {
358 misc_undefined: ["integer"],
359 }
360 }
361
362 cc_library_static {
363 name: "libtransitive",
364 host_supported: true,
365 srcs: ["src.cc"],
366 }
367`
368
369 result := android.GroupFixturePreparers(
370 prepareForCcTest,
371 ).RunTestWithBp(t, bp)
372
373 check := func(t *testing.T, result *android.TestResult, variant string) {
374 ctx := result.TestContext
375 staticVariant := variant + "_static"
376
377 // The binaries, one with ubsan and one without
378 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
379 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
380
381 // Static libraries that don't request ubsan
382 libStatic := result.ModuleForTests("libstatic", staticVariant)
383 libTransitive := result.ModuleForTests("libtransitive", staticVariant)
384
385 libUbsan := result.ModuleForTests("libubsan", staticVariant)
386
387 libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
388
389 expectStaticLinkDep(t, ctx, binWithUbsan, libStatic)
390 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan)
391 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsanMinimal)
392
393 miscUndefinedSanFlag := "-fsanitize=integer"
394 binWithUbsanCflags := binWithUbsan.Rule("cc").Args["cFlags"]
395 if !strings.Contains(binWithUbsanCflags, miscUndefinedSanFlag) {
396 t.Errorf("'bin_with_ubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
397 }
398 libStaticCflags := libStatic.Rule("cc").Args["cFlags"]
399 if strings.Contains(libStaticCflags, miscUndefinedSanFlag) {
400 t.Errorf("'libstatic' Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
401 }
402 libUbsanCflags := libUbsan.Rule("cc").Args["cFlags"]
403 if !strings.Contains(libUbsanCflags, miscUndefinedSanFlag) {
404 t.Errorf("'libubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
405 }
406 libTransitiveCflags := libTransitive.Rule("cc").Args["cFlags"]
407 if strings.Contains(libTransitiveCflags, miscUndefinedSanFlag) {
408 t.Errorf("'libtransitive': Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
409 }
410
411 expectStaticLinkDep(t, ctx, binNoUbsan, libStatic)
412 expectStaticLinkDep(t, ctx, binNoUbsan, libUbsan)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400413 }
414
415 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
416 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
417}
418
419func TestFuzz(t *testing.T) {
420 bp := `
421 cc_binary {
422 name: "bin_with_fuzzer",
423 host_supported: true,
424 shared_libs: [
425 "libshared",
426 "libfuzzer",
427 ],
428 static_libs: [
429 "libstatic",
430 "libnofuzzer",
431 "libstatic_fuzzer",
432 ],
433 sanitize: {
434 fuzzer: true,
435 }
436 }
437
438 cc_binary {
439 name: "bin_no_fuzzer",
440 host_supported: true,
441 shared_libs: [
442 "libshared",
443 "libfuzzer",
444 ],
445 static_libs: [
446 "libstatic",
447 "libnofuzzer",
448 "libstatic_fuzzer",
449 ],
450 }
451
452 cc_library_shared {
453 name: "libshared",
454 host_supported: true,
455 shared_libs: ["libtransitive"],
456 }
457
458 cc_library_shared {
459 name: "libfuzzer",
460 host_supported: true,
461 shared_libs: ["libtransitive"],
462 sanitize: {
463 fuzzer: true,
464 }
465 }
466
467 cc_library_shared {
468 name: "libtransitive",
469 host_supported: true,
470 }
471
472 cc_library_static {
473 name: "libstatic",
474 host_supported: true,
475 }
476
477 cc_library_static {
478 name: "libnofuzzer",
479 host_supported: true,
480 sanitize: {
481 fuzzer: false,
482 }
483 }
484
485 cc_library_static {
486 name: "libstatic_fuzzer",
487 host_supported: true,
488 }
489
490 `
491
492 result := android.GroupFixturePreparers(
493 prepareForCcTest,
494 ).RunTestWithBp(t, bp)
495
496 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400497 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400498 fuzzerVariant := variant + "_fuzzer"
499 sharedVariant := variant + "_shared"
500 sharedFuzzerVariant := sharedVariant + "_fuzzer"
501 staticVariant := variant + "_static"
502 staticFuzzerVariant := staticVariant + "_fuzzer"
503
504 // The binaries, one with fuzzer and one without
505 binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant)
506 binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant)
507
508 // Shared libraries that don't request fuzzer
509 libShared := result.ModuleForTests("libshared", sharedVariant)
510 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
511
512 // Shared libraries that don't request fuzzer
513 libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant)
514 libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant)
515
516 // Shared library that requests fuzzer
517 libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant)
518
519 // Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant
520 // for bin_no_fuzzer.
521 libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant)
522 libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant)
523
524 // Static library that never uses fuzzer.
525 libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant)
526
527 // Static library that specifies fuzzer
528 libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant)
529 libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant)
530
Liz Kammer92c72592022-10-31 14:44:28 -0400531 expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer)
532 expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer)
533 expectSharedLinkDep(t, ctx, libSharedFuzzer, libTransitiveFuzzer)
534 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400535
Liz Kammer92c72592022-10-31 14:44:28 -0400536 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzerVariant)
537 expectStaticLinkDep(t, ctx, binWithFuzzer, libNoFuzzer)
538 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400539
Liz Kammer92c72592022-10-31 14:44:28 -0400540 expectSharedLinkDep(t, ctx, binNoFuzzer, libShared)
541 expectSharedLinkDep(t, ctx, binNoFuzzer, libFuzzer)
542 expectSharedLinkDep(t, ctx, libShared, libTransitive)
543 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400544
Liz Kammer92c72592022-10-31 14:44:28 -0400545 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticNoFuzzerVariant)
546 expectStaticLinkDep(t, ctx, binNoFuzzer, libNoFuzzer)
547 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticFuzzerNoFuzzerVariant)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400548 }
549
550 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
551}
552
Colin Cross3e5e7782022-06-17 22:17:05 +0000553func TestUbsan(t *testing.T) {
554 if runtime.GOOS != "linux" {
555 t.Skip("requires linux")
556 }
557
558 bp := `
559 cc_binary {
560 name: "bin_with_ubsan",
561 host_supported: true,
562 shared_libs: [
563 "libshared",
564 ],
565 static_libs: [
566 "libstatic",
567 "libnoubsan",
568 ],
569 sanitize: {
570 undefined: true,
571 }
572 }
573
574 cc_binary {
575 name: "bin_depends_ubsan",
576 host_supported: true,
577 shared_libs: [
578 "libshared",
579 ],
580 static_libs: [
581 "libstatic",
582 "libubsan",
583 "libnoubsan",
584 ],
585 }
586
587 cc_binary {
588 name: "bin_no_ubsan",
589 host_supported: true,
590 shared_libs: [
591 "libshared",
592 ],
593 static_libs: [
594 "libstatic",
595 "libnoubsan",
596 ],
597 }
598
599 cc_library_shared {
600 name: "libshared",
601 host_supported: true,
602 shared_libs: ["libtransitive"],
603 }
604
605 cc_library_shared {
606 name: "libtransitive",
607 host_supported: true,
608 }
609
610 cc_library_static {
611 name: "libubsan",
612 host_supported: true,
613 sanitize: {
614 undefined: true,
615 }
616 }
617
618 cc_library_static {
619 name: "libstatic",
620 host_supported: true,
621 }
622
623 cc_library_static {
624 name: "libnoubsan",
625 host_supported: true,
626 }
627 `
628
629 result := android.GroupFixturePreparers(
630 prepareForCcTest,
631 ).RunTestWithBp(t, bp)
632
633 check := func(t *testing.T, result *android.TestResult, variant string) {
634 staticVariant := variant + "_static"
635
636 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
637
638 // The binaries, one with ubsan and one without
639 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
640 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan", variant)
641 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
642
643 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
644 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
645 minimalRuntime.OutputFiles(t, "")[0].String())
646
647 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan static libs",
648 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
649 minimalRuntime.OutputFiles(t, "")[0].String())
650
651 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
652 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
653 minimalRuntime.OutputFiles(t, "")[0].String())
654
655 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
656 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
657 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
658
659 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan static libs",
660 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
661 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
662
663 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
664 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
665 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
666 }
667
668 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
669 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
670}
671
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400672type MemtagNoteType int
673
674const (
675 None MemtagNoteType = iota + 1
676 Sync
677 Async
678)
679
680func (t MemtagNoteType) str() string {
681 switch t {
682 case None:
683 return "none"
684 case Sync:
685 return "sync"
686 case Async:
687 return "async"
688 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400689 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400690 }
691}
692
693func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400694 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400695
696 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000697 ldFlags := m.Rule("ld").Args["ldFlags"]
698 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
699 found = Async
700 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
701 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400702 }
703
704 if found != expected {
705 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
706 }
707}
708
709var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
710 android.FixtureModifyMockFS(func(fs android.MockFS) {
711 templateBp := `
712 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400713 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400714 gtest: false,
715 }
716
717 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400718 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400719 gtest: false,
720 sanitize: { memtag_heap: false },
721 }
722
723 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400724 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400725 gtest: false,
726 sanitize: { memtag_heap: true },
727 }
728
729 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400730 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400731 gtest: false,
732 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
733 }
734
735 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400736 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400737 gtest: false,
738 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
739 }
740
Liz Kammerd56ddb52021-06-21 17:37:39 -0400741 cc_test {
742 name: "unset_memtag_set_sync_test_%[1]s",
743 gtest: false,
744 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400745 }
746
747 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400748 name: "unset_binary_%[1]s",
749 }
750
751 cc_binary {
752 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400753 sanitize: { memtag_heap: false },
754 }
755
756 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400757 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400758 sanitize: { memtag_heap: true },
759 }
760
761 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400762 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400763 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
764 }
765
766 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400767 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400768 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
769 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400770
771 cc_binary {
772 name: "unset_memtag_set_sync_binary_%[1]s",
773 sanitize: { diag: { memtag_heap: true } },
774 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400775 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400776 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
777 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
778 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
779 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400780
781 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400782 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
783 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
784 "subdir_sync/Android.bp": []byte(subdirSyncBp),
785 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400786 })
787 }),
788 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400789 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
790 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
791 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
792 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400793 }),
794)
795
796func TestSanitizeMemtagHeap(t *testing.T) {
797 variant := "android_arm64_armv8-a"
798
799 result := android.GroupFixturePreparers(
800 prepareForCcTest,
801 prepareForTestWithMemtagHeap,
802 ).RunTest(t)
803 ctx := result.TestContext
804
Liz Kammerd56ddb52021-06-21 17:37:39 -0400805 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
806 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
807 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
808 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400809
Liz Kammerd56ddb52021-06-21 17:37:39 -0400810 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
811 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
812 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
813 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400814
Liz Kammerd56ddb52021-06-21 17:37:39 -0400815 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
816 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
817 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
818 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400819
Liz Kammer7b920b42021-06-22 16:57:27 -0400820 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
821 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
822 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400823 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400824
Liz Kammerd56ddb52021-06-21 17:37:39 -0400825 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
826 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
827 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
828 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400829
Liz Kammerd56ddb52021-06-21 17:37:39 -0400830 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
831 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
832 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
833 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400834
Liz Kammerd56ddb52021-06-21 17:37:39 -0400835 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
836 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
837 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
838 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400839
Liz Kammerd56ddb52021-06-21 17:37:39 -0400840 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
841 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
842 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
843 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
844
845 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
846 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
847 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
848 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
849 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
850 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
851
852 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
853 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
854 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
855 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
856
857 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
858 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
859 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
860 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
861
862 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
863 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
864 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
865 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400866}
867
868func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
869 variant := "android_arm64_armv8-a"
870
871 result := android.GroupFixturePreparers(
872 prepareForCcTest,
873 prepareForTestWithMemtagHeap,
874 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
875 variables.SanitizeDevice = []string{"memtag_heap"}
876 }),
877 ).RunTest(t)
878 ctx := result.TestContext
879
Liz Kammerd56ddb52021-06-21 17:37:39 -0400880 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
881 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
882 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
883 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400884
Liz Kammerd56ddb52021-06-21 17:37:39 -0400885 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
886 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
887 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
888 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400889
Liz Kammerd56ddb52021-06-21 17:37:39 -0400890 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
891 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
892 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
893 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400894
Liz Kammer7b920b42021-06-22 16:57:27 -0400895 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
896 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
897 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400898 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400899
Liz Kammerd56ddb52021-06-21 17:37:39 -0400900 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
901 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
902 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
903 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400904
Liz Kammerd56ddb52021-06-21 17:37:39 -0400905 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
906 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
907 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
908 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400909
Liz Kammerd56ddb52021-06-21 17:37:39 -0400910 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
911 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
912 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
913 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400914
Liz Kammerd56ddb52021-06-21 17:37:39 -0400915 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
916 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
917 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
918 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
919
920 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
921 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
922 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
923 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
924 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
925
926 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
927 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
928 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
929 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
930
931 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
932 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
933 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
934 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
935
936 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
937 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
938 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
939 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400940}
941
942func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
943 variant := "android_arm64_armv8-a"
944
945 result := android.GroupFixturePreparers(
946 prepareForCcTest,
947 prepareForTestWithMemtagHeap,
948 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
949 variables.SanitizeDevice = []string{"memtag_heap"}
950 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
951 }),
952 ).RunTest(t)
953 ctx := result.TestContext
954
Liz Kammerd56ddb52021-06-21 17:37:39 -0400955 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
956 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
957 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
958 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400959
Liz Kammerd56ddb52021-06-21 17:37:39 -0400960 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
961 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
962 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
963 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400964
Liz Kammerd56ddb52021-06-21 17:37:39 -0400965 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
966 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
967 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
968 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400969
Liz Kammerd56ddb52021-06-21 17:37:39 -0400970 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
971 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
972 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
973 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400974
Liz Kammerd56ddb52021-06-21 17:37:39 -0400975 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
976 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
977 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
978 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400979
Liz Kammerd56ddb52021-06-21 17:37:39 -0400980 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
981 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
982 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
983 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400984
Liz Kammerd56ddb52021-06-21 17:37:39 -0400985 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
986 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
987 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
988 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400989
Liz Kammerd56ddb52021-06-21 17:37:39 -0400990 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
991 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
992 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
993 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
994
995 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
996 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
997 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
998 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
999 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1000
1001 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1002 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1003 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1004 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1005
1006 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1007 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1008 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1009 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1010
1011 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1012 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1013 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1014 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001015}