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