Add Rust fuzzing support.
Add a rust_fuzz module which builds a libfuzzer binary that enabes
asan+sancov. This relies on the libfuzzer-sys crate.
Bug: 147140513
Test: Local rust_fuzz example builds, fuzzes with asan+sancov.
Change-Id: I57db3b8d25869791824ccfab768d13b0bb9d42fa
diff --git a/rust/rust.go b/rust/rust.go
index 83add87..cda01d8 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -42,6 +42,10 @@
ctx.BottomUp("rust_libraries", LibraryMutator).Parallel()
ctx.BottomUp("rust_stdlinkage", LibstdMutator).Parallel()
ctx.BottomUp("rust_begin", BeginMutator).Parallel()
+
+ })
+ android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
+ ctx.BottomUp("rust_sanitizers", rustSanitizerRuntimeMutator).Parallel()
})
pctx.Import("android/soong/rust/config")
pctx.ImportAs("cc_config", "android/soong/cc/config")
@@ -97,6 +101,7 @@
compiler compiler
coverage *coverage
clippy *clippy
+ sanitize *sanitize
cachedToolchain config.Toolchain
sourceProvider SourceProvider
subAndroidMkOnce map[SubAndroidMkProvider]bool
@@ -125,7 +130,9 @@
}
func (mod *Module) SanitizePropDefined() bool {
- return false
+ // Because compiler is not set for some Rust modules where sanitize might be set, check that compiler is also not
+ // nil since we need compiler to actually sanitize.
+ return mod.sanitize != nil && mod.compiler != nil
}
func (mod *Module) IsDependencyRoot() bool {
@@ -420,6 +427,7 @@
&cc.CoverageProperties{},
&cc.RustBindgenClangProperties{},
&ClippyProperties{},
+ &SanitizeProperties{},
)
android.InitDefaultsModule(module)
@@ -548,6 +556,9 @@
if mod.sourceProvider != nil {
mod.AddProperties(mod.sourceProvider.SourceProviderProps()...)
}
+ if mod.sanitize != nil {
+ mod.AddProperties(mod.sanitize.props()...)
+ }
android.InitAndroidArchModule(mod, mod.hod, mod.multilib)
android.InitApexModule(mod)
@@ -566,6 +577,7 @@
module := newBaseModule(hod, multilib)
module.coverage = &coverage{}
module.clippy = &clippy{}
+ module.sanitize = &sanitize{}
return module
}
@@ -680,6 +692,9 @@
if mod.clippy != nil {
flags, deps = mod.clippy.flags(ctx, flags, deps)
}
+ if mod.sanitize != nil {
+ flags, deps = mod.sanitize.flags(ctx, flags, deps)
+ }
// SourceProvider needs to call GenerateSource() before compiler calls
// compile() so it can provide the source. A SourceProvider has
@@ -723,6 +738,10 @@
deps = mod.coverage.deps(ctx, deps)
}
+ if mod.sanitize != nil {
+ deps = mod.sanitize.deps(ctx, deps)
+ }
+
deps.Rlibs = android.LastUniqueStrings(deps.Rlibs)
deps.Dylibs = android.LastUniqueStrings(deps.Dylibs)
deps.Rustlibs = android.LastUniqueStrings(deps.Rustlibs)
@@ -783,6 +802,9 @@
if mod.coverage != nil {
mod.coverage.begin(ctx)
}
+ if mod.sanitize != nil {
+ mod.sanitize.begin(ctx)
+ }
}
func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {