blob: 143602a09a23fce4f83b1e8e187bfa63716592f9 [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 {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000575 name: "bin_depends_ubsan_static",
Colin Cross3e5e7782022-06-17 22:17:05 +0000576 host_supported: true,
577 shared_libs: [
578 "libshared",
579 ],
580 static_libs: [
581 "libstatic",
582 "libubsan",
583 "libnoubsan",
584 ],
585 }
586
587 cc_binary {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000588 name: "bin_depends_ubsan_shared",
589 host_supported: true,
590 shared_libs: [
591 "libsharedubsan",
592 ],
593 }
594
595 cc_binary {
Colin Cross3e5e7782022-06-17 22:17:05 +0000596 name: "bin_no_ubsan",
597 host_supported: true,
598 shared_libs: [
599 "libshared",
600 ],
601 static_libs: [
602 "libstatic",
603 "libnoubsan",
604 ],
605 }
606
607 cc_library_shared {
608 name: "libshared",
609 host_supported: true,
610 shared_libs: ["libtransitive"],
611 }
612
613 cc_library_shared {
614 name: "libtransitive",
615 host_supported: true,
616 }
617
Trevor Radcliffe99815552022-11-14 21:35:05 +0000618 cc_library_shared {
619 name: "libsharedubsan",
620 host_supported: true,
621 sanitize: {
622 undefined: true,
623 }
624 }
625
Colin Cross3e5e7782022-06-17 22:17:05 +0000626 cc_library_static {
627 name: "libubsan",
628 host_supported: true,
629 sanitize: {
630 undefined: true,
631 }
632 }
633
634 cc_library_static {
635 name: "libstatic",
636 host_supported: true,
637 }
638
639 cc_library_static {
640 name: "libnoubsan",
641 host_supported: true,
642 }
643 `
644
645 result := android.GroupFixturePreparers(
646 prepareForCcTest,
647 ).RunTestWithBp(t, bp)
648
649 check := func(t *testing.T, result *android.TestResult, variant string) {
650 staticVariant := variant + "_static"
Trevor Radcliffe99815552022-11-14 21:35:05 +0000651 sharedVariant := variant + "_shared"
Colin Cross3e5e7782022-06-17 22:17:05 +0000652
653 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
654
655 // The binaries, one with ubsan and one without
656 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
Trevor Radcliffe99815552022-11-14 21:35:05 +0000657 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan_static", variant)
658 libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant)
659 binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant)
Colin Cross3e5e7782022-06-17 22:17:05 +0000660 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
661
662 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
663 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
664 minimalRuntime.OutputFiles(t, "")[0].String())
665
Trevor Radcliffe99815552022-11-14 21:35:05 +0000666 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000667 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
668 minimalRuntime.OutputFiles(t, "")[0].String())
669
Trevor Radcliffe99815552022-11-14 21:35:05 +0000670 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in libsharedubsan static libs",
671 strings.Split(libSharedUbsan.Rule("ld").Args["libFlags"], " "),
672 minimalRuntime.OutputFiles(t, "")[0].String())
673
674 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_depends_ubsan_shared static libs",
675 strings.Split(binDependsUbsanShared.Rule("ld").Args["libFlags"], " "),
676 minimalRuntime.OutputFiles(t, "")[0].String())
677
Colin Cross3e5e7782022-06-17 22:17:05 +0000678 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
679 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
680 minimalRuntime.OutputFiles(t, "")[0].String())
681
682 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
683 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
684 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
685
Trevor Radcliffe99815552022-11-14 21:35:05 +0000686 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000687 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
688 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
689
Trevor Radcliffe99815552022-11-14 21:35:05 +0000690 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in libsharedubsan static libs",
691 strings.Split(libSharedUbsan.Rule("ld").Args["ldFlags"], " "),
692 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
693
694 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_shared static libs",
695 strings.Split(binDependsUbsanShared.Rule("ld").Args["ldFlags"], " "),
696 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
697
Colin Cross3e5e7782022-06-17 22:17:05 +0000698 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
699 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
700 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
701 }
702
703 t.Run("host", func(t *testing.T) { check(t, result, result.Config.BuildOSTarget.String()) })
704 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
705}
706
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400707type MemtagNoteType int
708
709const (
710 None MemtagNoteType = iota + 1
711 Sync
712 Async
713)
714
715func (t MemtagNoteType) str() string {
716 switch t {
717 case None:
718 return "none"
719 case Sync:
720 return "sync"
721 case Async:
722 return "async"
723 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400724 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400725 }
726}
727
728func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400729 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400730
731 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000732 ldFlags := m.Rule("ld").Args["ldFlags"]
733 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
734 found = Async
735 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
736 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400737 }
738
739 if found != expected {
740 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
741 }
742}
743
744var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
745 android.FixtureModifyMockFS(func(fs android.MockFS) {
746 templateBp := `
747 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400748 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400749 gtest: false,
750 }
751
752 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400753 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400754 gtest: false,
755 sanitize: { memtag_heap: false },
756 }
757
758 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400759 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400760 gtest: false,
761 sanitize: { memtag_heap: true },
762 }
763
764 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400765 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400766 gtest: false,
767 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
768 }
769
770 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400771 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400772 gtest: false,
773 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
774 }
775
Liz Kammerd56ddb52021-06-21 17:37:39 -0400776 cc_test {
777 name: "unset_memtag_set_sync_test_%[1]s",
778 gtest: false,
779 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400780 }
781
782 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400783 name: "unset_binary_%[1]s",
784 }
785
786 cc_binary {
787 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400788 sanitize: { memtag_heap: false },
789 }
790
791 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400792 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400793 sanitize: { memtag_heap: true },
794 }
795
796 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400797 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400798 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
799 }
800
801 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400802 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400803 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
804 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400805
806 cc_binary {
807 name: "unset_memtag_set_sync_binary_%[1]s",
808 sanitize: { diag: { memtag_heap: true } },
809 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400810 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400811 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
812 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
813 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
814 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400815
816 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400817 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
818 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
819 "subdir_sync/Android.bp": []byte(subdirSyncBp),
820 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400821 })
822 }),
823 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400824 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
825 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
826 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
827 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400828 }),
829)
830
831func TestSanitizeMemtagHeap(t *testing.T) {
832 variant := "android_arm64_armv8-a"
833
834 result := android.GroupFixturePreparers(
835 prepareForCcTest,
836 prepareForTestWithMemtagHeap,
837 ).RunTest(t)
838 ctx := result.TestContext
839
Liz Kammerd56ddb52021-06-21 17:37:39 -0400840 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
841 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
842 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
843 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400844
Liz Kammerd56ddb52021-06-21 17:37:39 -0400845 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
846 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
847 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
848 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400849
Liz Kammerd56ddb52021-06-21 17:37:39 -0400850 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
851 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
852 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
853 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400854
Liz Kammer7b920b42021-06-22 16:57:27 -0400855 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
856 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
857 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400858 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400859
Liz Kammerd56ddb52021-06-21 17:37:39 -0400860 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
861 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
862 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
863 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400864
Liz Kammerd56ddb52021-06-21 17:37:39 -0400865 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
866 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
867 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
868 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400869
Liz Kammerd56ddb52021-06-21 17:37:39 -0400870 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
871 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
872 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
873 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400874
Liz Kammerd56ddb52021-06-21 17:37:39 -0400875 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
876 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
877 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
878 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
879
880 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
881 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
882 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
883 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
884 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
885 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
886
887 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
888 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
889 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
890 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
891
892 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
893 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
894 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
895 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
896
897 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
898 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
899 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
900 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400901}
902
903func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
904 variant := "android_arm64_armv8-a"
905
906 result := android.GroupFixturePreparers(
907 prepareForCcTest,
908 prepareForTestWithMemtagHeap,
909 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
910 variables.SanitizeDevice = []string{"memtag_heap"}
911 }),
912 ).RunTest(t)
913 ctx := result.TestContext
914
Liz Kammerd56ddb52021-06-21 17:37:39 -0400915 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
916 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
917 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
918 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400919
Liz Kammerd56ddb52021-06-21 17:37:39 -0400920 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
921 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
922 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
923 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400924
Liz Kammerd56ddb52021-06-21 17:37:39 -0400925 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
926 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
927 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
928 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400929
Liz Kammer7b920b42021-06-22 16:57:27 -0400930 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
931 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
932 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400933 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400934
Liz Kammerd56ddb52021-06-21 17:37:39 -0400935 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
936 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
937 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
938 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400939
Liz Kammerd56ddb52021-06-21 17:37:39 -0400940 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
941 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
942 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
943 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400944
Liz Kammerd56ddb52021-06-21 17:37:39 -0400945 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
946 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
947 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
948 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400949
Liz Kammerd56ddb52021-06-21 17:37:39 -0400950 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
951 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
952 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
953 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
954
955 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
956 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
957 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
958 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
959 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
960
961 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
962 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
963 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
964 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
965
966 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
967 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
968 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
969 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
970
971 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
972 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
973 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
974 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400975}
976
977func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
978 variant := "android_arm64_armv8-a"
979
980 result := android.GroupFixturePreparers(
981 prepareForCcTest,
982 prepareForTestWithMemtagHeap,
983 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
984 variables.SanitizeDevice = []string{"memtag_heap"}
985 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
986 }),
987 ).RunTest(t)
988 ctx := result.TestContext
989
Liz Kammerd56ddb52021-06-21 17:37:39 -0400990 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
991 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
992 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
993 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400994
Liz Kammerd56ddb52021-06-21 17:37:39 -0400995 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
996 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
997 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
998 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400999
Liz Kammerd56ddb52021-06-21 17:37:39 -04001000 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
1001 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
1002 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
1003 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001004
Liz Kammerd56ddb52021-06-21 17:37:39 -04001005 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1006 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1007 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1008 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001009
Liz Kammerd56ddb52021-06-21 17:37:39 -04001010 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1011 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1012 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1013 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001014
Liz Kammerd56ddb52021-06-21 17:37:39 -04001015 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1016 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1017 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1018 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001019
Liz Kammerd56ddb52021-06-21 17:37:39 -04001020 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1021 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1022 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1023 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001024
Liz Kammerd56ddb52021-06-21 17:37:39 -04001025 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1026 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1027 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1028 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1029
1030 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1031 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1032 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1033 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1034 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1035
1036 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1037 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1038 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1039 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1040
1041 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1042 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1043 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1044 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1045
1046 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1047 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1048 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1049 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001050}