blob: 31e668ea93f6d136e85689812f209b807c434516 [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"
Liz Kammerba23cb62023-09-26 16:48:04 -040019 "reflect"
Colin Cross3e5e7782022-06-17 22:17:05 +000020 "runtime"
Liz Kammerbb8d84f2021-06-21 12:53:03 -040021 "strings"
Colin Crossaf98f582021-05-12 17:27:32 -070022 "testing"
23
24 "android/soong/android"
Liz Kammer92c72592022-10-31 14:44:28 -040025
26 "github.com/google/blueprint"
Colin Crossaf98f582021-05-12 17:27:32 -070027)
28
29var prepareForAsanTest = android.FixtureAddFile("asan/Android.bp", []byte(`
30 cc_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -080031 name: "libclang_rt.asan",
Colin Cross5dc62c92023-02-15 12:20:19 -080032 host_supported: true,
33 }
34 cc_library_static {
35 name: "libclang_rt.asan.static",
36 host_supported: true,
37 }
38 cc_library_static {
39 name: "libclang_rt.asan_cxx.static",
40 host_supported: true,
Colin Crossaf98f582021-05-12 17:27:32 -070041 }
42`))
43
Liz Kammerfd8a49f2022-10-31 10:31:11 -040044var prepareForTsanTest = android.FixtureAddFile("tsan/Android.bp", []byte(`
45 cc_library_shared {
46 name: "libclang_rt.tsan",
Colin Cross5dc62c92023-02-15 12:20:19 -080047 host_supported: true,
Liz Kammerfd8a49f2022-10-31 10:31:11 -040048 }
49`))
50
Liz Kammer92c72592022-10-31 14:44:28 -040051type providerInterface interface {
52 ModuleProvider(blueprint.Module, blueprint.ProviderKey) interface{}
53}
54
Liz Kammerfd8a49f2022-10-31 10:31:11 -040055// expectSharedLinkDep verifies that the from module links against the to module as a
56// shared library.
Liz Kammer92c72592022-10-31 14:44:28 -040057func expectSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040058 t.Helper()
59 fromLink := from.Description("link")
Liz Kammer92c72592022-10-31 14:44:28 -040060 toInfo := ctx.ModuleProvider(to.Module(), SharedLibraryInfoProvider).(SharedLibraryInfo)
Liz Kammerfd8a49f2022-10-31 10:31:11 -040061
Liz Kammer92c72592022-10-31 14:44:28 -040062 if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); !android.InList(w, g) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040063 t.Errorf("%s should link against %s, expected %q, got %q",
64 from.Module(), to.Module(), w, g)
65 }
66}
67
Colin Cross5dc62c92023-02-15 12:20:19 -080068// expectNoSharedLinkDep verifies that the from module links against the to module as a
69// shared library.
70func expectNoSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
71 t.Helper()
72 fromLink := from.Description("link")
73 toInfo := ctx.ModuleProvider(to.Module(), SharedLibraryInfoProvider).(SharedLibraryInfo)
74
75 if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); android.InList(w, g) {
76 t.Errorf("%s should not link against %s, expected %q, got %q",
77 from.Module(), to.Module(), w, g)
78 }
79}
80
Liz Kammerfd8a49f2022-10-31 10:31:11 -040081// expectStaticLinkDep verifies that the from module links against the to module as a
82// static library.
Liz Kammer92c72592022-10-31 14:44:28 -040083func expectStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040084 t.Helper()
85 fromLink := from.Description("link")
Liz Kammer92c72592022-10-31 14:44:28 -040086 toInfo := ctx.ModuleProvider(to.Module(), StaticLibraryInfoProvider).(StaticLibraryInfo)
Liz Kammerfd8a49f2022-10-31 10:31:11 -040087
Liz Kammer92c72592022-10-31 14:44:28 -040088 if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); !android.InList(w, g) {
Liz Kammerfd8a49f2022-10-31 10:31:11 -040089 t.Errorf("%s should link against %s, expected %q, got %q",
90 from.Module(), to.Module(), w, g)
91 }
92
93}
94
Colin Cross5dc62c92023-02-15 12:20:19 -080095// expectNoStaticLinkDep verifies that the from module links against the to module as a
96// static library.
97func expectNoStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
98 t.Helper()
99 fromLink := from.Description("link")
100 toInfo := ctx.ModuleProvider(to.Module(), StaticLibraryInfoProvider).(StaticLibraryInfo)
101
102 if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); android.InList(w, g) {
103 t.Errorf("%s should not link against %s, expected %q, got %q",
104 from.Module(), to.Module(), w, g)
105 }
106
107}
108
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400109// expectInstallDep verifies that the install rule of the from module depends on the
110// install rule of the to module.
111func expectInstallDep(t *testing.T, from, to android.TestingModule) {
112 t.Helper()
113 fromInstalled := from.Description("install")
114 toInstalled := to.Description("install")
115
116 // combine implicits and order-only dependencies, host uses implicit but device uses
117 // order-only.
118 got := append(fromInstalled.Implicits.Strings(), fromInstalled.OrderOnly.Strings()...)
119 want := toInstalled.Output.String()
120 if !android.InList(want, got) {
121 t.Errorf("%s installation should depend on %s, expected %q, got %q",
122 from.Module(), to.Module(), want, got)
123 }
124}
125
Colin Cross5dc62c92023-02-15 12:20:19 -0800126type expectedRuntimeLinkage int
127
128const (
129 RUNTIME_LINKAGE_NONE = expectedRuntimeLinkage(0)
130 RUNTIME_LINKAGE_SHARED = iota
Colin Crossb781d232023-02-15 12:40:20 -0800131 RUNTIME_LINKAGE_STATIC
Colin Cross5dc62c92023-02-15 12:20:19 -0800132)
133
Colin Crossaf98f582021-05-12 17:27:32 -0700134func TestAsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400135 t.Parallel()
Colin Crossaf98f582021-05-12 17:27:32 -0700136 bp := `
137 cc_binary {
138 name: "bin_with_asan",
139 host_supported: true,
140 shared_libs: [
141 "libshared",
142 "libasan",
143 ],
144 static_libs: [
145 "libstatic",
146 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400147 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700148 ],
149 sanitize: {
150 address: true,
151 }
152 }
153
154 cc_binary {
155 name: "bin_no_asan",
156 host_supported: true,
157 shared_libs: [
158 "libshared",
159 "libasan",
160 ],
161 static_libs: [
162 "libstatic",
163 "libnoasan",
Liz Kammerecc659c2022-10-28 16:27:13 -0400164 "libstatic_asan",
Colin Crossaf98f582021-05-12 17:27:32 -0700165 ],
166 }
167
168 cc_library_shared {
169 name: "libshared",
170 host_supported: true,
171 shared_libs: ["libtransitive"],
172 }
173
174 cc_library_shared {
175 name: "libasan",
176 host_supported: true,
177 shared_libs: ["libtransitive"],
178 sanitize: {
179 address: true,
180 }
181 }
182
183 cc_library_shared {
184 name: "libtransitive",
185 host_supported: true,
186 }
187
188 cc_library_static {
189 name: "libstatic",
190 host_supported: true,
191 }
192
193 cc_library_static {
194 name: "libnoasan",
195 host_supported: true,
196 sanitize: {
197 address: false,
198 }
199 }
Liz Kammerecc659c2022-10-28 16:27:13 -0400200
201 cc_library_static {
202 name: "libstatic_asan",
203 host_supported: true,
204 sanitize: {
205 address: true,
206 }
207 }
208
Colin Crossaf98f582021-05-12 17:27:32 -0700209 `
210
Colin Cross5dc62c92023-02-15 12:20:19 -0800211 preparer := android.GroupFixturePreparers(
Colin Crossaf98f582021-05-12 17:27:32 -0700212 prepareForCcTest,
213 prepareForAsanTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800214 )
215 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Colin Crossaf98f582021-05-12 17:27:32 -0700216
Colin Cross5dc62c92023-02-15 12:20:19 -0800217 check := func(t *testing.T, variant string, runtimeLinkage expectedRuntimeLinkage, preparer android.FixturePreparer) {
218 result := preparer.RunTestWithBp(t, bp)
Liz Kammer92c72592022-10-31 14:44:28 -0400219 ctx := result.TestContext
Colin Crossaf98f582021-05-12 17:27:32 -0700220 asanVariant := variant + "_asan"
221 sharedVariant := variant + "_shared"
222 sharedAsanVariant := sharedVariant + "_asan"
223 staticVariant := variant + "_static"
224 staticAsanVariant := staticVariant + "_asan"
225
226 // The binaries, one with asan and one without
227 binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant)
228 binNoAsan := result.ModuleForTests("bin_no_asan", variant)
229
230 // Shared libraries that don't request asan
231 libShared := result.ModuleForTests("libshared", sharedVariant)
232 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
233
234 // Shared library that requests asan
235 libAsan := result.ModuleForTests("libasan", sharedAsanVariant)
236
237 // Static library that uses an asan variant for bin_with_asan and a non-asan variant
238 // for bin_no_asan.
239 libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant)
240 libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant)
241
242 // Static library that never uses asan.
243 libNoAsan := result.ModuleForTests("libnoasan", staticVariant)
244
Liz Kammerecc659c2022-10-28 16:27:13 -0400245 // Static library that specifies asan
246 libStaticAsan := result.ModuleForTests("libstatic_asan", staticAsanVariant)
247 libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
248
Colin Cross5dc62c92023-02-15 12:20:19 -0800249 libAsanSharedRuntime := result.ModuleForTests("libclang_rt.asan", sharedVariant)
Colin Crossb781d232023-02-15 12:40:20 -0800250 libAsanStaticRuntime := result.ModuleForTests("libclang_rt.asan.static", staticVariant)
251 libAsanStaticCxxRuntime := result.ModuleForTests("libclang_rt.asan_cxx.static", staticVariant)
Colin Cross5dc62c92023-02-15 12:20:19 -0800252
Liz Kammer92c72592022-10-31 14:44:28 -0400253 expectSharedLinkDep(t, ctx, binWithAsan, libShared)
254 expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
255 expectSharedLinkDep(t, ctx, libShared, libTransitive)
256 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700257
Liz Kammer92c72592022-10-31 14:44:28 -0400258 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsanVariant)
259 expectStaticLinkDep(t, ctx, binWithAsan, libNoAsan)
260 expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsan)
Colin Crossaf98f582021-05-12 17:27:32 -0700261
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400262 expectInstallDep(t, binWithAsan, libShared)
263 expectInstallDep(t, binWithAsan, libAsan)
264 expectInstallDep(t, binWithAsan, libTransitive)
265 expectInstallDep(t, libShared, libTransitive)
266 expectInstallDep(t, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700267
Liz Kammer92c72592022-10-31 14:44:28 -0400268 expectSharedLinkDep(t, ctx, binNoAsan, libShared)
269 expectSharedLinkDep(t, ctx, binNoAsan, libAsan)
270 expectSharedLinkDep(t, ctx, libShared, libTransitive)
271 expectSharedLinkDep(t, ctx, libAsan, libTransitive)
Colin Crossaf98f582021-05-12 17:27:32 -0700272
Liz Kammer92c72592022-10-31 14:44:28 -0400273 expectStaticLinkDep(t, ctx, binNoAsan, libStaticNoAsanVariant)
274 expectStaticLinkDep(t, ctx, binNoAsan, libNoAsan)
275 expectStaticLinkDep(t, ctx, binNoAsan, libStaticAsanNoAsanVariant)
Colin Crossaf98f582021-05-12 17:27:32 -0700276
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400277 expectInstallDep(t, binNoAsan, libShared)
278 expectInstallDep(t, binNoAsan, libAsan)
279 expectInstallDep(t, binNoAsan, libTransitive)
280 expectInstallDep(t, libShared, libTransitive)
281 expectInstallDep(t, libAsan, libTransitive)
Colin Cross5dc62c92023-02-15 12:20:19 -0800282
283 if runtimeLinkage == RUNTIME_LINKAGE_SHARED {
284 expectSharedLinkDep(t, ctx, binWithAsan, libAsanSharedRuntime)
285 expectNoSharedLinkDep(t, ctx, binNoAsan, libAsanSharedRuntime)
286 expectSharedLinkDep(t, ctx, libAsan, libAsanSharedRuntime)
287 expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
288 expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
289 } else {
290 expectNoSharedLinkDep(t, ctx, binWithAsan, libAsanSharedRuntime)
291 expectNoSharedLinkDep(t, ctx, binNoAsan, libAsanSharedRuntime)
292 expectNoSharedLinkDep(t, ctx, libAsan, libAsanSharedRuntime)
293 expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
294 expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
295 }
Colin Crossb781d232023-02-15 12:40:20 -0800296
297 if runtimeLinkage == RUNTIME_LINKAGE_STATIC {
298 expectStaticLinkDep(t, ctx, binWithAsan, libAsanStaticRuntime)
299 expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticRuntime)
300 expectStaticLinkDep(t, ctx, libAsan, libAsanStaticRuntime)
301 expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticRuntime)
302 expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticRuntime)
303
304 expectStaticLinkDep(t, ctx, binWithAsan, libAsanStaticCxxRuntime)
305 expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticCxxRuntime)
306 expectStaticLinkDep(t, ctx, libAsan, libAsanStaticCxxRuntime)
307 expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticCxxRuntime)
308 expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticCxxRuntime)
309 } else {
310 expectNoStaticLinkDep(t, ctx, binWithAsan, libAsanStaticRuntime)
311 expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticRuntime)
312 expectNoStaticLinkDep(t, ctx, libAsan, libAsanStaticRuntime)
313 expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticRuntime)
314 expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticRuntime)
315
316 expectNoStaticLinkDep(t, ctx, binWithAsan, libAsanStaticCxxRuntime)
317 expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticCxxRuntime)
318 expectNoStaticLinkDep(t, ctx, libAsan, libAsanStaticCxxRuntime)
319 expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticCxxRuntime)
320 expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticCxxRuntime)
321 }
Colin Crossaf98f582021-05-12 17:27:32 -0700322 }
323
Colin Cross5dc62c92023-02-15 12:20:19 -0800324 t.Run("host", func(t *testing.T) { check(t, buildOS, RUNTIME_LINKAGE_NONE, preparer) })
325 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", RUNTIME_LINKAGE_SHARED, preparer) })
326 t.Run("host musl", func(t *testing.T) {
Colin Crossb781d232023-02-15 12:40:20 -0800327 check(t, "linux_musl_x86_64", RUNTIME_LINKAGE_STATIC,
Colin Cross5dc62c92023-02-15 12:20:19 -0800328 android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
329 })
Colin Crossaf98f582021-05-12 17:27:32 -0700330}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400331
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400332func TestTsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400333 t.Parallel()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400334 bp := `
335 cc_binary {
336 name: "bin_with_tsan",
337 host_supported: true,
338 shared_libs: [
339 "libshared",
340 "libtsan",
341 ],
342 sanitize: {
343 thread: true,
344 }
345 }
346
347 cc_binary {
348 name: "bin_no_tsan",
349 host_supported: true,
350 shared_libs: [
351 "libshared",
352 "libtsan",
353 ],
354 }
355
356 cc_library_shared {
357 name: "libshared",
358 host_supported: true,
359 shared_libs: ["libtransitive"],
360 }
361
362 cc_library_shared {
363 name: "libtsan",
364 host_supported: true,
365 shared_libs: ["libtransitive"],
366 sanitize: {
367 thread: true,
368 }
369 }
370
371 cc_library_shared {
372 name: "libtransitive",
373 host_supported: true,
374 }
375`
376
Colin Cross5dc62c92023-02-15 12:20:19 -0800377 preparer := android.GroupFixturePreparers(
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400378 prepareForCcTest,
379 prepareForTsanTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800380 )
381 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400382
Colin Cross5dc62c92023-02-15 12:20:19 -0800383 check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
384 result := preparer.RunTestWithBp(t, bp)
Liz Kammer92c72592022-10-31 14:44:28 -0400385 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400386 tsanVariant := variant + "_tsan"
387 sharedVariant := variant + "_shared"
388 sharedTsanVariant := sharedVariant + "_tsan"
389
390 // The binaries, one with tsan and one without
391 binWithTsan := result.ModuleForTests("bin_with_tsan", tsanVariant)
392 binNoTsan := result.ModuleForTests("bin_no_tsan", variant)
393
394 // Shared libraries that don't request tsan
395 libShared := result.ModuleForTests("libshared", sharedVariant)
396 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
397
398 // Shared library that requests tsan
399 libTsan := result.ModuleForTests("libtsan", sharedTsanVariant)
400
Liz Kammer92c72592022-10-31 14:44:28 -0400401 expectSharedLinkDep(t, ctx, binWithTsan, libShared)
402 expectSharedLinkDep(t, ctx, binWithTsan, libTsan)
403 expectSharedLinkDep(t, ctx, libShared, libTransitive)
404 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400405
Liz Kammer92c72592022-10-31 14:44:28 -0400406 expectSharedLinkDep(t, ctx, binNoTsan, libShared)
407 expectSharedLinkDep(t, ctx, binNoTsan, libTsan)
408 expectSharedLinkDep(t, ctx, libShared, libTransitive)
409 expectSharedLinkDep(t, ctx, libTsan, libTransitive)
410 }
411
Colin Cross5dc62c92023-02-15 12:20:19 -0800412 t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
413 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
414 t.Run("host musl", func(t *testing.T) {
415 check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
416 })
Liz Kammer92c72592022-10-31 14:44:28 -0400417}
418
419func TestMiscUndefined(t *testing.T) {
Liz Kammer2a109bc2022-12-02 09:36:01 -0500420 if runtime.GOOS != "linux" {
421 t.Skip("requires linux")
422 }
423
Liz Kammer7c5d1592022-10-31 16:27:38 -0400424 t.Parallel()
Liz Kammer92c72592022-10-31 14:44:28 -0400425 bp := `
426 cc_binary {
427 name: "bin_with_ubsan",
428 srcs: ["src.cc"],
429 host_supported: true,
430 static_libs: [
431 "libstatic",
432 "libubsan",
433 ],
434 sanitize: {
435 misc_undefined: ["integer"],
436 }
437 }
438
439 cc_binary {
440 name: "bin_no_ubsan",
441 host_supported: true,
442 srcs: ["src.cc"],
443 static_libs: [
444 "libstatic",
445 "libubsan",
446 ],
447 }
448
449 cc_library_static {
450 name: "libstatic",
451 host_supported: true,
452 srcs: ["src.cc"],
453 static_libs: ["libtransitive"],
454 }
455
456 cc_library_static {
457 name: "libubsan",
458 host_supported: true,
459 srcs: ["src.cc"],
460 whole_static_libs: ["libtransitive"],
461 sanitize: {
462 misc_undefined: ["integer"],
463 }
464 }
465
466 cc_library_static {
467 name: "libtransitive",
468 host_supported: true,
469 srcs: ["src.cc"],
470 }
471`
472
Colin Cross5dc62c92023-02-15 12:20:19 -0800473 preparer := android.GroupFixturePreparers(
Liz Kammer92c72592022-10-31 14:44:28 -0400474 prepareForCcTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800475 )
476 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Liz Kammer92c72592022-10-31 14:44:28 -0400477
Colin Cross5dc62c92023-02-15 12:20:19 -0800478 check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
479 result := preparer.RunTestWithBp(t, bp)
Liz Kammer92c72592022-10-31 14:44:28 -0400480 ctx := result.TestContext
481 staticVariant := variant + "_static"
482
483 // The binaries, one with ubsan and one without
484 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
485 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
486
487 // Static libraries that don't request ubsan
488 libStatic := result.ModuleForTests("libstatic", staticVariant)
489 libTransitive := result.ModuleForTests("libtransitive", staticVariant)
490
491 libUbsan := result.ModuleForTests("libubsan", staticVariant)
492
493 libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
494
495 expectStaticLinkDep(t, ctx, binWithUbsan, libStatic)
496 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan)
497 expectStaticLinkDep(t, ctx, binWithUbsan, libUbsanMinimal)
498
499 miscUndefinedSanFlag := "-fsanitize=integer"
500 binWithUbsanCflags := binWithUbsan.Rule("cc").Args["cFlags"]
501 if !strings.Contains(binWithUbsanCflags, miscUndefinedSanFlag) {
502 t.Errorf("'bin_with_ubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
503 }
504 libStaticCflags := libStatic.Rule("cc").Args["cFlags"]
505 if strings.Contains(libStaticCflags, miscUndefinedSanFlag) {
506 t.Errorf("'libstatic' Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
507 }
508 libUbsanCflags := libUbsan.Rule("cc").Args["cFlags"]
509 if !strings.Contains(libUbsanCflags, miscUndefinedSanFlag) {
510 t.Errorf("'libubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
511 }
512 libTransitiveCflags := libTransitive.Rule("cc").Args["cFlags"]
513 if strings.Contains(libTransitiveCflags, miscUndefinedSanFlag) {
514 t.Errorf("'libtransitive': Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
515 }
516
517 expectStaticLinkDep(t, ctx, binNoUbsan, libStatic)
518 expectStaticLinkDep(t, ctx, binNoUbsan, libUbsan)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400519 }
520
Colin Cross5dc62c92023-02-15 12:20:19 -0800521 t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
522 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
523 t.Run("host musl", func(t *testing.T) {
524 check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
525 })
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400526}
527
528func TestFuzz(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400529 t.Parallel()
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400530 bp := `
531 cc_binary {
532 name: "bin_with_fuzzer",
533 host_supported: true,
534 shared_libs: [
535 "libshared",
536 "libfuzzer",
537 ],
538 static_libs: [
539 "libstatic",
540 "libnofuzzer",
541 "libstatic_fuzzer",
542 ],
543 sanitize: {
544 fuzzer: true,
545 }
546 }
547
548 cc_binary {
549 name: "bin_no_fuzzer",
550 host_supported: true,
551 shared_libs: [
552 "libshared",
553 "libfuzzer",
554 ],
555 static_libs: [
556 "libstatic",
557 "libnofuzzer",
558 "libstatic_fuzzer",
559 ],
560 }
561
562 cc_library_shared {
563 name: "libshared",
564 host_supported: true,
565 shared_libs: ["libtransitive"],
566 }
567
568 cc_library_shared {
569 name: "libfuzzer",
570 host_supported: true,
571 shared_libs: ["libtransitive"],
572 sanitize: {
573 fuzzer: true,
574 }
575 }
576
577 cc_library_shared {
578 name: "libtransitive",
579 host_supported: true,
580 }
581
582 cc_library_static {
583 name: "libstatic",
584 host_supported: true,
585 }
586
587 cc_library_static {
588 name: "libnofuzzer",
589 host_supported: true,
590 sanitize: {
591 fuzzer: false,
592 }
593 }
594
595 cc_library_static {
596 name: "libstatic_fuzzer",
597 host_supported: true,
598 }
599
600 `
601
602 result := android.GroupFixturePreparers(
603 prepareForCcTest,
604 ).RunTestWithBp(t, bp)
605
606 check := func(t *testing.T, result *android.TestResult, variant string) {
Liz Kammer92c72592022-10-31 14:44:28 -0400607 ctx := result.TestContext
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400608 fuzzerVariant := variant + "_fuzzer"
609 sharedVariant := variant + "_shared"
610 sharedFuzzerVariant := sharedVariant + "_fuzzer"
611 staticVariant := variant + "_static"
612 staticFuzzerVariant := staticVariant + "_fuzzer"
613
614 // The binaries, one with fuzzer and one without
615 binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant)
616 binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant)
617
618 // Shared libraries that don't request fuzzer
619 libShared := result.ModuleForTests("libshared", sharedVariant)
620 libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
621
622 // Shared libraries that don't request fuzzer
623 libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant)
624 libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant)
625
626 // Shared library that requests fuzzer
627 libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant)
628
629 // Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant
630 // for bin_no_fuzzer.
631 libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant)
632 libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant)
633
634 // Static library that never uses fuzzer.
635 libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant)
636
637 // Static library that specifies fuzzer
638 libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant)
639 libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant)
640
Liz Kammer92c72592022-10-31 14:44:28 -0400641 expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer)
642 expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer)
643 expectSharedLinkDep(t, ctx, libSharedFuzzer, libTransitiveFuzzer)
644 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400645
Liz Kammer92c72592022-10-31 14:44:28 -0400646 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzerVariant)
647 expectStaticLinkDep(t, ctx, binWithFuzzer, libNoFuzzer)
648 expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400649
Liz Kammer92c72592022-10-31 14:44:28 -0400650 expectSharedLinkDep(t, ctx, binNoFuzzer, libShared)
651 expectSharedLinkDep(t, ctx, binNoFuzzer, libFuzzer)
652 expectSharedLinkDep(t, ctx, libShared, libTransitive)
653 expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400654
Liz Kammer92c72592022-10-31 14:44:28 -0400655 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticNoFuzzerVariant)
656 expectStaticLinkDep(t, ctx, binNoFuzzer, libNoFuzzer)
657 expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticFuzzerNoFuzzerVariant)
Liz Kammerfd8a49f2022-10-31 10:31:11 -0400658 }
659
660 t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
661}
662
Colin Cross3e5e7782022-06-17 22:17:05 +0000663func TestUbsan(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400664 t.Parallel()
Colin Cross3e5e7782022-06-17 22:17:05 +0000665 if runtime.GOOS != "linux" {
666 t.Skip("requires linux")
667 }
668
669 bp := `
670 cc_binary {
671 name: "bin_with_ubsan",
672 host_supported: true,
673 shared_libs: [
674 "libshared",
675 ],
676 static_libs: [
677 "libstatic",
678 "libnoubsan",
679 ],
680 sanitize: {
681 undefined: true,
682 }
683 }
684
685 cc_binary {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000686 name: "bin_depends_ubsan_static",
Colin Cross3e5e7782022-06-17 22:17:05 +0000687 host_supported: true,
688 shared_libs: [
689 "libshared",
690 ],
691 static_libs: [
692 "libstatic",
693 "libubsan",
694 "libnoubsan",
695 ],
696 }
697
698 cc_binary {
Trevor Radcliffe99815552022-11-14 21:35:05 +0000699 name: "bin_depends_ubsan_shared",
700 host_supported: true,
701 shared_libs: [
702 "libsharedubsan",
703 ],
704 }
705
706 cc_binary {
Colin Cross3e5e7782022-06-17 22:17:05 +0000707 name: "bin_no_ubsan",
708 host_supported: true,
709 shared_libs: [
710 "libshared",
711 ],
712 static_libs: [
713 "libstatic",
714 "libnoubsan",
715 ],
716 }
717
Colin Cross0df81532023-08-23 22:20:51 -0700718 cc_binary {
719 name: "static_bin_with_ubsan_dep",
720 static_executable: true,
721 host_supported: true,
722 static_libs: [
723 "libubsan_diag",
724 ],
725 }
726
Colin Cross3e5e7782022-06-17 22:17:05 +0000727 cc_library_shared {
728 name: "libshared",
729 host_supported: true,
730 shared_libs: ["libtransitive"],
731 }
732
733 cc_library_shared {
734 name: "libtransitive",
735 host_supported: true,
736 }
737
Trevor Radcliffe99815552022-11-14 21:35:05 +0000738 cc_library_shared {
739 name: "libsharedubsan",
740 host_supported: true,
741 sanitize: {
742 undefined: true,
743 }
744 }
745
Colin Cross3e5e7782022-06-17 22:17:05 +0000746 cc_library_static {
747 name: "libubsan",
748 host_supported: true,
749 sanitize: {
750 undefined: true,
751 }
752 }
753
754 cc_library_static {
Colin Cross0df81532023-08-23 22:20:51 -0700755 name: "libubsan_diag",
756 host_supported: true,
757 sanitize: {
758 undefined: true,
759 diag: {
760 undefined: true,
761 },
762 },
763 }
764
765 cc_library_static {
Colin Cross3e5e7782022-06-17 22:17:05 +0000766 name: "libstatic",
767 host_supported: true,
768 }
769
770 cc_library_static {
771 name: "libnoubsan",
772 host_supported: true,
773 }
774 `
775
Colin Cross5dc62c92023-02-15 12:20:19 -0800776 preparer := android.GroupFixturePreparers(
Colin Cross3e5e7782022-06-17 22:17:05 +0000777 prepareForCcTest,
Colin Cross5dc62c92023-02-15 12:20:19 -0800778 )
779 buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
Colin Cross3e5e7782022-06-17 22:17:05 +0000780
Colin Cross5dc62c92023-02-15 12:20:19 -0800781 check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
782 result := preparer.RunTestWithBp(t, bp)
Colin Cross3e5e7782022-06-17 22:17:05 +0000783 staticVariant := variant + "_static"
Trevor Radcliffe99815552022-11-14 21:35:05 +0000784 sharedVariant := variant + "_shared"
Colin Cross3e5e7782022-06-17 22:17:05 +0000785
786 minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
Colin Cross0df81532023-08-23 22:20:51 -0700787 standaloneRuntime := result.ModuleForTests("libclang_rt.ubsan_standalone.static", staticVariant)
Colin Cross3e5e7782022-06-17 22:17:05 +0000788
789 // The binaries, one with ubsan and one without
790 binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
Trevor Radcliffe99815552022-11-14 21:35:05 +0000791 binDependsUbsan := result.ModuleForTests("bin_depends_ubsan_static", variant)
792 libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant)
793 binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant)
Colin Cross3e5e7782022-06-17 22:17:05 +0000794 binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
Colin Cross0df81532023-08-23 22:20:51 -0700795 staticBin := result.ModuleForTests("static_bin_with_ubsan_dep", variant)
Colin Cross3e5e7782022-06-17 22:17:05 +0000796
797 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
798 strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
799 minimalRuntime.OutputFiles(t, "")[0].String())
800
Trevor Radcliffe99815552022-11-14 21:35:05 +0000801 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000802 strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
803 minimalRuntime.OutputFiles(t, "")[0].String())
804
Trevor Radcliffe99815552022-11-14 21:35:05 +0000805 android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in libsharedubsan static libs",
806 strings.Split(libSharedUbsan.Rule("ld").Args["libFlags"], " "),
807 minimalRuntime.OutputFiles(t, "")[0].String())
808
809 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_depends_ubsan_shared static libs",
810 strings.Split(binDependsUbsanShared.Rule("ld").Args["libFlags"], " "),
811 minimalRuntime.OutputFiles(t, "")[0].String())
812
Colin Cross3e5e7782022-06-17 22:17:05 +0000813 android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
814 strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
815 minimalRuntime.OutputFiles(t, "")[0].String())
816
817 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
818 strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
819 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
820
Trevor Radcliffe99815552022-11-14 21:35:05 +0000821 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_static static libs",
Colin Cross3e5e7782022-06-17 22:17:05 +0000822 strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
823 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
824
Trevor Radcliffe99815552022-11-14 21:35:05 +0000825 android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in libsharedubsan static libs",
826 strings.Split(libSharedUbsan.Rule("ld").Args["ldFlags"], " "),
827 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
828
829 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_shared static libs",
830 strings.Split(binDependsUbsanShared.Rule("ld").Args["ldFlags"], " "),
831 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
832
Colin Cross3e5e7782022-06-17 22:17:05 +0000833 android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
834 strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
835 "-Wl,--exclude-libs="+minimalRuntime.OutputFiles(t, "")[0].Base())
Colin Cross0df81532023-08-23 22:20:51 -0700836
837 android.AssertStringListContains(t, "missing libclang_rt.ubsan_standalone.static in static_bin_with_ubsan_dep static libs",
838 strings.Split(staticBin.Rule("ld").Args["libFlags"], " "),
839 standaloneRuntime.OutputFiles(t, "")[0].String())
840
Colin Cross3e5e7782022-06-17 22:17:05 +0000841 }
842
Colin Cross5dc62c92023-02-15 12:20:19 -0800843 t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
844 t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
845 t.Run("host musl", func(t *testing.T) {
846 check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
847 })
Colin Cross3e5e7782022-06-17 22:17:05 +0000848}
849
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400850type MemtagNoteType int
851
852const (
853 None MemtagNoteType = iota + 1
854 Sync
855 Async
856)
857
858func (t MemtagNoteType) str() string {
859 switch t {
860 case None:
861 return "none"
862 case Sync:
863 return "sync"
864 case Async:
865 return "async"
866 default:
Liz Kammerd56ddb52021-06-21 17:37:39 -0400867 panic("type_note_invalid")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400868 }
869}
870
871func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400872 t.Helper()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400873
874 found := None
Florian Mayerd8434a42022-08-31 20:57:03 +0000875 ldFlags := m.Rule("ld").Args["ldFlags"]
876 if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
877 found = Async
878 } else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
879 found = Sync
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400880 }
881
882 if found != expected {
883 t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
884 }
885}
886
887var prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
888 android.FixtureModifyMockFS(func(fs android.MockFS) {
889 templateBp := `
890 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400891 name: "unset_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400892 gtest: false,
893 }
894
895 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400896 name: "no_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400897 gtest: false,
898 sanitize: { memtag_heap: false },
899 }
900
901 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400902 name: "set_memtag_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400903 gtest: false,
904 sanitize: { memtag_heap: true },
905 }
906
907 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400908 name: "set_memtag_set_async_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400909 gtest: false,
910 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
911 }
912
913 cc_test {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400914 name: "set_memtag_set_sync_test_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400915 gtest: false,
916 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
917 }
918
Liz Kammerd56ddb52021-06-21 17:37:39 -0400919 cc_test {
920 name: "unset_memtag_set_sync_test_%[1]s",
921 gtest: false,
922 sanitize: { diag: { memtag_heap: true } },
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400923 }
924
925 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400926 name: "unset_binary_%[1]s",
927 }
928
929 cc_binary {
930 name: "no_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400931 sanitize: { memtag_heap: false },
932 }
933
934 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400935 name: "set_memtag_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400936 sanitize: { memtag_heap: true },
937 }
938
939 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400940 name: "set_memtag_set_async_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400941 sanitize: { memtag_heap: true, diag: { memtag_heap: false } },
942 }
943
944 cc_binary {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400945 name: "set_memtag_set_sync_binary_%[1]s",
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400946 sanitize: { memtag_heap: true, diag: { memtag_heap: true } },
947 }
Liz Kammerd56ddb52021-06-21 17:37:39 -0400948
949 cc_binary {
950 name: "unset_memtag_set_sync_binary_%[1]s",
951 sanitize: { diag: { memtag_heap: true } },
952 }
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400953 `
Liz Kammerd56ddb52021-06-21 17:37:39 -0400954 subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
955 subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
956 subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
957 subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400958
959 fs.Merge(android.MockFS{
Liz Kammerd56ddb52021-06-21 17:37:39 -0400960 "subdir_no_override/Android.bp": []byte(subdirNoOverrideBp),
961 "subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
962 "subdir_sync/Android.bp": []byte(subdirSyncBp),
963 "subdir_async/Android.bp": []byte(subdirAsyncBp),
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400964 })
965 }),
966 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Liz Kammerd56ddb52021-06-21 17:37:39 -0400967 variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
968 // "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
969 variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
970 variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400971 }),
972)
973
974func TestSanitizeMemtagHeap(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -0400975 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400976 variant := "android_arm64_armv8-a"
977
978 result := android.GroupFixturePreparers(
979 prepareForCcTest,
980 prepareForTestWithMemtagHeap,
981 ).RunTest(t)
982 ctx := result.TestContext
983
Liz Kammerd56ddb52021-06-21 17:37:39 -0400984 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
985 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
986 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
987 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400988
Liz Kammerd56ddb52021-06-21 17:37:39 -0400989 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
990 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
991 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
992 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400993
Liz Kammerd56ddb52021-06-21 17:37:39 -0400994 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
995 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
996 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
997 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -0400998
Liz Kammer7b920b42021-06-22 16:57:27 -0400999 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1000 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1001 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -04001002 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001003
Liz Kammerd56ddb52021-06-21 17:37:39 -04001004 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1005 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1006 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1007 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001008
Liz Kammerd56ddb52021-06-21 17:37:39 -04001009 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1010 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1011 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1012 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001013
Liz Kammerd56ddb52021-06-21 17:37:39 -04001014 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1015 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1016 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1017 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001018
Liz Kammerd56ddb52021-06-21 17:37:39 -04001019 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1020 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1021 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1022 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1023
1024 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1025 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
1026 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1027 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1028 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1029 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1030
1031 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1032 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1033 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1034 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1035
1036 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
1037 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
1038 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1039 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1040
1041 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1042 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1043 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1044 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001045}
1046
1047func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -04001048 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001049 variant := "android_arm64_armv8-a"
1050
1051 result := android.GroupFixturePreparers(
1052 prepareForCcTest,
1053 prepareForTestWithMemtagHeap,
1054 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1055 variables.SanitizeDevice = []string{"memtag_heap"}
1056 }),
1057 ).RunTest(t)
1058 ctx := result.TestContext
1059
Liz Kammerd56ddb52021-06-21 17:37:39 -04001060 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
1061 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1062 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1063 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001064
Liz Kammerd56ddb52021-06-21 17:37:39 -04001065 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1066 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1067 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1068 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001069
Liz Kammerd56ddb52021-06-21 17:37:39 -04001070 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
1071 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
1072 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
1073 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001074
Liz Kammer7b920b42021-06-22 16:57:27 -04001075 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1076 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1077 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
Liz Kammerd56ddb52021-06-21 17:37:39 -04001078 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001079
Liz Kammerd56ddb52021-06-21 17:37:39 -04001080 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1081 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1082 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1083 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001084
Liz Kammerd56ddb52021-06-21 17:37:39 -04001085 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1086 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1087 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1088 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001089
Liz Kammerd56ddb52021-06-21 17:37:39 -04001090 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1091 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1092 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1093 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001094
Liz Kammerd56ddb52021-06-21 17:37:39 -04001095 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1096 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1097 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1098 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1099
1100 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1101 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1102 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1103 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1104 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1105
1106 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1107 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1108 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1109 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1110
1111 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
1112 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
1113 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1114 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1115
1116 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1117 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1118 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1119 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001120}
1121
1122func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
Liz Kammer7c5d1592022-10-31 16:27:38 -04001123 t.Parallel()
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001124 variant := "android_arm64_armv8-a"
1125
1126 result := android.GroupFixturePreparers(
1127 prepareForCcTest,
1128 prepareForTestWithMemtagHeap,
1129 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1130 variables.SanitizeDevice = []string{"memtag_heap"}
1131 variables.SanitizeDeviceDiag = []string{"memtag_heap"}
1132 }),
1133 ).RunTest(t)
1134 ctx := result.TestContext
1135
Liz Kammerd56ddb52021-06-21 17:37:39 -04001136 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
1137 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1138 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1139 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001140
Liz Kammerd56ddb52021-06-21 17:37:39 -04001141 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1142 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1143 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1144 checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001145
Liz Kammerd56ddb52021-06-21 17:37:39 -04001146 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
1147 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
1148 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
1149 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001150
Liz Kammerd56ddb52021-06-21 17:37:39 -04001151 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1152 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1153 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1154 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001155
Liz Kammerd56ddb52021-06-21 17:37:39 -04001156 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1157 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1158 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1159 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001160
Liz Kammerd56ddb52021-06-21 17:37:39 -04001161 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1162 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1163 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1164 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001165
Liz Kammerd56ddb52021-06-21 17:37:39 -04001166 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1167 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1168 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1169 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001170
Liz Kammerd56ddb52021-06-21 17:37:39 -04001171 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1172 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1173 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1174 checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1175
1176 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1177 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1178 // should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1179 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1180 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1181
1182 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1183 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1184 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1185 checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1186
1187 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1188 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1189 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1190 checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1191
1192 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1193 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1194 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1195 checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
Liz Kammerbb8d84f2021-06-21 12:53:03 -04001196}
Trevor Radcliffebc65f632023-04-12 21:51:08 +00001197
1198func TestCfi(t *testing.T) {
1199 t.Parallel()
1200
1201 bp := `
1202 cc_library_shared {
1203 name: "shared_with_cfi",
1204 static_libs: [
1205 "static_dep_with_cfi",
1206 "static_dep_no_cfi",
1207 ],
1208 sanitize: {
1209 cfi: true,
1210 },
1211 }
1212
1213 cc_library_shared {
1214 name: "shared_no_cfi",
1215 static_libs: [
1216 "static_dep_with_cfi",
1217 "static_dep_no_cfi",
1218 ],
1219 }
1220
1221 cc_library_static {
1222 name: "static_dep_with_cfi",
1223 sanitize: {
1224 cfi: true,
1225 },
1226 }
1227
1228 cc_library_static {
1229 name: "static_dep_no_cfi",
1230 }
1231
1232 cc_library_shared {
1233 name: "shared_rdep_no_cfi",
1234 static_libs: ["static_dep_with_cfi_2"],
1235 }
1236
1237 cc_library_static {
1238 name: "static_dep_with_cfi_2",
1239 sanitize: {
1240 cfi: true,
1241 },
1242 }
1243`
1244 preparer := android.GroupFixturePreparers(
1245 prepareForCcTest,
1246 )
1247 result := preparer.RunTestWithBp(t, bp)
1248 ctx := result.TestContext
1249
1250 buildOs := "android_arm64_armv8-a"
1251 shared_suffix := "_shared"
1252 cfi_suffix := "_cfi"
1253 static_suffix := "_static"
1254
1255 sharedWithCfiLib := result.ModuleForTests("shared_with_cfi", buildOs+shared_suffix+cfi_suffix)
1256 sharedNoCfiLib := result.ModuleForTests("shared_no_cfi", buildOs+shared_suffix)
1257 staticWithCfiLib := result.ModuleForTests("static_dep_with_cfi", buildOs+static_suffix)
1258 staticWithCfiLibCfiVariant := result.ModuleForTests("static_dep_with_cfi", buildOs+static_suffix+cfi_suffix)
1259 staticNoCfiLib := result.ModuleForTests("static_dep_no_cfi", buildOs+static_suffix)
1260 staticNoCfiLibCfiVariant := result.ModuleForTests("static_dep_no_cfi", buildOs+static_suffix+cfi_suffix)
1261 sharedRdepNoCfi := result.ModuleForTests("shared_rdep_no_cfi", buildOs+shared_suffix)
1262 staticDepWithCfi2Lib := result.ModuleForTests("static_dep_with_cfi_2", buildOs+static_suffix)
1263
1264 // Confirm assumptions about propagation of CFI enablement
1265 expectStaticLinkDep(t, ctx, sharedWithCfiLib, staticWithCfiLibCfiVariant)
1266 expectStaticLinkDep(t, ctx, sharedNoCfiLib, staticWithCfiLib)
1267 expectStaticLinkDep(t, ctx, sharedWithCfiLib, staticNoCfiLibCfiVariant)
1268 expectStaticLinkDep(t, ctx, sharedNoCfiLib, staticNoCfiLib)
1269 expectStaticLinkDep(t, ctx, sharedRdepNoCfi, staticDepWithCfi2Lib)
1270
1271 // Confirm that non-CFI variants do not add CFI flags
1272 bazLibCflags := staticWithCfiLib.Rule("cc").Args["cFlags"]
1273 if strings.Contains(bazLibCflags, "-fsanitize-cfi-cross-dso") {
1274 t.Errorf("non-CFI variant of baz not expected to contain CFI flags ")
1275 }
1276}
Liz Kammerba23cb62023-09-26 16:48:04 -04001277
1278func TestHwasan(t *testing.T) {
1279 t.Parallel()
1280
1281 bp := `
1282 cc_library_shared {
1283 name: "shared_with_hwaddress",
1284 static_libs: [
1285 "static_dep_with_hwaddress",
1286 "static_dep_no_hwaddress",
1287 ],
1288 sanitize: {
1289 hwaddress: true,
1290 },
1291 sdk_version: "current",
1292 stl: "c++_shared",
1293 }
1294
1295 cc_library_static {
1296 name: "static_dep_with_hwaddress",
1297 sanitize: {
1298 hwaddress: true,
1299 },
1300 sdk_version: "current",
1301 stl: "c++_shared",
1302 }
1303
1304 cc_library_static {
1305 name: "static_dep_no_hwaddress",
1306 sdk_version: "current",
1307 stl: "c++_shared",
1308 }
1309`
1310
1311 androidArm := "android_arm_armv7-a-neon"
1312 androidArm64 := "android_arm64_armv8-a"
1313 androidX86 := "android_x86_silvermont"
1314 sharedSuffix := "_shared"
1315 hwasanSuffix := "_hwasan"
1316 staticSuffix := "_static"
1317 sdkSuffix := "_sdk"
1318
1319 sharedWithHwasanVariant := sharedSuffix + hwasanSuffix
1320 sharedWithSdkVariant := sdkSuffix + sharedSuffix
1321 staticWithHwasanVariant := staticSuffix + hwasanSuffix
1322 staticWithSdkVariant := sdkSuffix + staticSuffix
1323
1324 testCases := []struct {
1325 buildOs string
1326 extraPreparer android.FixturePreparer
1327 expectedVariants map[string][]string
1328 }{
1329 {
1330 buildOs: androidArm64,
1331 expectedVariants: map[string][]string{
1332 "shared_with_hwaddress": []string{
1333 androidArm64 + sharedWithHwasanVariant,
1334 androidArm64 + sharedWithSdkVariant,
1335 androidArm + sharedSuffix,
1336 androidArm + sharedWithSdkVariant,
1337 },
1338 "static_dep_with_hwaddress": []string{
1339 androidArm64 + staticSuffix,
1340 androidArm64 + staticWithHwasanVariant,
1341 androidArm64 + staticWithSdkVariant,
1342 androidArm + staticSuffix,
1343 androidArm + staticWithSdkVariant,
1344 },
1345 "static_dep_no_hwaddress": []string{
1346 androidArm64 + staticSuffix,
1347 androidArm64 + staticWithHwasanVariant,
1348 androidArm64 + staticWithSdkVariant,
1349 androidArm + staticSuffix,
1350 androidArm + staticWithSdkVariant,
1351 },
1352 },
1353 },
1354 {
1355 buildOs: androidX86,
1356 extraPreparer: android.FixtureModifyConfig(func(config android.Config) {
1357 config.Targets[android.Android] = []android.Target{
1358 {
1359 android.Android,
1360 android.Arch{
1361 ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, android.NativeBridgeDisabled, "", "", false},
1362 }
1363 }),
1364 expectedVariants: map[string][]string{
1365 "shared_with_hwaddress": []string{
1366 androidX86 + sharedSuffix,
1367 androidX86 + sharedWithSdkVariant,
1368 },
1369 "static_dep_with_hwaddress": []string{
1370 androidX86 + staticSuffix,
1371 androidX86 + staticWithSdkVariant,
1372 },
1373 "static_dep_no_hwaddress": []string{
1374 androidX86 + staticSuffix,
1375 androidX86 + staticWithSdkVariant,
1376 },
1377 },
1378 },
1379 }
1380
1381 for _, tc := range testCases {
1382 preparer := android.GroupFixturePreparers(
1383 prepareForCcTest,
1384 android.OptionalFixturePreparer(tc.extraPreparer),
1385 )
1386 result := preparer.RunTestWithBp(t, bp)
1387
1388 for m, v := range tc.expectedVariants {
1389 variants := result.ModuleVariantsForTests(m)
1390 if !reflect.DeepEqual(variants, v) {
1391 t.Errorf("Expected variants of %q to be %q, but got %q", m, v, variants)
1392 }
1393 }
1394 }
1395}