diff options
-rw-r--r-- | cc/cc.go | 2 | ||||
-rw-r--r-- | cc/cc_test.go | 4 | ||||
-rw-r--r-- | cc/fuzz.go | 84 | ||||
-rw-r--r-- | fuzz/fuzz_common.go | 26 |
4 files changed, 90 insertions, 26 deletions
@@ -62,7 +62,7 @@ func RegisterCCBuildComponents(ctx android.RegistrationContext) { ctx.BottomUp("sanitize_runtime_deps", sanitizerRuntimeDepsMutator).Parallel() ctx.BottomUp("sanitize_runtime", sanitizerRuntimeMutator).Parallel() - ctx.BottomUp("fuzz_deps", fuzzMutatorDeps) + ctx.Transition("fuzz", &fuzzTransitionMutator{}) ctx.Transition("coverage", &coverageTransitionMutator{}) diff --git a/cc/cc_test.go b/cc/cc_test.go index 3f3347b51..a479cb30e 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -1903,11 +1903,11 @@ func VerifyAFLFuzzTargetVariant(t *testing.T, variant string) { moduleName = "afl_fuzz_static_lib" checkPcGuardFlag(moduleName, variant+"_static", false) - checkPcGuardFlag(moduleName, variant+"_static_fuzzer", true) + checkPcGuardFlag(moduleName, variant+"_static_fuzzer_afl", true) moduleName = "second_static_lib" checkPcGuardFlag(moduleName, variant+"_static", false) - checkPcGuardFlag(moduleName, variant+"_static_fuzzer", true) + checkPcGuardFlag(moduleName, variant+"_static_fuzzer_afl", true) ctx.ModuleForTests("afl_fuzz_shared_lib", "android_arm64_armv8-a_shared").Rule("cc") diff --git a/cc/fuzz.go b/cc/fuzz.go index 3f21bc6e7..0aa9d4ba1 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -57,38 +57,76 @@ func (fuzzer *fuzzer) props() []interface{} { return []interface{}{&fuzzer.Properties} } -func fuzzMutatorDeps(mctx android.BottomUpMutatorContext) { - currentModule, ok := mctx.Module().(*Module) +// fuzzTransitionMutator creates variants to propagate the FuzzFramework value down to dependencies. +type fuzzTransitionMutator struct{} + +func (f *fuzzTransitionMutator) Split(ctx android.BaseModuleContext) []string { + return []string{""} +} + +func (f *fuzzTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + m, ok := ctx.Module().(*Module) if !ok { - return + return "" } - if currentModule.fuzzer == nil { - return + if m.fuzzer == nil { + return "" } - mctx.WalkDeps(func(child android.Module, parent android.Module) bool { - c, ok := child.(*Module) - if !ok { - return false - } + if m.sanitize == nil { + return "" + } - if c.sanitize == nil { - return false - } + isFuzzerPointer := m.sanitize.getSanitizerBoolPtr(Fuzzer) + if isFuzzerPointer == nil || !*isFuzzerPointer { + return "" + } - isFuzzerPointer := c.sanitize.getSanitizerBoolPtr(Fuzzer) - if isFuzzerPointer == nil || !*isFuzzerPointer { - return false - } + if m.fuzzer.Properties.FuzzFramework != "" { + return m.fuzzer.Properties.FuzzFramework.Variant() + } - if c.fuzzer == nil { - return false - } + return sourceVariation +} - c.fuzzer.Properties.FuzzFramework = currentModule.fuzzer.Properties.FuzzFramework - return true - }) +func (f *fuzzTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { + m, ok := ctx.Module().(*Module) + if !ok { + return "" + } + + if m.fuzzer == nil { + return "" + } + + if m.sanitize == nil { + return "" + } + + isFuzzerPointer := m.sanitize.getSanitizerBoolPtr(Fuzzer) + if isFuzzerPointer == nil || !*isFuzzerPointer { + return "" + } + + return incomingVariation +} + +func (f *fuzzTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { + m, ok := ctx.Module().(*Module) + if !ok { + return + } + + if m.fuzzer == nil { + return + } + + if variation != "" { + m.fuzzer.Properties.FuzzFramework = fuzz.FrameworkFromVariant(variation) + m.SetHideFromMake() + m.SetPreventInstall() + } } // cc_fuzz creates a host/device fuzzer binary. Host binaries can be found at diff --git a/fuzz/fuzz_common.go b/fuzz/fuzz_common.go index a0598376b..42fd22886 100644 --- a/fuzz/fuzz_common.go +++ b/fuzz/fuzz_common.go @@ -44,6 +44,32 @@ const ( UnknownFramework Framework = "unknownframework" ) +func (f Framework) Variant() string { + switch f { + case AFL: + return "afl" + case LibFuzzer: + return "libfuzzer" + case Jazzer: + return "jazzer" + default: + panic(fmt.Errorf("unknown fuzzer %q when getting variant", f)) + } +} + +func FrameworkFromVariant(v string) Framework { + switch v { + case "afl": + return AFL + case "libfuzzer": + return LibFuzzer + case "jazzer": + return Jazzer + default: + panic(fmt.Errorf("unknown variant %q when getting fuzzer", v)) + } +} + var BoolDefault = proptools.BoolDefault type FuzzModule struct { |