blob: 71c5a2298769f168d29ae1b3962508a87bef356f [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 Cross5dc62c92023-02-15 12:20:19 -080031 host_supported: true,
32 }
33 cc_library_static {
34 name: "libclang_rt.asan.static",
35 host_supported: true,
36 }
37 cc_library_static {
38 name: "libclang_rt.asan_cxx.static",
39 host_supported: true,
Colin Crossaf98f582021-05-12 17:27:32 -070040 }
41`))
42
Liz Kammerfd8a49f2022-10-31 10:31:11 -040043var prepareForTsanTest = android.FixtureAddFile("tsan/Android.bp", []byte(`
44 cc_library_shared {
45 name: "libclang_rt.tsan",
Colin Cross5dc62c92023-02-15 12:20:19 -080046 host_supported: true,
Liz Kammerfd8a49f2022-10-31 10:31:11 -040047 }
48`))
49
Liz Kammer92c72592022-10-31 14:44:28 -040050type providerInterface interface {
51 ModuleProvider(blueprint.Module, blueprint.ProviderKey) interface{}
52}
53
Liz Kammerfd8a49f2022-10-31 10:31:11 -040054// expectSharedLinkDep verifies that the from module links against the to module as a
55// shared library.
Liz Kammer92c72592022-10-31 14:44:28 -040056func expectSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040057 t.Helper()
58 fromLink := from.Description("link")
Liz Kammer92c72592022-10-31 14:44:28 -040059 toInfo := ctx.ModuleProvider(to.Module(), SharedLibraryInfoProvider).(SharedLibraryInfo)
Liz Kammerfd8a49f2022-10-31 10:31:11 -040060
Liz Kammer92c72592022-10-31 14:44:28 -040061 if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); !android.InList(w, g) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040062 t.Errorf("%s should link against %s, expected %q, got %q",
63 from.Module(), to.Module(), w, g)
64 }
65}
66
Colin Cross5dc62c92023-02-15 12:20:19 -080067// expectNoSharedLinkDep verifies that the from module links against the to module as a
68// shared library.
69func expectNoSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
70 t.Helper()
71 fromLink := from.Description("link")
72 toInfo := ctx.ModuleProvider(to.Module(), SharedLibraryInfoProvider).(SharedLibraryInfo)
73
74 if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); android.InList(w, g) {
75 t.Errorf("%s should not link against %s, expected %q, got %q",
76 from.Module(), to.Module(), w, g)
77 }
78}
79
Liz Kammerfd8a49f2022-10-31 10:31:11 -040080// expectStaticLinkDep verifies that the from module links against the to module as a
81// static library.
Liz Kammer92c72592022-10-31 14:44:28 -040082func expectStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040083 t.Helper()
84 fromLink := from.Description("link")
Liz Kammer92c72592022-10-31 14:44:28 -040085 toInfo := ctx.ModuleProvider(to.Module(), StaticLibraryInfoProvider).(StaticLibraryInfo)
Liz Kammerfd8a49f2022-10-31 10:31:11 -040086
Liz Kammer92c72592022-10-31 14:44:28 -040087 if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); !android.InList(w, g) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040088 t.Errorf("%s should link against %s, expected %q, got %q",
89 from.Module(), to.Module(), w, g)
90 }
91
92}
93
Colin Cross5dc62c92023-02-15 12:20:19 -080094// expectNoStaticLinkDep verifies that the from module links against the to module as a
95// static library.
96func expectNoStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
97 t.Helper()
98 fromLink := from.Description("link")
99 toInfo := ctx.ModuleProvider(to.Module(), StaticLibraryInfoProvider).(StaticLibraryInfo)
100
101 if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); android.InList(w, g) {
102 t.Errorf("%s should not link against %s, expected %q, got %q",
103 from.Module(), to.Module(), w, g)
104 }
105
106}
107
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400108// expectInstallDep verifies that the install rule of the from module depends on the
109// install rule of the to module.
110func expectInstallDep(t *testing.T, from, to android.TestingModule) {
111 t.Helper()
112 fromInstalled := from.Description("install")
113 toInstalled := to.Description("install")
114
115 // combine implicits and order-only dependencies, host uses implicit but device uses
116 // order-only.
117 got := append(fromInstalled.Implicits.Strings(), fromInstalled.OrderOnly.Strings()...)
118 want := toInstalled.Output.String()
119 if !android.InList(want, got) {
120 t.Errorf("%s installation should depend on %s, expected %q, got %q",
121 from.Module(), to.Module(), want, got)
122 }
123}
124
Colin Cross5dc62c92023-02-15 12:20:19 -0800125type expectedRuntimeLinkage int
126
127const (
128 RUNTIME_LINKAGE_NONE = expectedRuntimeLinkage(0)
129 RUNTIME_LINKAGE_SHARED = iota
130)
131
Colin Crossaf98f582021-05-12 17:27:32 -0700132func TestAsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400133 t.Parallel()
Colin Crossaf98f582021-05-12 17:27:32 -0700134 bp := `
135 cc_binary {
136 name: "bin_with_asan",
137 host_supported: true,
138 shared_libs: [
139 "libshared",
140 "libasan",
141 ],
142 static_libs: [
143 "libstatic",
144 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400145 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700146 ],
147 sanitize: {
148 address: true,
149 }
150 }
151
152 cc_binary {
153 name: "bin_no_asan",
154 host_supported: true,
155 shared_libs: [
156 "libshared",
157 "libasan",
158 ],
159 static_libs: [
160 "libstatic",
161 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400162 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700163 ],
164 }
165
166 cc_library_shared {
167 name: "libshared",
168 host_supported: true,
169 shared_libs: ["libtransitive"],
170 }
171
172 cc_library_shared {
173 name: "libasan",
174 host_supported: true,
175 shared_libs: ["libtransitive"],
176 sanitize: {
177 address: true,
178 }
179 }
180
181 cc_library_shared {
182 name: "libtransitive",
183 host_supported: true,
184 }
185
186 cc_library_static {
187 name: "libstatic",
188 host_supported: true,
189 }
190
191 cc_library_static {
192 name: "libnoasan",
193 host_supported: true,
194 sanitize: {
195 address: false,
196 }
197 }
Liz Kammerecc659c2022-10-28 16:27:13 -0400198
199 cc_library_static {
200 name: "libstatic_asan",
201 host_supported: true,
202 sanitize: {
203 address: true,
204 }
205 }
206
Colin Crossaf98f582021-05-12 17:27:32 -0700207 `
208
Colin Cross5dc62c92023-02-15 12:20:19 -0800209 preparer := android.GroupFixturePreparers(
Colin Crossaf98f582021-05-12 17:27:32 -0700210 prepareForCcTest,
211 prepareForAsanTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800212 )
213 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Colin Crossaf98f582021-05-12 17:27:32 -0700214
Colin Cross5dc62c92023-02-15 12:20:19 -0800215 check := func(t *testing.T, variant string, runtimeLinkage expectedRuntimeLinkage, preparer android.FixturePreparer) {
216 result := preparer.RunTestWithBp(t, bp)
Liz Kammer92c72592022-10-31 14:44:28 -0400217 ctx := result.TestContext
Colin Crossaf98f582021-05-12 17:27:32 -0700218 asanVariant := variant + "_asan"
219 sharedVariant := variant + "_shared"
220 sharedAsanVariant := sharedVariant + "_asan"
221 staticVariant := variant + "_static"
222 staticAsanVariant := staticVariant + "_asan"
223
224 // The binaries, one with asan and one without
225 binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant)
226 binNoAsan := result.ModuleForTests("bin_no_asan", variant)
227
228 // Shared libraries that don't request asan
229 libShared := result.ModuleForTests("libshared", sharedVariant)
230 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
231
232 // Shared library that requests asan
233 libAsan := result.ModuleForTests("libasan", sharedAsanVariant)
234
235 // Static library that uses an asan variant for bin_with_asan and a non-asan variant
236 // for bin_no_asan.
237 libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant)
238 libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant)
239
240 // Static library that never uses asan.
241 libNoAsan := result.ModuleForTests("libnoasan", staticVariant)
242
Liz Kammerecc659c2022-10-28 16:27:13 -0400243 // Static library that specifies asan
244 libStaticAsan := result.ModuleForTests("libstatic_asan", staticAsanVariant)
245 libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
246
Colin Cross5dc62c92023-02-15 12:20:19 -0800247 libAsanSharedRuntime := result.ModuleForTests("libclang_rt.asan", sharedVariant)
248
Liz Kammer92c72592022-10-31 14:44:28 -0400249 expectSharedLinkDep(t, ctx, binWithAsan, libShared)
250 expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
251 expectSharedLinkDep(t, ctx, libShared, libTransitive)
252 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700253
Liz Kammer92c72592022-10-31 14:44:28 -0400254 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsanVariant)
255 expectStaticLinkDep(t, ctx, binWithAsan, libNoAsan)
256 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsan)
Colin Crossaf98f582021-05-12 17:27:32 -0700257
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400258 expectInstallDep(t, binWithAsan, libShared)
259 expectInstallDep(t, binWithAsan, libAsan)
260 expectInstallDep(t, binWithAsan, libTransitive)
261 expectInstallDep(t, libShared, libTransitive)
262 expectInstallDep(t, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700263
Liz Kammer92c72592022-10-31 14:44:28 -0400264 expectSharedLinkDep(t, ctx, binNoAsan, libShared)
265 expectSharedLinkDep(t, ctx, binNoAsan, libAsan)
266 expectSharedLinkDep(t, ctx, libShared, libTransitive)
267 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700268
Liz Kammer92c72592022-10-31 14:44:28 -0400269 expectStaticLinkDep(t, ctx, binNoAsan, libStaticNoAsanVariant)
270 expectStaticLinkDep(t, ctx, binNoAsan, libNoAsan)
271 expectStaticLinkDep(t, ctx, binNoAsan, libStaticAsanNoAsanVariant)
Colin Crossaf98f582021-05-12 17:27:32 -0700272
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400273 expectInstallDep(t, binNoAsan, libShared)
274 expectInstallDep(t, binNoAsan, libAsan)
275 expectInstallDep(t, binNoAsan, libTransitive)
276 expectInstallDep(t, libShared, libTransitive)
277 expectInstallDep(t, libAsan, libTransitive)
Colin Cross5dc62c92023-02-15 12:20:19 -0800278
279 if runtimeLinkage == RUNTIME_LINKAGE_SHARED {
280 expectSharedLinkDep(t, ctx, binWithAsan, libAsanSharedRuntime)
281 expectNoSharedLinkDep(t, ctx, binNoAsan, libAsanSharedRuntime)
282 expectSharedLinkDep(t, ctx, libAsan, libAsanSharedRuntime)
283 expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
284 expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
285 } else {
286 expectNoSharedLinkDep(t, ctx, binWithAsan, libAsanSharedRuntime)
287 expectNoSharedLinkDep(t, ctx, binNoAsan, libAsanSharedRuntime)
288 expectNoSharedLinkDep(t, ctx, libAsan, libAsanSharedRuntime)
289 expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
290 expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
291 }
Colin Crossaf98f582021-05-12 17:27:32 -0700292 }
293
Colin Cross5dc62c92023-02-15 12:20:19 -0800294 t.Run("host", func(t *testing.T) { check(t, buildOS, RUNTIME_LINKAGE_NONE, preparer) })
295 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", RUNTIME_LINKAGE_SHARED, preparer) })
296 t.Run("host musl", func(t *testing.T) {
297 check(t, "linux_musl_x86_64", RUNTIME_LINKAGE_SHARED,
298 android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
299 })
Colin Crossaf98f582021-05-12 17:27:32 -0700300}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400301
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400302func TestTsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400303 t.Parallel()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400304 bp := `
305 cc_binary {
306 name: "bin_with_tsan",
307 host_supported: true,
308 shared_libs: [
309 "libshared",
310 "libtsan",
311 ],
312 sanitize: {
313 thread: true,
314 }
315 }
316
317 cc_binary {
318 name: "bin_no_tsan",
319 host_supported: true,
320 shared_libs: [
321 "libshared",
322 "libtsan",
323 ],
324 }
325
326 cc_library_shared {
327 name: "libshared",
328 host_supported: true,
329 shared_libs: ["libtransitive"],
330 }
331
332 cc_library_shared {
333 name: "libtsan",
334 host_supported: true,
335 shared_libs: ["libtransitive"],
336 sanitize: {
337 thread: true,
338 }
339 }
340
341 cc_library_shared {
342 name: "libtransitive",
343 host_supported: true,
344 }
345`
346
Colin Cross5dc62c92023-02-15 12:20:19 -0800347 preparer := android.GroupFixturePreparers(
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400348 prepareForCcTest,
349 prepareForTsanTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800350 )
351 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400352
Colin Cross5dc62c92023-02-15 12:20:19 -0800353 check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
354 result := preparer.RunTestWithBp(t, bp)
Liz Kammer92c72592022-10-31 14:44:28 -0400355 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400356 tsanVariant := variant + "_tsan"
357 sharedVariant := variant + "_shared"
358 sharedTsanVariant := sharedVariant + "_tsan"
359
360 // The binaries, one with tsan and one without
361 binWithTsan := result.ModuleForTests("bin_with_tsan", tsanVariant)
362 binNoTsan := result.ModuleForTests("bin_no_tsan", variant)
363
364 // Shared libraries that don't request tsan
365 libShared := result.ModuleForTests("libshared", sharedVariant)
366 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
367
368 // Shared library that requests tsan
369 libTsan := result.ModuleForTests("libtsan", sharedTsanVariant)
370
Liz Kammer92c72592022-10-31 14:44:28 -0400371 expectSharedLinkDep(t, ctx, binWithTsan, libShared)
372 expectSharedLinkDep(t, ctx, binWithTsan, libTsan)
373 expectSharedLinkDep(t, ctx, libShared, libTransitive)
374 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400375
Liz Kammer92c72592022-10-31 14:44:28 -0400376 expectSharedLinkDep(t, ctx, binNoTsan, libShared)
377 expectSharedLinkDep(t, ctx, binNoTsan, libTsan)
378 expectSharedLinkDep(t, ctx, libShared, libTransitive)
379 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
380 }
381
Colin Cross5dc62c92023-02-15 12:20:19 -0800382 t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
383 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
384 t.Run("host musl", func(t *testing.T) {
385 check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
386 })
Liz Kammer92c72592022-10-31 14:44:28 -0400387}
388
389func TestMiscUndefined(t *testing.T) {
Liz Kammer2a109bc2022-12-02 09:36:01 -0500390 if runtime.GOOS != "linux" {
391 t.Skip("requires linux")
392 }
393
Liz Kammer7c5d1592022-10-31 16:27:38 -0400394 t.Parallel()
Liz Kammer92c72592022-10-31 14:44:28 -0400395 bp := `
396 cc_binary {
397 name: "bin_with_ubsan",
398 srcs: ["src.cc"],
399 host_supported: true,
400 static_libs: [
401 "libstatic",
402 "libubsan",
403 ],
404 sanitize: {
405 misc_undefined: ["integer"],
406 }
407 }
408
409 cc_binary {
410 name: "bin_no_ubsan",
411 host_supported: true,
412 srcs: ["src.cc"],
413 static_libs: [
414 "libstatic",
415 "libubsan",
416 ],
417 }
418
419 cc_library_static {
420 name: "libstatic",
421 host_supported: true,
422 srcs: ["src.cc"],
423 static_libs: ["libtransitive"],
424 }
425
426 cc_library_static {
427 name: "libubsan",
428 host_supported: true,
429 srcs: ["src.cc"],
430 whole_static_libs: ["libtransitive"],
431 sanitize: {
432 misc_undefined: ["integer"],
433 }
434 }
435
436 cc_library_static {
437 name: "libtransitive",
438 host_supported: true,
439 srcs: ["src.cc"],
440 }
441`
442
Colin Cross5dc62c92023-02-15 12:20:19 -0800443 preparer := android.GroupFixturePreparers(
Liz Kammer92c72592022-10-31 14:44:28 -0400444 prepareForCcTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800445 )
446 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Liz Kammer92c72592022-10-31 14:44:28 -0400447
Colin Cross5dc62c92023-02-15 12:20:19 -0800448 check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
449 result := preparer.RunTestWithBp(t, bp)
Liz Kammer92c72592022-10-31 14:44:28 -0400450 ctx := result.TestContext
451 staticVariant := variant + "_static"
452
453 // The binaries, one with ubsan and one without
454 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
455 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
456
457 // Static libraries that don't request ubsan
458 libStatic := result.ModuleForTests("libstatic", staticVariant)
459 libTransitive := result.ModuleForTests("libtransitive", staticVariant)
460
461 libUbsan := result.ModuleForTests("libubsan", staticVariant)
462
463 libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
464
465 expectStaticLinkDep(t, ctx, binWithUbsan, libStatic)
466 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan)
467 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsanMinimal)
468
469 miscUndefinedSanFlag := "-fsanitize=integer"
470 binWithUbsanCflags := binWithUbsan.Rule("cc").Args["cFlags"]
471 if !strings.Contains(binWithUbsanCflags, miscUndefinedSanFlag) {
472 t.Errorf("'bin_with_ubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
473 }
474 libStaticCflags := libStatic.Rule("cc").Args["cFlags"]
475 if strings.Contains(libStaticCflags, miscUndefinedSanFlag) {
476 t.Errorf("'libstatic' Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
477 }
478 libUbsanCflags := libUbsan.Rule("cc").Args["cFlags"]
479 if !strings.Contains(libUbsanCflags, miscUndefinedSanFlag) {
480 t.Errorf("'libubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
481 }
482 libTransitiveCflags := libTransitive.Rule("cc").Args["cFlags"]
483 if strings.Contains(libTransitiveCflags, miscUndefinedSanFlag) {
484 t.Errorf("'libtransitive': Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
485 }
486
487 expectStaticLinkDep(t, ctx, binNoUbsan, libStatic)
488 expectStaticLinkDep(t, ctx, binNoUbsan, libUbsan)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400489 }
490
Colin Cross5dc62c92023-02-15 12:20:19 -0800491 t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
492 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
493 t.Run("host musl", func(t *testing.T) {
494 check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
495 })
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400496}
497
498func TestFuzz(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400499 t.Parallel()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400500 bp := `
501 cc_binary {
502 name: "bin_with_fuzzer",
503 host_supported: true,
504 shared_libs: [
505 "libshared",
506 "libfuzzer",
507 ],
508 static_libs: [
509 "libstatic",
510 "libnofuzzer",
511 "libstatic_fuzzer",
512 ],
513 sanitize: {
514 fuzzer: true,
515 }
516 }
517
518 cc_binary {
519 name: "bin_no_fuzzer",
520 host_supported: true,
521 shared_libs: [
522 "libshared",
523 "libfuzzer",
524 ],
525 static_libs: [
526 "libstatic",
527 "libnofuzzer",
528 "libstatic_fuzzer",
529 ],
530 }
531
532 cc_library_shared {
533 name: "libshared",
534 host_supported: true,
535 shared_libs: ["libtransitive"],
536 }
537
538 cc_library_shared {
539 name: "libfuzzer",
540 host_supported: true,
541 shared_libs: ["libtransitive"],
542 sanitize: {
543 fuzzer: true,
544 }
545 }
546
547 cc_library_shared {
548 name: "libtransitive",
549 host_supported: true,
550 }
551
552 cc_library_static {
553 name: "libstatic",
554 host_supported: true,
555 }
556
557 cc_library_static {
558 name: "libnofuzzer",
559 host_supported: true,
560 sanitize: {
561 fuzzer: false,
562 }
563 }
564
565 cc_library_static {
566 name: "libstatic_fuzzer",
567 host_supported: true,
568 }
569
570 `
571
572 result := android.GroupFixturePreparers(
573 prepareForCcTest,
574 ).RunTestWithBp(t, bp)
575
576 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400577 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400578 fuzzerVariant := variant + "_fuzzer"
579 sharedVariant := variant + "_shared"
580 sharedFuzzerVariant := sharedVariant + "_fuzzer"
581 staticVariant := variant + "_static"
582 staticFuzzerVariant := staticVariant + "_fuzzer"
583
584 // The binaries, one with fuzzer and one without
585 binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant)
586 binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant)
587
588 // Shared libraries that don't request fuzzer
589 libShared := result.ModuleForTests("libshared", sharedVariant)
590 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
591
592 // Shared libraries that don't request fuzzer
593 libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant)
594 libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant)
595
596 // Shared library that requests fuzzer
597 libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant)
598
599 // Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant
600 // for bin_no_fuzzer.
601 libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant)
602 libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant)
603
604 // Static library that never uses fuzzer.
605 libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant)
606
607 // Static library that specifies fuzzer
608 libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant)
609 libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant)
610
Liz Kammer92c72592022-10-31 14:44:28 -0400611 expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer)
612 expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer)
613 expectSharedLinkDep(t, ctx, libSharedFuzzer, libTransitiveFuzzer)
614 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400615
Liz Kammer92c72592022-10-31 14:44:28 -0400616 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzerVariant)
617 expectStaticLinkDep(t, ctx, binWithFuzzer, libNoFuzzer)
618 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400619
Liz Kammer92c72592022-10-31 14:44:28 -0400620 expectSharedLinkDep(t, ctx, binNoFuzzer, libShared)
621 expectSharedLinkDep(t, ctx, binNoFuzzer, libFuzzer)
622 expectSharedLinkDep(t, ctx, libShared, libTransitive)
623 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400624
Liz Kammer92c72592022-10-31 14:44:28 -0400625 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticNoFuzzerVariant)
626 expectStaticLinkDep(t, ctx, binNoFuzzer, libNoFuzzer)
627 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticFuzzerNoFuzzerVariant)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400628 }
629
630 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
631}
632
Colin Cross3e5e7782022-06-17 22:17:05 +0000633func TestUbsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400634 t.Parallel()
Colin Cross3e5e7782022-06-17 22:17:05 +0000635 if runtime.GOOS != "linux" {
636 t.Skip("requires linux")
637 }
638
639 bp := `
640 cc_binary {
641 name: "bin_with_ubsan",
642 host_supported: true,
643 shared_libs: [
644 "libshared",
645 ],
646 static_libs: [
647 "libstatic",
648 "libnoubsan",
649 ],
650 sanitize: {
651 undefined: true,
652 }
653 }
654
655 cc_binary {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000656 name: "bin_depends_ubsan_static",
Colin Cross3e5e7782022-06-17 22:17:05 +0000657 host_supported: true,
658 shared_libs: [
659 "libshared",
660 ],
661 static_libs: [
662 "libstatic",
663 "libubsan",
664 "libnoubsan",
665 ],
666 }
667
668 cc_binary {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000669 name: "bin_depends_ubsan_shared",
670 host_supported: true,
671 shared_libs: [
672 "libsharedubsan",
673 ],
674 }
675
676 cc_binary {
Colin Cross3e5e7782022-06-17 22:17:05 +0000677 name: "bin_no_ubsan",
678 host_supported: true,
679 shared_libs: [
680 "libshared",
681 ],
682 static_libs: [
683 "libstatic",
684 "libnoubsan",
685 ],
686 }
687
688 cc_library_shared {
689 name: "libshared",
690 host_supported: true,
691 shared_libs: ["libtransitive"],
692 }
693
694 cc_library_shared {
695 name: "libtransitive",
696 host_supported: true,
697 }
698
Trevor Radcliffe99815552022-11-14 21:35:05 +0000699 cc_library_shared {
700 name: "libsharedubsan",
701 host_supported: true,
702 sanitize: {
703 undefined: true,
704 }
705 }
706
Colin Cross3e5e7782022-06-17 22:17:05 +0000707 cc_library_static {
708 name: "libubsan",
709 host_supported: true,
710 sanitize: {
711 undefined: true,
712 }
713 }
714
715 cc_library_static {
716 name: "libstatic",
717 host_supported: true,
718 }
719
720 cc_library_static {
721 name: "libnoubsan",
722 host_supported: true,
723 }
724 `
725
Colin Cross5dc62c92023-02-15 12:20:19 -0800726 preparer := android.GroupFixturePreparers(
Colin Cross3e5e7782022-06-17 22:17:05 +0000727 prepareForCcTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800728 )
729 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Colin Cross3e5e7782022-06-17 22:17:05 +0000730
Colin Cross5dc62c92023-02-15 12:20:19 -0800731 check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
732 result := preparer.RunTestWithBp(t, bp)
Colin Cross3e5e7782022-06-17 22:17:05 +0000733 staticVariant := variant + "_static"
Trevor Radcliffe99815552022-11-14 21:35:05 +0000734 sharedVariant := variant + "_shared"
Colin Cross3e5e7782022-06-17 22:17:05 +0000735
736 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
737
738 // The binaries, one with ubsan and one without
739 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
Trevor Radcliffe99815552022-11-14 21:35:05 +0000740 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan_static", variant)
741 libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant)
742 binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant)
Colin Cross3e5e7782022-06-17 22:17:05 +0000743 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
744
745 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
746 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
747 minimalRuntime.OutputFiles(t, "")[0].String())
748
Trevor Radcliffe99815552022-11-14 21:35:05 +0000749 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000750 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
751 minimalRuntime.OutputFiles(t, "")[0].String())
752
Trevor Radcliffe99815552022-11-14 21:35:05 +0000753 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in libsharedubsan static libs",
754 strings.Split(libSharedUbsan.Rule("ld").Args["libFlags"], " "),
755 minimalRuntime.OutputFiles(t, "")[0].String())
756
757 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_depends_ubsan_shared static libs",
758 strings.Split(binDependsUbsanShared.Rule("ld").Args["libFlags"], " "),
759 minimalRuntime.OutputFiles(t, "")[0].String())
760
Colin Cross3e5e7782022-06-17 22:17:05 +0000761 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
762 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
763 minimalRuntime.OutputFiles(t, "")[0].String())
764
765 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
766 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
767 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
768
Trevor Radcliffe99815552022-11-14 21:35:05 +0000769 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000770 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
771 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
772
Trevor Radcliffe99815552022-11-14 21:35:05 +0000773 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in libsharedubsan static libs",
774 strings.Split(libSharedUbsan.Rule("ld").Args["ldFlags"], " "),
775 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
776
777 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_shared static libs",
778 strings.Split(binDependsUbsanShared.Rule("ld").Args["ldFlags"], " "),
779 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
780
Colin Cross3e5e7782022-06-17 22:17:05 +0000781 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
782 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
783 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
784 }
785
Colin Cross5dc62c92023-02-15 12:20:19 -0800786 t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
787 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
788 t.Run("host musl", func(t *testing.T) {
789 check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
790 })
Colin Cross3e5e7782022-06-17 22:17:05 +0000791}
792
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400793type MemtagNoteType int
794
795const (
796 None MemtagNoteType = iota + 1
797 Sync
798 Async
799)
800
801func (t MemtagNoteType) str() string {
802 switch t {
803 case None:
804 return "none"
805 case Sync:
806 return "sync"
807 case Async:
808 return "async"
809 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400810 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400811 }
812}
813
814func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400815 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400816
817 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000818 ldFlags := m.Rule("ld").Args["ldFlags"]
819 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
820 found = Async
821 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
822 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400823 }
824
825 if found != expected {
826 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
827 }
828}
829
830var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
831 android.FixtureModifyMockFS(func(fs android.MockFS) {
832 templateBp := `
833 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400834 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400835 gtest: false,
836 }
837
838 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400839 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400840 gtest: false,
841 sanitize: { memtag_heap: false },
842 }
843
844 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400845 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400846 gtest: false,
847 sanitize: { memtag_heap: true },
848 }
849
850 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400851 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400852 gtest: false,
853 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
854 }
855
856 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400857 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400858 gtest: false,
859 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
860 }
861
Liz Kammerd56ddb52021-06-21 17:37:39 -0400862 cc_test {
863 name: "unset_memtag_set_sync_test_%[1]s",
864 gtest: false,
865 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400866 }
867
868 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400869 name: "unset_binary_%[1]s",
870 }
871
872 cc_binary {
873 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400874 sanitize: { memtag_heap: false },
875 }
876
877 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400878 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400879 sanitize: { memtag_heap: true },
880 }
881
882 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400883 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400884 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
885 }
886
887 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400888 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400889 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
890 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400891
892 cc_binary {
893 name: "unset_memtag_set_sync_binary_%[1]s",
894 sanitize: { diag: { memtag_heap: true } },
895 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400896 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400897 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
898 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
899 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
900 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400901
902 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400903 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
904 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
905 "subdir_sync/Android.bp": []byte(subdirSyncBp),
906 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400907 })
908 }),
909 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400910 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
911 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
912 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
913 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400914 }),
915)
916
917func TestSanitizeMemtagHeap(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400918 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400919 variant := "android_arm64_armv8-a"
920
921 result := android.GroupFixturePreparers(
922 prepareForCcTest,
923 prepareForTestWithMemtagHeap,
924 ).RunTest(t)
925 ctx := result.TestContext
926
Liz Kammerd56ddb52021-06-21 17:37:39 -0400927 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
928 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
929 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
930 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400931
Liz Kammerd56ddb52021-06-21 17:37:39 -0400932 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
933 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
934 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
935 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400936
Liz Kammerd56ddb52021-06-21 17:37:39 -0400937 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
938 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
939 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
940 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400941
Liz Kammer7b920b42021-06-22 16:57:27 -0400942 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
943 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
944 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -0400945 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400946
Liz Kammerd56ddb52021-06-21 17:37:39 -0400947 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
948 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
949 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
950 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400951
Liz Kammerd56ddb52021-06-21 17:37:39 -0400952 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
953 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
954 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
955 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400956
Liz Kammerd56ddb52021-06-21 17:37:39 -0400957 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
958 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
959 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
960 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400961
Liz Kammerd56ddb52021-06-21 17:37:39 -0400962 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
963 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
964 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
965 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
966
967 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
968 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
969 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
970 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
971 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
972 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
973
974 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
975 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
976 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
977 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
978
979 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
980 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
981 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
982 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
983
984 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
985 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
986 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
987 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400988}
989
990func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400991 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400992 variant := "android_arm64_armv8-a"
993
994 result := android.GroupFixturePreparers(
995 prepareForCcTest,
996 prepareForTestWithMemtagHeap,
997 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
998 variables.SanitizeDevice = []string{"memtag_heap"}
999 }),
1000 ).RunTest(t)
1001 ctx := result.TestContext
1002
Liz Kammerd56ddb52021-06-21 17:37:39 -04001003 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
1004 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1005 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1006 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001007
Liz Kammerd56ddb52021-06-21 17:37:39 -04001008 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1009 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1010 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1011 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001012
Liz Kammerd56ddb52021-06-21 17:37:39 -04001013 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
1014 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
1015 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
1016 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001017
Liz Kammer7b920b42021-06-22 16:57:27 -04001018 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1019 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1020 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -04001021 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001022
Liz Kammerd56ddb52021-06-21 17:37:39 -04001023 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1024 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1025 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1026 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001027
Liz Kammerd56ddb52021-06-21 17:37:39 -04001028 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1029 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1030 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1031 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001032
Liz Kammerd56ddb52021-06-21 17:37:39 -04001033 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1034 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1035 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1036 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001037
Liz Kammerd56ddb52021-06-21 17:37:39 -04001038 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1039 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1040 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1041 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1042
1043 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1044 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1045 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1046 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1047 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1048
1049 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1050 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1051 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1052 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1053
1054 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
1055 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
1056 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1057 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1058
1059 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1060 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1061 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1062 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001063}
1064
1065func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -04001066 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001067 variant := "android_arm64_armv8-a"
1068
1069 result := android.GroupFixturePreparers(
1070 prepareForCcTest,
1071 prepareForTestWithMemtagHeap,
1072 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1073 variables.SanitizeDevice = []string{"memtag_heap"}
1074 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
1075 }),
1076 ).RunTest(t)
1077 ctx := result.TestContext
1078
Liz Kammerd56ddb52021-06-21 17:37:39 -04001079 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
1080 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1081 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1082 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001083
Liz Kammerd56ddb52021-06-21 17:37:39 -04001084 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1085 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1086 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1087 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001088
Liz Kammerd56ddb52021-06-21 17:37:39 -04001089 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
1090 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
1091 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
1092 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001093
Liz Kammerd56ddb52021-06-21 17:37:39 -04001094 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1095 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1096 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1097 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001098
Liz Kammerd56ddb52021-06-21 17:37:39 -04001099 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1100 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1101 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1102 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001103
Liz Kammerd56ddb52021-06-21 17:37:39 -04001104 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1105 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1106 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1107 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001108
Liz Kammerd56ddb52021-06-21 17:37:39 -04001109 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1110 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1111 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1112 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001113
Liz Kammerd56ddb52021-06-21 17:37:39 -04001114 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1115 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1116 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1117 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1118
1119 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1120 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1121 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1122 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1123 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1124
1125 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1126 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1127 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1128 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1129
1130 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1131 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1132 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1133 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1134
1135 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1136 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1137 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1138 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001139}