xref: /aosp_15_r20/build/soong/cc/sanitize_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"reflect"
20*333d2b36SAndroid Build Coastguard Worker	"runtime"
21*333d2b36SAndroid Build Coastguard Worker	"strings"
22*333d2b36SAndroid Build Coastguard Worker	"testing"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workervar prepareForAsanTest = android.FixtureAddFile("asan/Android.bp", []byte(`
28*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
29*333d2b36SAndroid Build Coastguard Worker		name: "libclang_rt.asan",
30*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
31*333d2b36SAndroid Build Coastguard Worker	}
32*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
33*333d2b36SAndroid Build Coastguard Worker		name: "libclang_rt.asan.static",
34*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
35*333d2b36SAndroid Build Coastguard Worker	}
36*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
37*333d2b36SAndroid Build Coastguard Worker		name: "libclang_rt.asan_cxx.static",
38*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
39*333d2b36SAndroid Build Coastguard Worker	}
40*333d2b36SAndroid Build Coastguard Worker`))
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Workervar prepareForTsanTest = android.FixtureAddFile("tsan/Android.bp", []byte(`
43*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
44*333d2b36SAndroid Build Coastguard Worker		name: "libclang_rt.tsan",
45*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
46*333d2b36SAndroid Build Coastguard Worker	}
47*333d2b36SAndroid Build Coastguard Worker`))
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workertype providerInterface interface {
50*333d2b36SAndroid Build Coastguard Worker	android.OtherModuleProviderContext
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker// expectSharedLinkDep verifies that the from module links against the to module as a
54*333d2b36SAndroid Build Coastguard Worker// shared library.
55*333d2b36SAndroid Build Coastguard Workerfunc expectSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
56*333d2b36SAndroid Build Coastguard Worker	t.Helper()
57*333d2b36SAndroid Build Coastguard Worker	fromLink := from.Description("link")
58*333d2b36SAndroid Build Coastguard Worker	toInfo, _ := android.OtherModuleProvider(ctx, to.Module(), SharedLibraryInfoProvider)
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Worker	if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); !android.InList(w, g) {
61*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s should link against %s, expected %q, got %q",
62*333d2b36SAndroid Build Coastguard Worker			from.Module(), to.Module(), w, g)
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker// expectNoSharedLinkDep verifies that the from module links against the to module as a
67*333d2b36SAndroid Build Coastguard Worker// shared library.
68*333d2b36SAndroid Build Coastguard Workerfunc expectNoSharedLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
69*333d2b36SAndroid Build Coastguard Worker	t.Helper()
70*333d2b36SAndroid Build Coastguard Worker	fromLink := from.Description("link")
71*333d2b36SAndroid Build Coastguard Worker	toInfo, _ := android.OtherModuleProvider(ctx, to.Module(), SharedLibraryInfoProvider)
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	if g, w := fromLink.OrderOnly.Strings(), toInfo.SharedLibrary.RelativeToTop().String(); android.InList(w, g) {
74*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s should not link against %s, expected %q, got %q",
75*333d2b36SAndroid Build Coastguard Worker			from.Module(), to.Module(), w, g)
76*333d2b36SAndroid Build Coastguard Worker	}
77*333d2b36SAndroid Build Coastguard Worker}
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker// expectStaticLinkDep verifies that the from module links against the to module as a
80*333d2b36SAndroid Build Coastguard Worker// static library.
81*333d2b36SAndroid Build Coastguard Workerfunc expectStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
82*333d2b36SAndroid Build Coastguard Worker	t.Helper()
83*333d2b36SAndroid Build Coastguard Worker	fromLink := from.Description("link")
84*333d2b36SAndroid Build Coastguard Worker	toInfo, _ := android.OtherModuleProvider(ctx, to.Module(), StaticLibraryInfoProvider)
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Worker	if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); !android.InList(w, g) {
87*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s should link against %s, expected %q, got %q",
88*333d2b36SAndroid Build Coastguard Worker			from.Module(), to.Module(), w, g)
89*333d2b36SAndroid Build Coastguard Worker	}
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker// expectNoStaticLinkDep verifies that the from module links against the to module as a
94*333d2b36SAndroid Build Coastguard Worker// static library.
95*333d2b36SAndroid Build Coastguard Workerfunc expectNoStaticLinkDep(t *testing.T, ctx providerInterface, from, to android.TestingModule) {
96*333d2b36SAndroid Build Coastguard Worker	t.Helper()
97*333d2b36SAndroid Build Coastguard Worker	fromLink := from.Description("link")
98*333d2b36SAndroid Build Coastguard Worker	toInfo, _ := android.OtherModuleProvider(ctx, to.Module(), StaticLibraryInfoProvider)
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	if g, w := fromLink.Implicits.Strings(), toInfo.StaticLibrary.RelativeToTop().String(); android.InList(w, g) {
101*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s should not link against %s, expected %q, got %q",
102*333d2b36SAndroid Build Coastguard Worker			from.Module(), to.Module(), w, g)
103*333d2b36SAndroid Build Coastguard Worker	}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Worker// expectInstallDep verifies that the install rule of the from module depends on the
108*333d2b36SAndroid Build Coastguard Worker// install rule of the to module.
109*333d2b36SAndroid Build Coastguard Workerfunc expectInstallDep(t *testing.T, from, to android.TestingModule) {
110*333d2b36SAndroid Build Coastguard Worker	t.Helper()
111*333d2b36SAndroid Build Coastguard Worker	fromInstalled := from.Description("install")
112*333d2b36SAndroid Build Coastguard Worker	toInstalled := to.Description("install")
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Worker	// combine implicits and order-only dependencies, host uses implicit but device uses
115*333d2b36SAndroid Build Coastguard Worker	// order-only.
116*333d2b36SAndroid Build Coastguard Worker	got := append(fromInstalled.Implicits.Strings(), fromInstalled.OrderOnly.Strings()...)
117*333d2b36SAndroid Build Coastguard Worker	want := toInstalled.Output.String()
118*333d2b36SAndroid Build Coastguard Worker	if !android.InList(want, got) {
119*333d2b36SAndroid Build Coastguard Worker		t.Errorf("%s installation should depend on %s, expected %q, got %q",
120*333d2b36SAndroid Build Coastguard Worker			from.Module(), to.Module(), want, got)
121*333d2b36SAndroid Build Coastguard Worker	}
122*333d2b36SAndroid Build Coastguard Worker}
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Workertype expectedRuntimeLinkage int
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerconst (
127*333d2b36SAndroid Build Coastguard Worker	RUNTIME_LINKAGE_NONE   = expectedRuntimeLinkage(0)
128*333d2b36SAndroid Build Coastguard Worker	RUNTIME_LINKAGE_SHARED = iota
129*333d2b36SAndroid Build Coastguard Worker	RUNTIME_LINKAGE_STATIC
130*333d2b36SAndroid Build Coastguard Worker)
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Workerfunc TestAsan(t *testing.T) {
133*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
134*333d2b36SAndroid Build Coastguard Worker	bp := `
135*333d2b36SAndroid Build Coastguard Worker		cc_binary {
136*333d2b36SAndroid Build Coastguard Worker			name: "bin_with_asan",
137*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
138*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
139*333d2b36SAndroid Build Coastguard Worker				"libshared",
140*333d2b36SAndroid Build Coastguard Worker				"libasan",
141*333d2b36SAndroid Build Coastguard Worker			],
142*333d2b36SAndroid Build Coastguard Worker			static_libs: [
143*333d2b36SAndroid Build Coastguard Worker				"libstatic",
144*333d2b36SAndroid Build Coastguard Worker				"libnoasan",
145*333d2b36SAndroid Build Coastguard Worker				"libstatic_asan",
146*333d2b36SAndroid Build Coastguard Worker			],
147*333d2b36SAndroid Build Coastguard Worker			sanitize: {
148*333d2b36SAndroid Build Coastguard Worker				address: true,
149*333d2b36SAndroid Build Coastguard Worker			}
150*333d2b36SAndroid Build Coastguard Worker		}
151*333d2b36SAndroid Build Coastguard Worker
152*333d2b36SAndroid Build Coastguard Worker		cc_binary {
153*333d2b36SAndroid Build Coastguard Worker			name: "bin_no_asan",
154*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
155*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
156*333d2b36SAndroid Build Coastguard Worker				"libshared",
157*333d2b36SAndroid Build Coastguard Worker				"libasan",
158*333d2b36SAndroid Build Coastguard Worker			],
159*333d2b36SAndroid Build Coastguard Worker			static_libs: [
160*333d2b36SAndroid Build Coastguard Worker				"libstatic",
161*333d2b36SAndroid Build Coastguard Worker				"libnoasan",
162*333d2b36SAndroid Build Coastguard Worker				"libstatic_asan",
163*333d2b36SAndroid Build Coastguard Worker			],
164*333d2b36SAndroid Build Coastguard Worker		}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
167*333d2b36SAndroid Build Coastguard Worker			name: "libshared",
168*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
169*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libtransitive"],
170*333d2b36SAndroid Build Coastguard Worker		}
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
173*333d2b36SAndroid Build Coastguard Worker			name: "libasan",
174*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
175*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libtransitive"],
176*333d2b36SAndroid Build Coastguard Worker			sanitize: {
177*333d2b36SAndroid Build Coastguard Worker				address: true,
178*333d2b36SAndroid Build Coastguard Worker			}
179*333d2b36SAndroid Build Coastguard Worker		}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
182*333d2b36SAndroid Build Coastguard Worker			name: "libtransitive",
183*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
184*333d2b36SAndroid Build Coastguard Worker		}
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
187*333d2b36SAndroid Build Coastguard Worker			name: "libstatic",
188*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
189*333d2b36SAndroid Build Coastguard Worker		}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
192*333d2b36SAndroid Build Coastguard Worker			name: "libnoasan",
193*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
194*333d2b36SAndroid Build Coastguard Worker			sanitize: {
195*333d2b36SAndroid Build Coastguard Worker				address: false,
196*333d2b36SAndroid Build Coastguard Worker			}
197*333d2b36SAndroid Build Coastguard Worker		}
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
200*333d2b36SAndroid Build Coastguard Worker			name: "libstatic_asan",
201*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
202*333d2b36SAndroid Build Coastguard Worker			sanitize: {
203*333d2b36SAndroid Build Coastguard Worker				address: true,
204*333d2b36SAndroid Build Coastguard Worker			}
205*333d2b36SAndroid Build Coastguard Worker		}
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker	`
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
210*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
211*333d2b36SAndroid Build Coastguard Worker		prepareForAsanTest,
212*333d2b36SAndroid Build Coastguard Worker	)
213*333d2b36SAndroid Build Coastguard Worker	buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Worker	check := func(t *testing.T, variant string, runtimeLinkage expectedRuntimeLinkage, preparer android.FixturePreparer) {
216*333d2b36SAndroid Build Coastguard Worker		result := preparer.RunTestWithBp(t, bp)
217*333d2b36SAndroid Build Coastguard Worker		ctx := result.TestContext
218*333d2b36SAndroid Build Coastguard Worker		asanVariant := variant + "_asan"
219*333d2b36SAndroid Build Coastguard Worker		sharedVariant := variant + "_shared"
220*333d2b36SAndroid Build Coastguard Worker		sharedAsanVariant := sharedVariant + "_asan"
221*333d2b36SAndroid Build Coastguard Worker		staticVariant := variant + "_static"
222*333d2b36SAndroid Build Coastguard Worker		staticAsanVariant := staticVariant + "_asan"
223*333d2b36SAndroid Build Coastguard Worker
224*333d2b36SAndroid Build Coastguard Worker		// The binaries, one with asan and one without
225*333d2b36SAndroid Build Coastguard Worker		binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant)
226*333d2b36SAndroid Build Coastguard Worker		binNoAsan := result.ModuleForTests("bin_no_asan", variant)
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Worker		// Shared libraries that don't request asan
229*333d2b36SAndroid Build Coastguard Worker		libShared := result.ModuleForTests("libshared", sharedVariant)
230*333d2b36SAndroid Build Coastguard Worker		libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Worker		// Shared library that requests asan
233*333d2b36SAndroid Build Coastguard Worker		libAsan := result.ModuleForTests("libasan", sharedAsanVariant)
234*333d2b36SAndroid Build Coastguard Worker
235*333d2b36SAndroid Build Coastguard Worker		// Static library that uses an asan variant for bin_with_asan and a non-asan variant
236*333d2b36SAndroid Build Coastguard Worker		// for bin_no_asan.
237*333d2b36SAndroid Build Coastguard Worker		libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant)
238*333d2b36SAndroid Build Coastguard Worker		libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant)
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Worker		// Static library that never uses asan.
241*333d2b36SAndroid Build Coastguard Worker		libNoAsan := result.ModuleForTests("libnoasan", staticVariant)
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Worker		// Static library that specifies asan
244*333d2b36SAndroid Build Coastguard Worker		libStaticAsan := result.ModuleForTests("libstatic_asan", staticAsanVariant)
245*333d2b36SAndroid Build Coastguard Worker		libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant)
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Worker		libAsanSharedRuntime := result.ModuleForTests("libclang_rt.asan", sharedVariant)
248*333d2b36SAndroid Build Coastguard Worker		libAsanStaticRuntime := result.ModuleForTests("libclang_rt.asan.static", staticVariant)
249*333d2b36SAndroid Build Coastguard Worker		libAsanStaticCxxRuntime := result.ModuleForTests("libclang_rt.asan_cxx.static", staticVariant)
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binWithAsan, libShared)
252*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binWithAsan, libAsan)
253*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libShared, libTransitive)
254*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libAsan, libTransitive)
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsanVariant)
257*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithAsan, libNoAsan)
258*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithAsan, libStaticAsan)
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, binWithAsan, libShared)
261*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, binWithAsan, libAsan)
262*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, binWithAsan, libTransitive)
263*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, libShared, libTransitive)
264*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, libAsan, libTransitive)
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binNoAsan, libShared)
267*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binNoAsan, libAsan)
268*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libShared, libTransitive)
269*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libAsan, libTransitive)
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoAsan, libStaticNoAsanVariant)
272*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoAsan, libNoAsan)
273*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoAsan, libStaticAsanNoAsanVariant)
274*333d2b36SAndroid Build Coastguard Worker
275*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, binNoAsan, libShared)
276*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, binNoAsan, libAsan)
277*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, binNoAsan, libTransitive)
278*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, libShared, libTransitive)
279*333d2b36SAndroid Build Coastguard Worker		expectInstallDep(t, libAsan, libTransitive)
280*333d2b36SAndroid Build Coastguard Worker
281*333d2b36SAndroid Build Coastguard Worker		if runtimeLinkage == RUNTIME_LINKAGE_SHARED {
282*333d2b36SAndroid Build Coastguard Worker			expectSharedLinkDep(t, ctx, binWithAsan, libAsanSharedRuntime)
283*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, binNoAsan, libAsanSharedRuntime)
284*333d2b36SAndroid Build Coastguard Worker			expectSharedLinkDep(t, ctx, libAsan, libAsanSharedRuntime)
285*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
286*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
287*333d2b36SAndroid Build Coastguard Worker		} else {
288*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, binWithAsan, libAsanSharedRuntime)
289*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, binNoAsan, libAsanSharedRuntime)
290*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, libAsan, libAsanSharedRuntime)
291*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, libShared, libAsanSharedRuntime)
292*333d2b36SAndroid Build Coastguard Worker			expectNoSharedLinkDep(t, ctx, libTransitive, libAsanSharedRuntime)
293*333d2b36SAndroid Build Coastguard Worker		}
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Worker		if runtimeLinkage == RUNTIME_LINKAGE_STATIC {
296*333d2b36SAndroid Build Coastguard Worker			expectStaticLinkDep(t, ctx, binWithAsan, libAsanStaticRuntime)
297*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticRuntime)
298*333d2b36SAndroid Build Coastguard Worker			expectStaticLinkDep(t, ctx, libAsan, libAsanStaticRuntime)
299*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticRuntime)
300*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticRuntime)
301*333d2b36SAndroid Build Coastguard Worker
302*333d2b36SAndroid Build Coastguard Worker			expectStaticLinkDep(t, ctx, binWithAsan, libAsanStaticCxxRuntime)
303*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticCxxRuntime)
304*333d2b36SAndroid Build Coastguard Worker			expectStaticLinkDep(t, ctx, libAsan, libAsanStaticCxxRuntime)
305*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticCxxRuntime)
306*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticCxxRuntime)
307*333d2b36SAndroid Build Coastguard Worker		} else {
308*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, binWithAsan, libAsanStaticRuntime)
309*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticRuntime)
310*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libAsan, libAsanStaticRuntime)
311*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticRuntime)
312*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticRuntime)
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, binWithAsan, libAsanStaticCxxRuntime)
315*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, binNoAsan, libAsanStaticCxxRuntime)
316*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libAsan, libAsanStaticCxxRuntime)
317*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libShared, libAsanStaticCxxRuntime)
318*333d2b36SAndroid Build Coastguard Worker			expectNoStaticLinkDep(t, ctx, libTransitive, libAsanStaticCxxRuntime)
319*333d2b36SAndroid Build Coastguard Worker		}
320*333d2b36SAndroid Build Coastguard Worker	}
321*333d2b36SAndroid Build Coastguard Worker
322*333d2b36SAndroid Build Coastguard Worker	t.Run("host", func(t *testing.T) { check(t, buildOS, RUNTIME_LINKAGE_NONE, preparer) })
323*333d2b36SAndroid Build Coastguard Worker	t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", RUNTIME_LINKAGE_SHARED, preparer) })
324*333d2b36SAndroid Build Coastguard Worker	t.Run("host musl", func(t *testing.T) {
325*333d2b36SAndroid Build Coastguard Worker		check(t, "linux_musl_x86_64", RUNTIME_LINKAGE_STATIC,
326*333d2b36SAndroid Build Coastguard Worker			android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
327*333d2b36SAndroid Build Coastguard Worker	})
328*333d2b36SAndroid Build Coastguard Worker}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Workerfunc TestTsan(t *testing.T) {
331*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
332*333d2b36SAndroid Build Coastguard Worker	bp := `
333*333d2b36SAndroid Build Coastguard Worker	cc_binary {
334*333d2b36SAndroid Build Coastguard Worker		name: "bin_with_tsan",
335*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
336*333d2b36SAndroid Build Coastguard Worker		shared_libs: [
337*333d2b36SAndroid Build Coastguard Worker			"libshared",
338*333d2b36SAndroid Build Coastguard Worker			"libtsan",
339*333d2b36SAndroid Build Coastguard Worker		],
340*333d2b36SAndroid Build Coastguard Worker		sanitize: {
341*333d2b36SAndroid Build Coastguard Worker			thread: true,
342*333d2b36SAndroid Build Coastguard Worker		}
343*333d2b36SAndroid Build Coastguard Worker	}
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker	cc_binary {
346*333d2b36SAndroid Build Coastguard Worker		name: "bin_no_tsan",
347*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
348*333d2b36SAndroid Build Coastguard Worker		shared_libs: [
349*333d2b36SAndroid Build Coastguard Worker			"libshared",
350*333d2b36SAndroid Build Coastguard Worker			"libtsan",
351*333d2b36SAndroid Build Coastguard Worker		],
352*333d2b36SAndroid Build Coastguard Worker	}
353*333d2b36SAndroid Build Coastguard Worker
354*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
355*333d2b36SAndroid Build Coastguard Worker		name: "libshared",
356*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
357*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libtransitive"],
358*333d2b36SAndroid Build Coastguard Worker	}
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
361*333d2b36SAndroid Build Coastguard Worker		name: "libtsan",
362*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
363*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libtransitive"],
364*333d2b36SAndroid Build Coastguard Worker		sanitize: {
365*333d2b36SAndroid Build Coastguard Worker			thread: true,
366*333d2b36SAndroid Build Coastguard Worker		}
367*333d2b36SAndroid Build Coastguard Worker	}
368*333d2b36SAndroid Build Coastguard Worker
369*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
370*333d2b36SAndroid Build Coastguard Worker		name: "libtransitive",
371*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
372*333d2b36SAndroid Build Coastguard Worker	}
373*333d2b36SAndroid Build Coastguard Worker`
374*333d2b36SAndroid Build Coastguard Worker
375*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
376*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
377*333d2b36SAndroid Build Coastguard Worker		prepareForTsanTest,
378*333d2b36SAndroid Build Coastguard Worker	)
379*333d2b36SAndroid Build Coastguard Worker	buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
380*333d2b36SAndroid Build Coastguard Worker
381*333d2b36SAndroid Build Coastguard Worker	check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
382*333d2b36SAndroid Build Coastguard Worker		result := preparer.RunTestWithBp(t, bp)
383*333d2b36SAndroid Build Coastguard Worker		ctx := result.TestContext
384*333d2b36SAndroid Build Coastguard Worker		tsanVariant := variant + "_tsan"
385*333d2b36SAndroid Build Coastguard Worker		sharedVariant := variant + "_shared"
386*333d2b36SAndroid Build Coastguard Worker		sharedTsanVariant := sharedVariant + "_tsan"
387*333d2b36SAndroid Build Coastguard Worker
388*333d2b36SAndroid Build Coastguard Worker		// The binaries, one with tsan and one without
389*333d2b36SAndroid Build Coastguard Worker		binWithTsan := result.ModuleForTests("bin_with_tsan", tsanVariant)
390*333d2b36SAndroid Build Coastguard Worker		binNoTsan := result.ModuleForTests("bin_no_tsan", variant)
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker		// Shared libraries that don't request tsan
393*333d2b36SAndroid Build Coastguard Worker		libShared := result.ModuleForTests("libshared", sharedVariant)
394*333d2b36SAndroid Build Coastguard Worker		libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
395*333d2b36SAndroid Build Coastguard Worker
396*333d2b36SAndroid Build Coastguard Worker		// Shared library that requests tsan
397*333d2b36SAndroid Build Coastguard Worker		libTsan := result.ModuleForTests("libtsan", sharedTsanVariant)
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binWithTsan, libShared)
400*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binWithTsan, libTsan)
401*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libShared, libTransitive)
402*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libTsan, libTransitive)
403*333d2b36SAndroid Build Coastguard Worker
404*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binNoTsan, libShared)
405*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binNoTsan, libTsan)
406*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libShared, libTransitive)
407*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libTsan, libTransitive)
408*333d2b36SAndroid Build Coastguard Worker	}
409*333d2b36SAndroid Build Coastguard Worker
410*333d2b36SAndroid Build Coastguard Worker	t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
411*333d2b36SAndroid Build Coastguard Worker	t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
412*333d2b36SAndroid Build Coastguard Worker	t.Run("host musl", func(t *testing.T) {
413*333d2b36SAndroid Build Coastguard Worker		check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
414*333d2b36SAndroid Build Coastguard Worker	})
415*333d2b36SAndroid Build Coastguard Worker}
416*333d2b36SAndroid Build Coastguard Worker
417*333d2b36SAndroid Build Coastguard Workerfunc TestMiscUndefined(t *testing.T) {
418*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS != "linux" {
419*333d2b36SAndroid Build Coastguard Worker		t.Skip("requires linux")
420*333d2b36SAndroid Build Coastguard Worker	}
421*333d2b36SAndroid Build Coastguard Worker
422*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
423*333d2b36SAndroid Build Coastguard Worker	bp := `
424*333d2b36SAndroid Build Coastguard Worker	cc_binary {
425*333d2b36SAndroid Build Coastguard Worker		name: "bin_with_ubsan",
426*333d2b36SAndroid Build Coastguard Worker		srcs: ["src.cc"],
427*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
428*333d2b36SAndroid Build Coastguard Worker		static_libs: [
429*333d2b36SAndroid Build Coastguard Worker			"libstatic",
430*333d2b36SAndroid Build Coastguard Worker			"libubsan",
431*333d2b36SAndroid Build Coastguard Worker		],
432*333d2b36SAndroid Build Coastguard Worker		sanitize: {
433*333d2b36SAndroid Build Coastguard Worker			misc_undefined: ["integer"],
434*333d2b36SAndroid Build Coastguard Worker		}
435*333d2b36SAndroid Build Coastguard Worker	}
436*333d2b36SAndroid Build Coastguard Worker
437*333d2b36SAndroid Build Coastguard Worker	cc_binary {
438*333d2b36SAndroid Build Coastguard Worker		name: "bin_no_ubsan",
439*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
440*333d2b36SAndroid Build Coastguard Worker		srcs: ["src.cc"],
441*333d2b36SAndroid Build Coastguard Worker		static_libs: [
442*333d2b36SAndroid Build Coastguard Worker			"libstatic",
443*333d2b36SAndroid Build Coastguard Worker			"libubsan",
444*333d2b36SAndroid Build Coastguard Worker		],
445*333d2b36SAndroid Build Coastguard Worker	}
446*333d2b36SAndroid Build Coastguard Worker
447*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
448*333d2b36SAndroid Build Coastguard Worker		name: "libstatic",
449*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
450*333d2b36SAndroid Build Coastguard Worker		srcs: ["src.cc"],
451*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libtransitive"],
452*333d2b36SAndroid Build Coastguard Worker	}
453*333d2b36SAndroid Build Coastguard Worker
454*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
455*333d2b36SAndroid Build Coastguard Worker		name: "libubsan",
456*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
457*333d2b36SAndroid Build Coastguard Worker		srcs: ["src.cc"],
458*333d2b36SAndroid Build Coastguard Worker		whole_static_libs: ["libtransitive"],
459*333d2b36SAndroid Build Coastguard Worker		sanitize: {
460*333d2b36SAndroid Build Coastguard Worker			misc_undefined: ["integer"],
461*333d2b36SAndroid Build Coastguard Worker		}
462*333d2b36SAndroid Build Coastguard Worker	}
463*333d2b36SAndroid Build Coastguard Worker
464*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
465*333d2b36SAndroid Build Coastguard Worker		name: "libtransitive",
466*333d2b36SAndroid Build Coastguard Worker		host_supported: true,
467*333d2b36SAndroid Build Coastguard Worker		srcs: ["src.cc"],
468*333d2b36SAndroid Build Coastguard Worker	}
469*333d2b36SAndroid Build Coastguard Worker`
470*333d2b36SAndroid Build Coastguard Worker
471*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
472*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
473*333d2b36SAndroid Build Coastguard Worker	)
474*333d2b36SAndroid Build Coastguard Worker	buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
475*333d2b36SAndroid Build Coastguard Worker
476*333d2b36SAndroid Build Coastguard Worker	check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
477*333d2b36SAndroid Build Coastguard Worker		result := preparer.RunTestWithBp(t, bp)
478*333d2b36SAndroid Build Coastguard Worker		ctx := result.TestContext
479*333d2b36SAndroid Build Coastguard Worker		staticVariant := variant + "_static"
480*333d2b36SAndroid Build Coastguard Worker
481*333d2b36SAndroid Build Coastguard Worker		// The binaries, one with ubsan and one without
482*333d2b36SAndroid Build Coastguard Worker		binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
483*333d2b36SAndroid Build Coastguard Worker		binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker		// Static libraries that don't request ubsan
486*333d2b36SAndroid Build Coastguard Worker		libStatic := result.ModuleForTests("libstatic", staticVariant)
487*333d2b36SAndroid Build Coastguard Worker		libTransitive := result.ModuleForTests("libtransitive", staticVariant)
488*333d2b36SAndroid Build Coastguard Worker
489*333d2b36SAndroid Build Coastguard Worker		libUbsan := result.ModuleForTests("libubsan", staticVariant)
490*333d2b36SAndroid Build Coastguard Worker
491*333d2b36SAndroid Build Coastguard Worker		libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
492*333d2b36SAndroid Build Coastguard Worker
493*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithUbsan, libStatic)
494*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan)
495*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithUbsan, libUbsanMinimal)
496*333d2b36SAndroid Build Coastguard Worker
497*333d2b36SAndroid Build Coastguard Worker		miscUndefinedSanFlag := "-fsanitize=integer"
498*333d2b36SAndroid Build Coastguard Worker		binWithUbsanCflags := binWithUbsan.Rule("cc").Args["cFlags"]
499*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(binWithUbsanCflags, miscUndefinedSanFlag) {
500*333d2b36SAndroid Build Coastguard Worker			t.Errorf("'bin_with_ubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
501*333d2b36SAndroid Build Coastguard Worker		}
502*333d2b36SAndroid Build Coastguard Worker		libStaticCflags := libStatic.Rule("cc").Args["cFlags"]
503*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(libStaticCflags, miscUndefinedSanFlag) {
504*333d2b36SAndroid Build Coastguard Worker			t.Errorf("'libstatic' Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
505*333d2b36SAndroid Build Coastguard Worker		}
506*333d2b36SAndroid Build Coastguard Worker		libUbsanCflags := libUbsan.Rule("cc").Args["cFlags"]
507*333d2b36SAndroid Build Coastguard Worker		if !strings.Contains(libUbsanCflags, miscUndefinedSanFlag) {
508*333d2b36SAndroid Build Coastguard Worker			t.Errorf("'libubsan' Expected %q to be in flags %q, was not", miscUndefinedSanFlag, binWithUbsanCflags)
509*333d2b36SAndroid Build Coastguard Worker		}
510*333d2b36SAndroid Build Coastguard Worker		libTransitiveCflags := libTransitive.Rule("cc").Args["cFlags"]
511*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(libTransitiveCflags, miscUndefinedSanFlag) {
512*333d2b36SAndroid Build Coastguard Worker			t.Errorf("'libtransitive': Expected %q to NOT be in flags %q, was", miscUndefinedSanFlag, binWithUbsanCflags)
513*333d2b36SAndroid Build Coastguard Worker		}
514*333d2b36SAndroid Build Coastguard Worker
515*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoUbsan, libStatic)
516*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoUbsan, libUbsan)
517*333d2b36SAndroid Build Coastguard Worker	}
518*333d2b36SAndroid Build Coastguard Worker
519*333d2b36SAndroid Build Coastguard Worker	t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
520*333d2b36SAndroid Build Coastguard Worker	t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
521*333d2b36SAndroid Build Coastguard Worker	t.Run("host musl", func(t *testing.T) {
522*333d2b36SAndroid Build Coastguard Worker		check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
523*333d2b36SAndroid Build Coastguard Worker	})
524*333d2b36SAndroid Build Coastguard Worker}
525*333d2b36SAndroid Build Coastguard Worker
526*333d2b36SAndroid Build Coastguard Workerfunc TestFuzz(t *testing.T) {
527*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
528*333d2b36SAndroid Build Coastguard Worker	bp := `
529*333d2b36SAndroid Build Coastguard Worker		cc_binary {
530*333d2b36SAndroid Build Coastguard Worker			name: "bin_with_fuzzer",
531*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
532*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
533*333d2b36SAndroid Build Coastguard Worker				"libshared",
534*333d2b36SAndroid Build Coastguard Worker				"libfuzzer",
535*333d2b36SAndroid Build Coastguard Worker			],
536*333d2b36SAndroid Build Coastguard Worker			static_libs: [
537*333d2b36SAndroid Build Coastguard Worker				"libstatic",
538*333d2b36SAndroid Build Coastguard Worker				"libnofuzzer",
539*333d2b36SAndroid Build Coastguard Worker				"libstatic_fuzzer",
540*333d2b36SAndroid Build Coastguard Worker			],
541*333d2b36SAndroid Build Coastguard Worker			sanitize: {
542*333d2b36SAndroid Build Coastguard Worker				fuzzer: true,
543*333d2b36SAndroid Build Coastguard Worker			}
544*333d2b36SAndroid Build Coastguard Worker		}
545*333d2b36SAndroid Build Coastguard Worker
546*333d2b36SAndroid Build Coastguard Worker		cc_binary {
547*333d2b36SAndroid Build Coastguard Worker			name: "bin_no_fuzzer",
548*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
549*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
550*333d2b36SAndroid Build Coastguard Worker				"libshared",
551*333d2b36SAndroid Build Coastguard Worker				"libfuzzer",
552*333d2b36SAndroid Build Coastguard Worker			],
553*333d2b36SAndroid Build Coastguard Worker			static_libs: [
554*333d2b36SAndroid Build Coastguard Worker				"libstatic",
555*333d2b36SAndroid Build Coastguard Worker				"libnofuzzer",
556*333d2b36SAndroid Build Coastguard Worker				"libstatic_fuzzer",
557*333d2b36SAndroid Build Coastguard Worker			],
558*333d2b36SAndroid Build Coastguard Worker		}
559*333d2b36SAndroid Build Coastguard Worker
560*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
561*333d2b36SAndroid Build Coastguard Worker			name: "libshared",
562*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
563*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libtransitive"],
564*333d2b36SAndroid Build Coastguard Worker		}
565*333d2b36SAndroid Build Coastguard Worker
566*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
567*333d2b36SAndroid Build Coastguard Worker			name: "libfuzzer",
568*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
569*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libtransitive"],
570*333d2b36SAndroid Build Coastguard Worker			sanitize: {
571*333d2b36SAndroid Build Coastguard Worker				fuzzer: true,
572*333d2b36SAndroid Build Coastguard Worker			}
573*333d2b36SAndroid Build Coastguard Worker		}
574*333d2b36SAndroid Build Coastguard Worker
575*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
576*333d2b36SAndroid Build Coastguard Worker			name: "libtransitive",
577*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
578*333d2b36SAndroid Build Coastguard Worker		}
579*333d2b36SAndroid Build Coastguard Worker
580*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
581*333d2b36SAndroid Build Coastguard Worker			name: "libstatic",
582*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
583*333d2b36SAndroid Build Coastguard Worker		}
584*333d2b36SAndroid Build Coastguard Worker
585*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
586*333d2b36SAndroid Build Coastguard Worker			name: "libnofuzzer",
587*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
588*333d2b36SAndroid Build Coastguard Worker			sanitize: {
589*333d2b36SAndroid Build Coastguard Worker				fuzzer: false,
590*333d2b36SAndroid Build Coastguard Worker			}
591*333d2b36SAndroid Build Coastguard Worker		}
592*333d2b36SAndroid Build Coastguard Worker
593*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
594*333d2b36SAndroid Build Coastguard Worker			name: "libstatic_fuzzer",
595*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
596*333d2b36SAndroid Build Coastguard Worker		}
597*333d2b36SAndroid Build Coastguard Worker
598*333d2b36SAndroid Build Coastguard Worker	`
599*333d2b36SAndroid Build Coastguard Worker
600*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
601*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
602*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
603*333d2b36SAndroid Build Coastguard Worker
604*333d2b36SAndroid Build Coastguard Worker	check := func(t *testing.T, result *android.TestResult, variant string) {
605*333d2b36SAndroid Build Coastguard Worker		ctx := result.TestContext
606*333d2b36SAndroid Build Coastguard Worker		fuzzerVariant := variant + "_fuzzer"
607*333d2b36SAndroid Build Coastguard Worker		sharedVariant := variant + "_shared"
608*333d2b36SAndroid Build Coastguard Worker		sharedFuzzerVariant := sharedVariant + "_fuzzer"
609*333d2b36SAndroid Build Coastguard Worker		staticVariant := variant + "_static"
610*333d2b36SAndroid Build Coastguard Worker		staticFuzzerVariant := staticVariant + "_fuzzer"
611*333d2b36SAndroid Build Coastguard Worker
612*333d2b36SAndroid Build Coastguard Worker		// The binaries, one with fuzzer and one without
613*333d2b36SAndroid Build Coastguard Worker		binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant)
614*333d2b36SAndroid Build Coastguard Worker		binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant)
615*333d2b36SAndroid Build Coastguard Worker
616*333d2b36SAndroid Build Coastguard Worker		// Shared libraries that don't request fuzzer
617*333d2b36SAndroid Build Coastguard Worker		libShared := result.ModuleForTests("libshared", sharedVariant)
618*333d2b36SAndroid Build Coastguard Worker		libTransitive := result.ModuleForTests("libtransitive", sharedVariant)
619*333d2b36SAndroid Build Coastguard Worker
620*333d2b36SAndroid Build Coastguard Worker		// Shared libraries that don't request fuzzer
621*333d2b36SAndroid Build Coastguard Worker		libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant)
622*333d2b36SAndroid Build Coastguard Worker		libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant)
623*333d2b36SAndroid Build Coastguard Worker
624*333d2b36SAndroid Build Coastguard Worker		// Shared library that requests fuzzer
625*333d2b36SAndroid Build Coastguard Worker		libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant)
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker		// Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant
628*333d2b36SAndroid Build Coastguard Worker		// for bin_no_fuzzer.
629*333d2b36SAndroid Build Coastguard Worker		libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant)
630*333d2b36SAndroid Build Coastguard Worker		libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant)
631*333d2b36SAndroid Build Coastguard Worker
632*333d2b36SAndroid Build Coastguard Worker		// Static library that never uses fuzzer.
633*333d2b36SAndroid Build Coastguard Worker		libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant)
634*333d2b36SAndroid Build Coastguard Worker
635*333d2b36SAndroid Build Coastguard Worker		// Static library that specifies fuzzer
636*333d2b36SAndroid Build Coastguard Worker		libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant)
637*333d2b36SAndroid Build Coastguard Worker		libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant)
638*333d2b36SAndroid Build Coastguard Worker
639*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer)
640*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer)
641*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libSharedFuzzer, libTransitiveFuzzer)
642*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
643*333d2b36SAndroid Build Coastguard Worker
644*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzerVariant)
645*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithFuzzer, libNoFuzzer)
646*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binWithFuzzer, libStaticFuzzer)
647*333d2b36SAndroid Build Coastguard Worker
648*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binNoFuzzer, libShared)
649*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, binNoFuzzer, libFuzzer)
650*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libShared, libTransitive)
651*333d2b36SAndroid Build Coastguard Worker		expectSharedLinkDep(t, ctx, libFuzzer, libTransitiveFuzzer)
652*333d2b36SAndroid Build Coastguard Worker
653*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticNoFuzzerVariant)
654*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoFuzzer, libNoFuzzer)
655*333d2b36SAndroid Build Coastguard Worker		expectStaticLinkDep(t, ctx, binNoFuzzer, libStaticFuzzerNoFuzzerVariant)
656*333d2b36SAndroid Build Coastguard Worker	}
657*333d2b36SAndroid Build Coastguard Worker
658*333d2b36SAndroid Build Coastguard Worker	t.Run("device", func(t *testing.T) { check(t, result, "android_arm64_armv8-a") })
659*333d2b36SAndroid Build Coastguard Worker}
660*333d2b36SAndroid Build Coastguard Worker
661*333d2b36SAndroid Build Coastguard Workerfunc TestUbsan(t *testing.T) {
662*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
663*333d2b36SAndroid Build Coastguard Worker	if runtime.GOOS != "linux" {
664*333d2b36SAndroid Build Coastguard Worker		t.Skip("requires linux")
665*333d2b36SAndroid Build Coastguard Worker	}
666*333d2b36SAndroid Build Coastguard Worker
667*333d2b36SAndroid Build Coastguard Worker	bp := `
668*333d2b36SAndroid Build Coastguard Worker		cc_binary {
669*333d2b36SAndroid Build Coastguard Worker			name: "bin_with_ubsan",
670*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
671*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
672*333d2b36SAndroid Build Coastguard Worker				"libshared",
673*333d2b36SAndroid Build Coastguard Worker			],
674*333d2b36SAndroid Build Coastguard Worker			static_libs: [
675*333d2b36SAndroid Build Coastguard Worker				"libstatic",
676*333d2b36SAndroid Build Coastguard Worker				"libnoubsan",
677*333d2b36SAndroid Build Coastguard Worker			],
678*333d2b36SAndroid Build Coastguard Worker			sanitize: {
679*333d2b36SAndroid Build Coastguard Worker				undefined: true,
680*333d2b36SAndroid Build Coastguard Worker			}
681*333d2b36SAndroid Build Coastguard Worker		}
682*333d2b36SAndroid Build Coastguard Worker
683*333d2b36SAndroid Build Coastguard Worker		cc_binary {
684*333d2b36SAndroid Build Coastguard Worker			name: "bin_depends_ubsan_static",
685*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
686*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
687*333d2b36SAndroid Build Coastguard Worker				"libshared",
688*333d2b36SAndroid Build Coastguard Worker			],
689*333d2b36SAndroid Build Coastguard Worker			static_libs: [
690*333d2b36SAndroid Build Coastguard Worker				"libstatic",
691*333d2b36SAndroid Build Coastguard Worker				"libubsan",
692*333d2b36SAndroid Build Coastguard Worker				"libnoubsan",
693*333d2b36SAndroid Build Coastguard Worker			],
694*333d2b36SAndroid Build Coastguard Worker		}
695*333d2b36SAndroid Build Coastguard Worker
696*333d2b36SAndroid Build Coastguard Worker		cc_binary {
697*333d2b36SAndroid Build Coastguard Worker			name: "bin_depends_ubsan_shared",
698*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
699*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
700*333d2b36SAndroid Build Coastguard Worker				"libsharedubsan",
701*333d2b36SAndroid Build Coastguard Worker			],
702*333d2b36SAndroid Build Coastguard Worker		}
703*333d2b36SAndroid Build Coastguard Worker
704*333d2b36SAndroid Build Coastguard Worker		cc_binary {
705*333d2b36SAndroid Build Coastguard Worker			name: "bin_no_ubsan",
706*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
707*333d2b36SAndroid Build Coastguard Worker			shared_libs: [
708*333d2b36SAndroid Build Coastguard Worker				"libshared",
709*333d2b36SAndroid Build Coastguard Worker			],
710*333d2b36SAndroid Build Coastguard Worker			static_libs: [
711*333d2b36SAndroid Build Coastguard Worker				"libstatic",
712*333d2b36SAndroid Build Coastguard Worker				"libnoubsan",
713*333d2b36SAndroid Build Coastguard Worker			],
714*333d2b36SAndroid Build Coastguard Worker		}
715*333d2b36SAndroid Build Coastguard Worker
716*333d2b36SAndroid Build Coastguard Worker		cc_binary {
717*333d2b36SAndroid Build Coastguard Worker			name: "static_bin_with_ubsan_dep",
718*333d2b36SAndroid Build Coastguard Worker			static_executable: true,
719*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
720*333d2b36SAndroid Build Coastguard Worker			static_libs: [
721*333d2b36SAndroid Build Coastguard Worker				"libubsan_diag",
722*333d2b36SAndroid Build Coastguard Worker			],
723*333d2b36SAndroid Build Coastguard Worker		}
724*333d2b36SAndroid Build Coastguard Worker
725*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
726*333d2b36SAndroid Build Coastguard Worker			name: "libshared",
727*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
728*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libtransitive"],
729*333d2b36SAndroid Build Coastguard Worker		}
730*333d2b36SAndroid Build Coastguard Worker
731*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
732*333d2b36SAndroid Build Coastguard Worker			name: "libtransitive",
733*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
734*333d2b36SAndroid Build Coastguard Worker		}
735*333d2b36SAndroid Build Coastguard Worker
736*333d2b36SAndroid Build Coastguard Worker		cc_library_shared {
737*333d2b36SAndroid Build Coastguard Worker			name: "libsharedubsan",
738*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
739*333d2b36SAndroid Build Coastguard Worker			sanitize: {
740*333d2b36SAndroid Build Coastguard Worker				undefined: true,
741*333d2b36SAndroid Build Coastguard Worker			}
742*333d2b36SAndroid Build Coastguard Worker		}
743*333d2b36SAndroid Build Coastguard Worker
744*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
745*333d2b36SAndroid Build Coastguard Worker			name: "libubsan",
746*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
747*333d2b36SAndroid Build Coastguard Worker			sanitize: {
748*333d2b36SAndroid Build Coastguard Worker				undefined: true,
749*333d2b36SAndroid Build Coastguard Worker			}
750*333d2b36SAndroid Build Coastguard Worker		}
751*333d2b36SAndroid Build Coastguard Worker
752*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
753*333d2b36SAndroid Build Coastguard Worker			name: "libubsan_diag",
754*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
755*333d2b36SAndroid Build Coastguard Worker			sanitize: {
756*333d2b36SAndroid Build Coastguard Worker				undefined: true,
757*333d2b36SAndroid Build Coastguard Worker				diag: {
758*333d2b36SAndroid Build Coastguard Worker					undefined: true,
759*333d2b36SAndroid Build Coastguard Worker				},
760*333d2b36SAndroid Build Coastguard Worker			},
761*333d2b36SAndroid Build Coastguard Worker		}
762*333d2b36SAndroid Build Coastguard Worker
763*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
764*333d2b36SAndroid Build Coastguard Worker			name: "libstatic",
765*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
766*333d2b36SAndroid Build Coastguard Worker		}
767*333d2b36SAndroid Build Coastguard Worker
768*333d2b36SAndroid Build Coastguard Worker		cc_library_static {
769*333d2b36SAndroid Build Coastguard Worker			name: "libnoubsan",
770*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
771*333d2b36SAndroid Build Coastguard Worker		}
772*333d2b36SAndroid Build Coastguard Worker	`
773*333d2b36SAndroid Build Coastguard Worker
774*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
775*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
776*333d2b36SAndroid Build Coastguard Worker	)
777*333d2b36SAndroid Build Coastguard Worker	buildOS := preparer.RunTestWithBp(t, bp).Config.BuildOSTarget.String()
778*333d2b36SAndroid Build Coastguard Worker
779*333d2b36SAndroid Build Coastguard Worker	check := func(t *testing.T, variant string, preparer android.FixturePreparer) {
780*333d2b36SAndroid Build Coastguard Worker		result := preparer.RunTestWithBp(t, bp)
781*333d2b36SAndroid Build Coastguard Worker		staticVariant := variant + "_static"
782*333d2b36SAndroid Build Coastguard Worker		sharedVariant := variant + "_shared"
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Worker		minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant)
785*333d2b36SAndroid Build Coastguard Worker		standaloneRuntime := result.ModuleForTests("libclang_rt.ubsan_standalone.static", staticVariant)
786*333d2b36SAndroid Build Coastguard Worker
787*333d2b36SAndroid Build Coastguard Worker		// The binaries, one with ubsan and one without
788*333d2b36SAndroid Build Coastguard Worker		binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant)
789*333d2b36SAndroid Build Coastguard Worker		binDependsUbsan := result.ModuleForTests("bin_depends_ubsan_static", variant)
790*333d2b36SAndroid Build Coastguard Worker		libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant)
791*333d2b36SAndroid Build Coastguard Worker		binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant)
792*333d2b36SAndroid Build Coastguard Worker		binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant)
793*333d2b36SAndroid Build Coastguard Worker		staticBin := result.ModuleForTests("static_bin_with_ubsan_dep", variant)
794*333d2b36SAndroid Build Coastguard Worker
795*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs",
796*333d2b36SAndroid Build Coastguard Worker			strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "),
797*333d2b36SAndroid Build Coastguard Worker			minimalRuntime.OutputFiles(result.TestContext, t, "")[0].String())
798*333d2b36SAndroid Build Coastguard Worker
799*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_depends_ubsan_static static libs",
800*333d2b36SAndroid Build Coastguard Worker			strings.Split(binDependsUbsan.Rule("ld").Args["libFlags"], " "),
801*333d2b36SAndroid Build Coastguard Worker			minimalRuntime.OutputFiles(result.TestContext, t, "")[0].String())
802*333d2b36SAndroid Build Coastguard Worker
803*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in libsharedubsan static libs",
804*333d2b36SAndroid Build Coastguard Worker			strings.Split(libSharedUbsan.Rule("ld").Args["libFlags"], " "),
805*333d2b36SAndroid Build Coastguard Worker			minimalRuntime.OutputFiles(result.TestContext, t, "")[0].String())
806*333d2b36SAndroid Build Coastguard Worker
807*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_depends_ubsan_shared static libs",
808*333d2b36SAndroid Build Coastguard Worker			strings.Split(binDependsUbsanShared.Rule("ld").Args["libFlags"], " "),
809*333d2b36SAndroid Build Coastguard Worker			minimalRuntime.OutputFiles(result.TestContext, t, "")[0].String())
810*333d2b36SAndroid Build Coastguard Worker
811*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListDoesNotContain(t, "unexpected libclang_rt.ubsan_minimal in bin_no_ubsan static libs",
812*333d2b36SAndroid Build Coastguard Worker			strings.Split(binNoUbsan.Rule("ld").Args["libFlags"], " "),
813*333d2b36SAndroid Build Coastguard Worker			minimalRuntime.OutputFiles(result.TestContext, t, "")[0].String())
814*333d2b36SAndroid Build Coastguard Worker
815*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_with_ubsan",
816*333d2b36SAndroid Build Coastguard Worker			strings.Split(binWithUbsan.Rule("ld").Args["ldFlags"], " "),
817*333d2b36SAndroid Build Coastguard Worker			"-Wl,--exclude-libs="+minimalRuntime.OutputFiles(result.TestContext, t, "")[0].Base())
818*333d2b36SAndroid Build Coastguard Worker
819*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_static static libs",
820*333d2b36SAndroid Build Coastguard Worker			strings.Split(binDependsUbsan.Rule("ld").Args["ldFlags"], " "),
821*333d2b36SAndroid Build Coastguard Worker			"-Wl,--exclude-libs="+minimalRuntime.OutputFiles(result.TestContext, t, "")[0].Base())
822*333d2b36SAndroid Build Coastguard Worker
823*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing -Wl,--exclude-libs for minimal runtime in libsharedubsan static libs",
824*333d2b36SAndroid Build Coastguard Worker			strings.Split(libSharedUbsan.Rule("ld").Args["ldFlags"], " "),
825*333d2b36SAndroid Build Coastguard Worker			"-Wl,--exclude-libs="+minimalRuntime.OutputFiles(result.TestContext, t, "")[0].Base())
826*333d2b36SAndroid Build Coastguard Worker
827*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_depends_ubsan_shared static libs",
828*333d2b36SAndroid Build Coastguard Worker			strings.Split(binDependsUbsanShared.Rule("ld").Args["ldFlags"], " "),
829*333d2b36SAndroid Build Coastguard Worker			"-Wl,--exclude-libs="+minimalRuntime.OutputFiles(result.TestContext, t, "")[0].Base())
830*333d2b36SAndroid Build Coastguard Worker
831*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListDoesNotContain(t, "unexpected -Wl,--exclude-libs for minimal runtime in bin_no_ubsan static libs",
832*333d2b36SAndroid Build Coastguard Worker			strings.Split(binNoUbsan.Rule("ld").Args["ldFlags"], " "),
833*333d2b36SAndroid Build Coastguard Worker			"-Wl,--exclude-libs="+minimalRuntime.OutputFiles(result.TestContext, t, "")[0].Base())
834*333d2b36SAndroid Build Coastguard Worker
835*333d2b36SAndroid Build Coastguard Worker		android.AssertStringListContains(t, "missing libclang_rt.ubsan_standalone.static in static_bin_with_ubsan_dep static libs",
836*333d2b36SAndroid Build Coastguard Worker			strings.Split(staticBin.Rule("ld").Args["libFlags"], " "),
837*333d2b36SAndroid Build Coastguard Worker			standaloneRuntime.OutputFiles(result.TestContext, t, "")[0].String())
838*333d2b36SAndroid Build Coastguard Worker
839*333d2b36SAndroid Build Coastguard Worker	}
840*333d2b36SAndroid Build Coastguard Worker
841*333d2b36SAndroid Build Coastguard Worker	t.Run("host", func(t *testing.T) { check(t, buildOS, preparer) })
842*333d2b36SAndroid Build Coastguard Worker	t.Run("device", func(t *testing.T) { check(t, "android_arm64_armv8-a", preparer) })
843*333d2b36SAndroid Build Coastguard Worker	t.Run("host musl", func(t *testing.T) {
844*333d2b36SAndroid Build Coastguard Worker		check(t, "linux_musl_x86_64", android.GroupFixturePreparers(preparer, PrepareForTestWithHostMusl))
845*333d2b36SAndroid Build Coastguard Worker	})
846*333d2b36SAndroid Build Coastguard Worker}
847*333d2b36SAndroid Build Coastguard Worker
848*333d2b36SAndroid Build Coastguard Workertype MemtagNoteType int
849*333d2b36SAndroid Build Coastguard Worker
850*333d2b36SAndroid Build Coastguard Workerconst (
851*333d2b36SAndroid Build Coastguard Worker	None MemtagNoteType = iota + 1
852*333d2b36SAndroid Build Coastguard Worker	Sync
853*333d2b36SAndroid Build Coastguard Worker	Async
854*333d2b36SAndroid Build Coastguard Worker)
855*333d2b36SAndroid Build Coastguard Worker
856*333d2b36SAndroid Build Coastguard Workerfunc (t MemtagNoteType) str() string {
857*333d2b36SAndroid Build Coastguard Worker	switch t {
858*333d2b36SAndroid Build Coastguard Worker	case None:
859*333d2b36SAndroid Build Coastguard Worker		return "none"
860*333d2b36SAndroid Build Coastguard Worker	case Sync:
861*333d2b36SAndroid Build Coastguard Worker		return "sync"
862*333d2b36SAndroid Build Coastguard Worker	case Async:
863*333d2b36SAndroid Build Coastguard Worker		return "async"
864*333d2b36SAndroid Build Coastguard Worker	default:
865*333d2b36SAndroid Build Coastguard Worker		panic("type_note_invalid")
866*333d2b36SAndroid Build Coastguard Worker	}
867*333d2b36SAndroid Build Coastguard Worker}
868*333d2b36SAndroid Build Coastguard Worker
869*333d2b36SAndroid Build Coastguard Workerfunc checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNoteType) {
870*333d2b36SAndroid Build Coastguard Worker	t.Helper()
871*333d2b36SAndroid Build Coastguard Worker
872*333d2b36SAndroid Build Coastguard Worker	found := None
873*333d2b36SAndroid Build Coastguard Worker	ldFlags := m.Rule("ld").Args["ldFlags"]
874*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(ldFlags, "-fsanitize-memtag-mode=async") {
875*333d2b36SAndroid Build Coastguard Worker		found = Async
876*333d2b36SAndroid Build Coastguard Worker	} else if strings.Contains(ldFlags, "-fsanitize-memtag-mode=sync") {
877*333d2b36SAndroid Build Coastguard Worker		found = Sync
878*333d2b36SAndroid Build Coastguard Worker	}
879*333d2b36SAndroid Build Coastguard Worker
880*333d2b36SAndroid Build Coastguard Worker	if found != expected {
881*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Wrong Memtag note in target %q: found %q, expected %q", m.Module().(*Module).Name(), found.str(), expected.str())
882*333d2b36SAndroid Build Coastguard Worker	}
883*333d2b36SAndroid Build Coastguard Worker}
884*333d2b36SAndroid Build Coastguard Worker
885*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithMemtagHeap = android.GroupFixturePreparers(
886*333d2b36SAndroid Build Coastguard Worker	android.FixtureModifyMockFS(func(fs android.MockFS) {
887*333d2b36SAndroid Build Coastguard Worker		templateBp := `
888*333d2b36SAndroid Build Coastguard Worker		cc_test {
889*333d2b36SAndroid Build Coastguard Worker			name: "unset_test_%[1]s",
890*333d2b36SAndroid Build Coastguard Worker			gtest: false,
891*333d2b36SAndroid Build Coastguard Worker		}
892*333d2b36SAndroid Build Coastguard Worker
893*333d2b36SAndroid Build Coastguard Worker		cc_test {
894*333d2b36SAndroid Build Coastguard Worker			name: "no_memtag_test_%[1]s",
895*333d2b36SAndroid Build Coastguard Worker			gtest: false,
896*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: false },
897*333d2b36SAndroid Build Coastguard Worker		}
898*333d2b36SAndroid Build Coastguard Worker
899*333d2b36SAndroid Build Coastguard Worker		cc_test {
900*333d2b36SAndroid Build Coastguard Worker			name: "set_memtag_test_%[1]s",
901*333d2b36SAndroid Build Coastguard Worker			gtest: false,
902*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: true },
903*333d2b36SAndroid Build Coastguard Worker		}
904*333d2b36SAndroid Build Coastguard Worker
905*333d2b36SAndroid Build Coastguard Worker		cc_test {
906*333d2b36SAndroid Build Coastguard Worker			name: "set_memtag_set_async_test_%[1]s",
907*333d2b36SAndroid Build Coastguard Worker			gtest: false,
908*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: true, diag: { memtag_heap: false }  },
909*333d2b36SAndroid Build Coastguard Worker		}
910*333d2b36SAndroid Build Coastguard Worker
911*333d2b36SAndroid Build Coastguard Worker		cc_test {
912*333d2b36SAndroid Build Coastguard Worker			name: "set_memtag_set_sync_test_%[1]s",
913*333d2b36SAndroid Build Coastguard Worker			gtest: false,
914*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: true, diag: { memtag_heap: true }  },
915*333d2b36SAndroid Build Coastguard Worker		}
916*333d2b36SAndroid Build Coastguard Worker
917*333d2b36SAndroid Build Coastguard Worker		cc_test {
918*333d2b36SAndroid Build Coastguard Worker			name: "unset_memtag_set_sync_test_%[1]s",
919*333d2b36SAndroid Build Coastguard Worker			gtest: false,
920*333d2b36SAndroid Build Coastguard Worker			sanitize: { diag: { memtag_heap: true }  },
921*333d2b36SAndroid Build Coastguard Worker		}
922*333d2b36SAndroid Build Coastguard Worker
923*333d2b36SAndroid Build Coastguard Worker		cc_binary {
924*333d2b36SAndroid Build Coastguard Worker			name: "unset_binary_%[1]s",
925*333d2b36SAndroid Build Coastguard Worker		}
926*333d2b36SAndroid Build Coastguard Worker
927*333d2b36SAndroid Build Coastguard Worker		cc_binary {
928*333d2b36SAndroid Build Coastguard Worker			name: "no_memtag_binary_%[1]s",
929*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: false },
930*333d2b36SAndroid Build Coastguard Worker		}
931*333d2b36SAndroid Build Coastguard Worker
932*333d2b36SAndroid Build Coastguard Worker		cc_binary {
933*333d2b36SAndroid Build Coastguard Worker			name: "set_memtag_binary_%[1]s",
934*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: true },
935*333d2b36SAndroid Build Coastguard Worker		}
936*333d2b36SAndroid Build Coastguard Worker
937*333d2b36SAndroid Build Coastguard Worker		cc_binary {
938*333d2b36SAndroid Build Coastguard Worker			name: "set_memtag_set_async_binary_%[1]s",
939*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: true, diag: { memtag_heap: false }  },
940*333d2b36SAndroid Build Coastguard Worker		}
941*333d2b36SAndroid Build Coastguard Worker
942*333d2b36SAndroid Build Coastguard Worker		cc_binary {
943*333d2b36SAndroid Build Coastguard Worker			name: "set_memtag_set_sync_binary_%[1]s",
944*333d2b36SAndroid Build Coastguard Worker			sanitize: { memtag_heap: true, diag: { memtag_heap: true }  },
945*333d2b36SAndroid Build Coastguard Worker		}
946*333d2b36SAndroid Build Coastguard Worker
947*333d2b36SAndroid Build Coastguard Worker		cc_binary {
948*333d2b36SAndroid Build Coastguard Worker			name: "unset_memtag_set_sync_binary_%[1]s",
949*333d2b36SAndroid Build Coastguard Worker			sanitize: { diag: { memtag_heap: true }  },
950*333d2b36SAndroid Build Coastguard Worker		}
951*333d2b36SAndroid Build Coastguard Worker		`
952*333d2b36SAndroid Build Coastguard Worker		subdirNoOverrideBp := fmt.Sprintf(templateBp, "no_override")
953*333d2b36SAndroid Build Coastguard Worker		subdirOverrideDefaultDisableBp := fmt.Sprintf(templateBp, "override_default_disable")
954*333d2b36SAndroid Build Coastguard Worker		subdirSyncBp := fmt.Sprintf(templateBp, "override_default_sync")
955*333d2b36SAndroid Build Coastguard Worker		subdirAsyncBp := fmt.Sprintf(templateBp, "override_default_async")
956*333d2b36SAndroid Build Coastguard Worker
957*333d2b36SAndroid Build Coastguard Worker		fs.Merge(android.MockFS{
958*333d2b36SAndroid Build Coastguard Worker			"subdir_no_override/Android.bp":              []byte(subdirNoOverrideBp),
959*333d2b36SAndroid Build Coastguard Worker			"subdir_override_default_disable/Android.bp": []byte(subdirOverrideDefaultDisableBp),
960*333d2b36SAndroid Build Coastguard Worker			"subdir_sync/Android.bp":                     []byte(subdirSyncBp),
961*333d2b36SAndroid Build Coastguard Worker			"subdir_async/Android.bp":                    []byte(subdirAsyncBp),
962*333d2b36SAndroid Build Coastguard Worker		})
963*333d2b36SAndroid Build Coastguard Worker	}),
964*333d2b36SAndroid Build Coastguard Worker	android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
965*333d2b36SAndroid Build Coastguard Worker		variables.MemtagHeapExcludePaths = []string{"subdir_override_default_disable"}
966*333d2b36SAndroid Build Coastguard Worker		// "subdir_override_default_disable" is covered by both include and override_default_disable paths. override_default_disable wins.
967*333d2b36SAndroid Build Coastguard Worker		variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync", "subdir_override_default_disable"}
968*333d2b36SAndroid Build Coastguard Worker		variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async", "subdir_override_default_disable"}
969*333d2b36SAndroid Build Coastguard Worker	}),
970*333d2b36SAndroid Build Coastguard Worker)
971*333d2b36SAndroid Build Coastguard Worker
972*333d2b36SAndroid Build Coastguard Workerfunc TestSanitizeMemtagHeap(t *testing.T) {
973*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
974*333d2b36SAndroid Build Coastguard Worker	variant := "android_arm64_armv8-a"
975*333d2b36SAndroid Build Coastguard Worker
976*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
977*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
978*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMemtagHeap,
979*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
980*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
981*333d2b36SAndroid Build Coastguard Worker
982*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
983*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
984*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
985*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
986*333d2b36SAndroid Build Coastguard Worker
987*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
988*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
989*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
990*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
991*333d2b36SAndroid Build Coastguard Worker
992*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
993*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
994*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
995*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
996*333d2b36SAndroid Build Coastguard Worker
997*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
998*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
999*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1000*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
1001*333d2b36SAndroid Build Coastguard Worker
1002*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1003*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1004*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1005*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
1006*333d2b36SAndroid Build Coastguard Worker
1007*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1008*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1009*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1010*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
1011*333d2b36SAndroid Build Coastguard Worker
1012*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1013*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1014*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1015*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
1016*333d2b36SAndroid Build Coastguard Worker
1017*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1018*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1019*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1020*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1021*333d2b36SAndroid Build Coastguard Worker
1022*333d2b36SAndroid Build Coastguard Worker	// should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1023*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None)
1024*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1025*333d2b36SAndroid Build Coastguard Worker	// should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1026*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1027*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1028*333d2b36SAndroid Build Coastguard Worker
1029*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1030*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1031*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1032*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1033*333d2b36SAndroid Build Coastguard Worker
1034*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None)
1035*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
1036*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1037*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1038*333d2b36SAndroid Build Coastguard Worker
1039*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1040*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1041*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1042*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
1043*333d2b36SAndroid Build Coastguard Worker}
1044*333d2b36SAndroid Build Coastguard Worker
1045*333d2b36SAndroid Build Coastguard Workerfunc TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) {
1046*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1047*333d2b36SAndroid Build Coastguard Worker	variant := "android_arm64_armv8-a"
1048*333d2b36SAndroid Build Coastguard Worker
1049*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1050*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
1051*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMemtagHeap,
1052*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1053*333d2b36SAndroid Build Coastguard Worker			variables.SanitizeDevice = []string{"memtag_heap"}
1054*333d2b36SAndroid Build Coastguard Worker		}),
1055*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
1056*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
1057*333d2b36SAndroid Build Coastguard Worker
1058*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
1059*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1060*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1061*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
1062*333d2b36SAndroid Build Coastguard Worker
1063*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1064*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1065*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1066*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
1067*333d2b36SAndroid Build Coastguard Worker
1068*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async)
1069*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async)
1070*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async)
1071*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
1072*333d2b36SAndroid Build Coastguard Worker
1073*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1074*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1075*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1076*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
1077*333d2b36SAndroid Build Coastguard Worker
1078*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1079*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1080*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1081*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
1082*333d2b36SAndroid Build Coastguard Worker
1083*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1084*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1085*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1086*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
1087*333d2b36SAndroid Build Coastguard Worker
1088*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1089*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1090*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1091*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
1092*333d2b36SAndroid Build Coastguard Worker
1093*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1094*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1095*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1096*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1097*333d2b36SAndroid Build Coastguard Worker
1098*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1099*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1100*333d2b36SAndroid Build Coastguard Worker	// should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1101*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1102*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1103*333d2b36SAndroid Build Coastguard Worker
1104*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1105*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1106*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1107*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1108*333d2b36SAndroid Build Coastguard Worker
1109*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async)
1110*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async)
1111*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1112*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1113*333d2b36SAndroid Build Coastguard Worker
1114*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1115*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1116*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1117*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
1118*333d2b36SAndroid Build Coastguard Worker}
1119*333d2b36SAndroid Build Coastguard Worker
1120*333d2b36SAndroid Build Coastguard Workerfunc TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) {
1121*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1122*333d2b36SAndroid Build Coastguard Worker	variant := "android_arm64_armv8-a"
1123*333d2b36SAndroid Build Coastguard Worker
1124*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
1125*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
1126*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMemtagHeap,
1127*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1128*333d2b36SAndroid Build Coastguard Worker			variables.SanitizeDevice = []string{"memtag_heap"}
1129*333d2b36SAndroid Build Coastguard Worker			variables.SanitizeDeviceDiag = []string{"memtag_heap"}
1130*333d2b36SAndroid Build Coastguard Worker		}),
1131*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
1132*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
1133*333d2b36SAndroid Build Coastguard Worker
1134*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None)
1135*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None)
1136*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None)
1137*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None)
1138*333d2b36SAndroid Build Coastguard Worker
1139*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None)
1140*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None)
1141*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None)
1142*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None)
1143*333d2b36SAndroid Build Coastguard Worker
1144*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync)
1145*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync)
1146*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync)
1147*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync)
1148*333d2b36SAndroid Build Coastguard Worker
1149*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync)
1150*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync)
1151*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync)
1152*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync)
1153*333d2b36SAndroid Build Coastguard Worker
1154*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async)
1155*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async)
1156*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async)
1157*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async)
1158*333d2b36SAndroid Build Coastguard Worker
1159*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async)
1160*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async)
1161*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async)
1162*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async)
1163*333d2b36SAndroid Build Coastguard Worker
1164*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync)
1165*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync)
1166*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync)
1167*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync)
1168*333d2b36SAndroid Build Coastguard Worker
1169*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync)
1170*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync)
1171*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync)
1172*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync)
1173*333d2b36SAndroid Build Coastguard Worker
1174*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync)
1175*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync)
1176*333d2b36SAndroid Build Coastguard Worker	// should sanitize: { diag: { memtag: true } } result in Sync instead of None here?
1177*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None)
1178*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync)
1179*333d2b36SAndroid Build Coastguard Worker
1180*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync)
1181*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync)
1182*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync)
1183*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync)
1184*333d2b36SAndroid Build Coastguard Worker
1185*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync)
1186*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync)
1187*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None)
1188*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync)
1189*333d2b36SAndroid Build Coastguard Worker
1190*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync)
1191*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync)
1192*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync)
1193*333d2b36SAndroid Build Coastguard Worker	checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync)
1194*333d2b36SAndroid Build Coastguard Worker}
1195*333d2b36SAndroid Build Coastguard Worker
1196*333d2b36SAndroid Build Coastguard Workerfunc TestCfi(t *testing.T) {
1197*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1198*333d2b36SAndroid Build Coastguard Worker
1199*333d2b36SAndroid Build Coastguard Worker	bp := `
1200*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
1201*333d2b36SAndroid Build Coastguard Worker		name: "shared_with_cfi",
1202*333d2b36SAndroid Build Coastguard Worker		static_libs: [
1203*333d2b36SAndroid Build Coastguard Worker			"static_dep_with_cfi",
1204*333d2b36SAndroid Build Coastguard Worker			"static_dep_no_cfi",
1205*333d2b36SAndroid Build Coastguard Worker		],
1206*333d2b36SAndroid Build Coastguard Worker		sanitize: {
1207*333d2b36SAndroid Build Coastguard Worker			cfi: true,
1208*333d2b36SAndroid Build Coastguard Worker		},
1209*333d2b36SAndroid Build Coastguard Worker	}
1210*333d2b36SAndroid Build Coastguard Worker
1211*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
1212*333d2b36SAndroid Build Coastguard Worker		name: "shared_no_cfi",
1213*333d2b36SAndroid Build Coastguard Worker		static_libs: [
1214*333d2b36SAndroid Build Coastguard Worker			"static_dep_with_cfi",
1215*333d2b36SAndroid Build Coastguard Worker			"static_dep_no_cfi",
1216*333d2b36SAndroid Build Coastguard Worker		],
1217*333d2b36SAndroid Build Coastguard Worker	}
1218*333d2b36SAndroid Build Coastguard Worker
1219*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
1220*333d2b36SAndroid Build Coastguard Worker		name: "static_dep_with_cfi",
1221*333d2b36SAndroid Build Coastguard Worker		sanitize: {
1222*333d2b36SAndroid Build Coastguard Worker			cfi: true,
1223*333d2b36SAndroid Build Coastguard Worker		},
1224*333d2b36SAndroid Build Coastguard Worker	}
1225*333d2b36SAndroid Build Coastguard Worker
1226*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
1227*333d2b36SAndroid Build Coastguard Worker		name: "static_dep_no_cfi",
1228*333d2b36SAndroid Build Coastguard Worker	}
1229*333d2b36SAndroid Build Coastguard Worker
1230*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
1231*333d2b36SAndroid Build Coastguard Worker		name: "shared_rdep_no_cfi",
1232*333d2b36SAndroid Build Coastguard Worker		static_libs: ["static_dep_with_cfi_2"],
1233*333d2b36SAndroid Build Coastguard Worker	}
1234*333d2b36SAndroid Build Coastguard Worker
1235*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
1236*333d2b36SAndroid Build Coastguard Worker		name: "static_dep_with_cfi_2",
1237*333d2b36SAndroid Build Coastguard Worker		sanitize: {
1238*333d2b36SAndroid Build Coastguard Worker			cfi: true,
1239*333d2b36SAndroid Build Coastguard Worker		},
1240*333d2b36SAndroid Build Coastguard Worker	}
1241*333d2b36SAndroid Build Coastguard Worker`
1242*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
1243*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
1244*333d2b36SAndroid Build Coastguard Worker	)
1245*333d2b36SAndroid Build Coastguard Worker	result := preparer.RunTestWithBp(t, bp)
1246*333d2b36SAndroid Build Coastguard Worker	ctx := result.TestContext
1247*333d2b36SAndroid Build Coastguard Worker
1248*333d2b36SAndroid Build Coastguard Worker	buildOs := "android_arm64_armv8-a"
1249*333d2b36SAndroid Build Coastguard Worker	shared_suffix := "_shared"
1250*333d2b36SAndroid Build Coastguard Worker	cfi_suffix := "_cfi"
1251*333d2b36SAndroid Build Coastguard Worker	static_suffix := "_static"
1252*333d2b36SAndroid Build Coastguard Worker
1253*333d2b36SAndroid Build Coastguard Worker	sharedWithCfiLib := result.ModuleForTests("shared_with_cfi", buildOs+shared_suffix+cfi_suffix)
1254*333d2b36SAndroid Build Coastguard Worker	sharedNoCfiLib := result.ModuleForTests("shared_no_cfi", buildOs+shared_suffix)
1255*333d2b36SAndroid Build Coastguard Worker	staticWithCfiLib := result.ModuleForTests("static_dep_with_cfi", buildOs+static_suffix)
1256*333d2b36SAndroid Build Coastguard Worker	staticWithCfiLibCfiVariant := result.ModuleForTests("static_dep_with_cfi", buildOs+static_suffix+cfi_suffix)
1257*333d2b36SAndroid Build Coastguard Worker	staticNoCfiLib := result.ModuleForTests("static_dep_no_cfi", buildOs+static_suffix)
1258*333d2b36SAndroid Build Coastguard Worker	staticNoCfiLibCfiVariant := result.ModuleForTests("static_dep_no_cfi", buildOs+static_suffix+cfi_suffix)
1259*333d2b36SAndroid Build Coastguard Worker	sharedRdepNoCfi := result.ModuleForTests("shared_rdep_no_cfi", buildOs+shared_suffix)
1260*333d2b36SAndroid Build Coastguard Worker	staticDepWithCfi2Lib := result.ModuleForTests("static_dep_with_cfi_2", buildOs+static_suffix)
1261*333d2b36SAndroid Build Coastguard Worker
1262*333d2b36SAndroid Build Coastguard Worker	// Confirm assumptions about propagation of CFI enablement
1263*333d2b36SAndroid Build Coastguard Worker	expectStaticLinkDep(t, ctx, sharedWithCfiLib, staticWithCfiLibCfiVariant)
1264*333d2b36SAndroid Build Coastguard Worker	expectStaticLinkDep(t, ctx, sharedNoCfiLib, staticWithCfiLib)
1265*333d2b36SAndroid Build Coastguard Worker	expectStaticLinkDep(t, ctx, sharedWithCfiLib, staticNoCfiLibCfiVariant)
1266*333d2b36SAndroid Build Coastguard Worker	expectStaticLinkDep(t, ctx, sharedNoCfiLib, staticNoCfiLib)
1267*333d2b36SAndroid Build Coastguard Worker	expectStaticLinkDep(t, ctx, sharedRdepNoCfi, staticDepWithCfi2Lib)
1268*333d2b36SAndroid Build Coastguard Worker
1269*333d2b36SAndroid Build Coastguard Worker	// Confirm that non-CFI variants do not add CFI flags
1270*333d2b36SAndroid Build Coastguard Worker	bazLibCflags := staticWithCfiLib.Rule("cc").Args["cFlags"]
1271*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(bazLibCflags, "-fsanitize-cfi-cross-dso") {
1272*333d2b36SAndroid Build Coastguard Worker		t.Errorf("non-CFI variant of baz not expected to contain CFI flags ")
1273*333d2b36SAndroid Build Coastguard Worker	}
1274*333d2b36SAndroid Build Coastguard Worker}
1275*333d2b36SAndroid Build Coastguard Worker
1276*333d2b36SAndroid Build Coastguard Workerfunc TestHwasan(t *testing.T) {
1277*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
1278*333d2b36SAndroid Build Coastguard Worker
1279*333d2b36SAndroid Build Coastguard Worker	bp := `
1280*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
1281*333d2b36SAndroid Build Coastguard Worker		name: "shared_with_hwaddress",
1282*333d2b36SAndroid Build Coastguard Worker		static_libs: [
1283*333d2b36SAndroid Build Coastguard Worker			"static_dep_with_hwaddress",
1284*333d2b36SAndroid Build Coastguard Worker			"static_dep_no_hwaddress",
1285*333d2b36SAndroid Build Coastguard Worker		],
1286*333d2b36SAndroid Build Coastguard Worker		sanitize: {
1287*333d2b36SAndroid Build Coastguard Worker			hwaddress: true,
1288*333d2b36SAndroid Build Coastguard Worker		},
1289*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
1290*333d2b36SAndroid Build Coastguard Worker			stl: "c++_shared",
1291*333d2b36SAndroid Build Coastguard Worker	}
1292*333d2b36SAndroid Build Coastguard Worker
1293*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
1294*333d2b36SAndroid Build Coastguard Worker		name: "static_dep_with_hwaddress",
1295*333d2b36SAndroid Build Coastguard Worker		sanitize: {
1296*333d2b36SAndroid Build Coastguard Worker			hwaddress: true,
1297*333d2b36SAndroid Build Coastguard Worker		},
1298*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
1299*333d2b36SAndroid Build Coastguard Worker			stl: "c++_shared",
1300*333d2b36SAndroid Build Coastguard Worker	}
1301*333d2b36SAndroid Build Coastguard Worker
1302*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
1303*333d2b36SAndroid Build Coastguard Worker		name: "static_dep_no_hwaddress",
1304*333d2b36SAndroid Build Coastguard Worker		sdk_version: "current",
1305*333d2b36SAndroid Build Coastguard Worker			stl: "c++_shared",
1306*333d2b36SAndroid Build Coastguard Worker	}
1307*333d2b36SAndroid Build Coastguard Worker`
1308*333d2b36SAndroid Build Coastguard Worker
1309*333d2b36SAndroid Build Coastguard Worker	androidArm := "android_arm_armv7-a-neon"
1310*333d2b36SAndroid Build Coastguard Worker	androidArm64 := "android_arm64_armv8-a"
1311*333d2b36SAndroid Build Coastguard Worker	androidX86 := "android_x86_silvermont"
1312*333d2b36SAndroid Build Coastguard Worker	sharedSuffix := "_shared"
1313*333d2b36SAndroid Build Coastguard Worker	hwasanSuffix := "_hwasan"
1314*333d2b36SAndroid Build Coastguard Worker	staticSuffix := "_static"
1315*333d2b36SAndroid Build Coastguard Worker	sdkSuffix := "_sdk"
1316*333d2b36SAndroid Build Coastguard Worker
1317*333d2b36SAndroid Build Coastguard Worker	sharedWithHwasanVariant := sharedSuffix + hwasanSuffix
1318*333d2b36SAndroid Build Coastguard Worker	sharedWithSdkVariant := sdkSuffix + sharedSuffix
1319*333d2b36SAndroid Build Coastguard Worker	staticWithHwasanVariant := staticSuffix + hwasanSuffix
1320*333d2b36SAndroid Build Coastguard Worker	staticWithSdkVariant := sdkSuffix + staticSuffix
1321*333d2b36SAndroid Build Coastguard Worker
1322*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1323*333d2b36SAndroid Build Coastguard Worker		buildOs          string
1324*333d2b36SAndroid Build Coastguard Worker		extraPreparer    android.FixturePreparer
1325*333d2b36SAndroid Build Coastguard Worker		expectedVariants map[string][]string
1326*333d2b36SAndroid Build Coastguard Worker	}{
1327*333d2b36SAndroid Build Coastguard Worker		{
1328*333d2b36SAndroid Build Coastguard Worker			buildOs: androidArm64,
1329*333d2b36SAndroid Build Coastguard Worker			expectedVariants: map[string][]string{
1330*333d2b36SAndroid Build Coastguard Worker				"shared_with_hwaddress": []string{
1331*333d2b36SAndroid Build Coastguard Worker					androidArm64 + sharedWithHwasanVariant,
1332*333d2b36SAndroid Build Coastguard Worker					androidArm64 + sharedWithSdkVariant,
1333*333d2b36SAndroid Build Coastguard Worker					androidArm + sharedSuffix,
1334*333d2b36SAndroid Build Coastguard Worker					androidArm + sharedWithSdkVariant,
1335*333d2b36SAndroid Build Coastguard Worker				},
1336*333d2b36SAndroid Build Coastguard Worker				"static_dep_with_hwaddress": []string{
1337*333d2b36SAndroid Build Coastguard Worker					androidArm64 + staticSuffix,
1338*333d2b36SAndroid Build Coastguard Worker					androidArm64 + staticWithHwasanVariant,
1339*333d2b36SAndroid Build Coastguard Worker					androidArm64 + staticWithSdkVariant,
1340*333d2b36SAndroid Build Coastguard Worker					androidArm + staticSuffix,
1341*333d2b36SAndroid Build Coastguard Worker					androidArm + staticWithSdkVariant,
1342*333d2b36SAndroid Build Coastguard Worker				},
1343*333d2b36SAndroid Build Coastguard Worker				"static_dep_no_hwaddress": []string{
1344*333d2b36SAndroid Build Coastguard Worker					androidArm64 + staticSuffix,
1345*333d2b36SAndroid Build Coastguard Worker					androidArm64 + staticWithHwasanVariant,
1346*333d2b36SAndroid Build Coastguard Worker					androidArm64 + staticWithSdkVariant,
1347*333d2b36SAndroid Build Coastguard Worker					androidArm + staticSuffix,
1348*333d2b36SAndroid Build Coastguard Worker					androidArm + staticWithSdkVariant,
1349*333d2b36SAndroid Build Coastguard Worker				},
1350*333d2b36SAndroid Build Coastguard Worker			},
1351*333d2b36SAndroid Build Coastguard Worker		},
1352*333d2b36SAndroid Build Coastguard Worker		{
1353*333d2b36SAndroid Build Coastguard Worker			buildOs: androidX86,
1354*333d2b36SAndroid Build Coastguard Worker			extraPreparer: android.FixtureModifyConfig(func(config android.Config) {
1355*333d2b36SAndroid Build Coastguard Worker				config.Targets[android.Android] = []android.Target{
1356*333d2b36SAndroid Build Coastguard Worker					{
1357*333d2b36SAndroid Build Coastguard Worker						android.Android,
1358*333d2b36SAndroid Build Coastguard Worker						android.Arch{
1359*333d2b36SAndroid Build Coastguard Worker							ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, android.NativeBridgeDisabled, "", "", false},
1360*333d2b36SAndroid Build Coastguard Worker				}
1361*333d2b36SAndroid Build Coastguard Worker			}),
1362*333d2b36SAndroid Build Coastguard Worker			expectedVariants: map[string][]string{
1363*333d2b36SAndroid Build Coastguard Worker				"shared_with_hwaddress": []string{
1364*333d2b36SAndroid Build Coastguard Worker					androidX86 + sharedSuffix,
1365*333d2b36SAndroid Build Coastguard Worker					androidX86 + sharedWithSdkVariant,
1366*333d2b36SAndroid Build Coastguard Worker				},
1367*333d2b36SAndroid Build Coastguard Worker				"static_dep_with_hwaddress": []string{
1368*333d2b36SAndroid Build Coastguard Worker					androidX86 + staticSuffix,
1369*333d2b36SAndroid Build Coastguard Worker					androidX86 + staticWithSdkVariant,
1370*333d2b36SAndroid Build Coastguard Worker				},
1371*333d2b36SAndroid Build Coastguard Worker				"static_dep_no_hwaddress": []string{
1372*333d2b36SAndroid Build Coastguard Worker					androidX86 + staticSuffix,
1373*333d2b36SAndroid Build Coastguard Worker					androidX86 + staticWithSdkVariant,
1374*333d2b36SAndroid Build Coastguard Worker				},
1375*333d2b36SAndroid Build Coastguard Worker			},
1376*333d2b36SAndroid Build Coastguard Worker		},
1377*333d2b36SAndroid Build Coastguard Worker	}
1378*333d2b36SAndroid Build Coastguard Worker
1379*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
1380*333d2b36SAndroid Build Coastguard Worker		preparer := android.GroupFixturePreparers(
1381*333d2b36SAndroid Build Coastguard Worker			prepareForCcTest,
1382*333d2b36SAndroid Build Coastguard Worker			android.OptionalFixturePreparer(tc.extraPreparer),
1383*333d2b36SAndroid Build Coastguard Worker		)
1384*333d2b36SAndroid Build Coastguard Worker		result := preparer.RunTestWithBp(t, bp)
1385*333d2b36SAndroid Build Coastguard Worker
1386*333d2b36SAndroid Build Coastguard Worker		for m, v := range tc.expectedVariants {
1387*333d2b36SAndroid Build Coastguard Worker			variants := result.ModuleVariantsForTests(m)
1388*333d2b36SAndroid Build Coastguard Worker			if !reflect.DeepEqual(variants, v) {
1389*333d2b36SAndroid Build Coastguard Worker				t.Errorf("Expected variants of %q to be %q, but got %q", m, v, variants)
1390*333d2b36SAndroid Build Coastguard Worker			}
1391*333d2b36SAndroid Build Coastguard Worker		}
1392*333d2b36SAndroid Build Coastguard Worker	}
1393*333d2b36SAndroid Build Coastguard Worker}
1394