diff --git a/bp2build/cc_binary_conversion_test.go b/bp2build/cc_binary_conversion_test.go index f89d42cee..ab6e4a558 100644 --- a/bp2build/cc_binary_conversion_test.go +++ b/bp2build/cc_binary_conversion_test.go @@ -1126,6 +1126,26 @@ func TestCcBinaryWithCfiAndCfiAssemblySupport(t *testing.T) { }) } +func TestCcBinaryExplicitlyDisablesCfiWhenFalse(t *testing.T) { + runCcBinaryTestCase(t, ccBinaryBp2buildTestCase{ + description: "cc_binary disables cfi when explciitly set to false in the bp", + blueprint: ` +{rule_name} { + name: "foo", + sanitize: { + cfi: false, + }, +} +`, + targets: []testBazelTarget{ + {"cc_binary", "foo", AttrNameToString{ + "features": `["-android_cfi"]`, + "local_includes": `["."]`, + }}, + }, + }) +} + func TestCcBinaryStem(t *testing.T) { runCcBinaryTestCase(t, ccBinaryBp2buildTestCase{ description: "cc_binary with stem property", diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 24e91f5e9..1e3d72e6e 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -4839,6 +4839,32 @@ cc_library { }) } +func TestCcLibraryExplicitlyDisablesCfiWhenFalse(t *testing.T) { + runCcLibraryTestCase(t, Bp2buildTestCase{ + Description: "cc_library disables cfi when explciitly set to false in the bp", + ModuleTypeUnderTest: "cc_library", + ModuleTypeUnderTestFactory: cc.LibraryFactory, + Blueprint: ` +cc_library { + name: "foo", + sanitize: { + cfi: false, + }, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{ + "features": `["-android_cfi"]`, + "local_includes": `["."]`, + }), + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `["-android_cfi"]`, + "local_includes": `["."]`, + }), + }, + }) +} + func TestCcLibraryWithStem(t *testing.T) { runCcLibraryTestCase(t, Bp2buildTestCase{ Description: "cc_library with stem property", diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go index a8288552b..a16cfb3d5 100644 --- a/bp2build/cc_library_shared_conversion_test.go +++ b/bp2build/cc_library_shared_conversion_test.go @@ -1535,3 +1535,23 @@ cc_library_static { }, }) } + +func TestCcLibrarySharedExplicitlyDisablesCfiWhenFalse(t *testing.T) { + runCcLibrarySharedTestCase(t, Bp2buildTestCase{ + Description: "cc_library_shared disables cfi when explciitly set to false in the bp", + Blueprint: ` +cc_library_shared { + name: "foo", + sanitize: { + cfi: false, + }, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ + "features": `["-android_cfi"]`, + "local_includes": `["."]`, + }), + }, + }) +} diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go index afe76e5d6..b473f279a 100644 --- a/bp2build/cc_library_static_conversion_test.go +++ b/bp2build/cc_library_static_conversion_test.go @@ -2165,3 +2165,23 @@ cc_library_static { }, }) } + +func TestCcLibraryStaticExplicitlyDisablesCfiWhenFalse(t *testing.T) { + runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Description: "cc_library_static disables cfi when explciitly set to false in the bp", + Blueprint: ` +cc_library_static { + name: "foo", + sanitize: { + cfi: false, + }, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "features": `["-android_cfi"]`, + "local_includes": `["."]`, + }), + }, + }) +} diff --git a/cc/bp2build.go b/cc/bp2build.go index eb91898ea..d09cdcd3f 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -1787,7 +1787,9 @@ func bp2buildSanitizerFeatures(ctx android.BazelConversionPathContext, m *Module blocklistFeatureSuffix := strings.Replace(strings.ToLower(*blocklist), ".", "_", -1) features = append(features, "ubsan_blocklist_"+blocklistFeatureSuffix) } - if proptools.Bool(sanitizerProps.Sanitize.Cfi) { + if sanitizerProps.Sanitize.Cfi != nil && !proptools.Bool(sanitizerProps.Sanitize.Cfi) { + features = append(features, "-android_cfi") + } else if proptools.Bool(sanitizerProps.Sanitize.Cfi) { features = append(features, "android_cfi") if proptools.Bool(sanitizerProps.Sanitize.Config.Cfi_assembly_support) { features = append(features, "android_cfi_assembly_support")