diff options
Diffstat (limited to 'rust/sanitize.go')
| -rw-r--r-- | rust/sanitize.go | 78 |
1 files changed, 42 insertions, 36 deletions
diff --git a/rust/sanitize.go b/rust/sanitize.go index c68137ecd..c086880ed 100644 --- a/rust/sanitize.go +++ b/rust/sanitize.go @@ -56,14 +56,15 @@ type SanitizeProperties struct { } var fuzzerFlags = []string{ + "-Z external-clangrt=true", + "-C passes='sancov-module'", "--cfg fuzzing", "-C llvm-args=-sanitizer-coverage-level=3", "-C llvm-args=-sanitizer-coverage-trace-compares", "-C llvm-args=-sanitizer-coverage-inline-8bit-counters", - "-C llvm-args=-sanitizer-coverage-trace-geps", - "-C llvm-args=-sanitizer-coverage-prune-blocks=0", + "-C llvm-args=-sanitizer-coverage-pc-table", // See https://github.com/rust-fuzz/cargo-fuzz/pull/193 "-C link-dead-code", @@ -74,11 +75,13 @@ var fuzzerFlags = []string{ } var asanFlags = []string{ + "-Z external-clangrt=true", "-Z sanitizer=address", } // See cc/sanitize.go's hwasanGlobalOptions for global hwasan options. var hwasanFlags = []string{ + "-Z external-clangrt=true", "-Z sanitizer=hwaddress", "-C target-feature=+tagged-globals", @@ -209,9 +212,14 @@ func (sanitize *sanitize) begin(ctx BaseModuleContext) { s.Memtag_heap = nil } + // Disable sanitizers for musl x86 modules, rustc does not support any sanitizers. + if ctx.Os() == android.LinuxMusl && ctx.Arch().ArchType == android.X86 { + s.Never = boolPtr(true) + } + // TODO:(b/178369775) - // For now sanitizing is only supported on devices - if ctx.Os() == android.Android && (Bool(s.Hwaddress) || Bool(s.Address) || Bool(s.Memtag_heap) || Bool(s.Fuzzer)) { + // For now sanitizing is only supported on non-windows targets + if ctx.Os() != android.Windows && (Bool(s.Hwaddress) || Bool(s.Address) || Bool(s.Memtag_heap) || Bool(s.Fuzzer)) { sanitize.Properties.SanitizerEnabled = true } } @@ -224,17 +232,22 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags, deps PathDeps) ( if !sanitize.Properties.SanitizerEnabled { return flags, deps } + if Bool(sanitize.Properties.Sanitize.Fuzzer) { flags.RustFlags = append(flags.RustFlags, fuzzerFlags...) - if ctx.Arch().ArchType == android.Arm64 && ctx.Os().Bionic() { - flags.RustFlags = append(flags.RustFlags, hwasanFlags...) - } else { - flags.RustFlags = append(flags.RustFlags, asanFlags...) - } - } else if Bool(sanitize.Properties.Sanitize.Hwaddress) { + } + + if Bool(sanitize.Properties.Sanitize.Hwaddress) { flags.RustFlags = append(flags.RustFlags, hwasanFlags...) - } else if Bool(sanitize.Properties.Sanitize.Address) { + } + + if Bool(sanitize.Properties.Sanitize.Address) { flags.RustFlags = append(flags.RustFlags, asanFlags...) + if ctx.Host() { + // -nodefaultlibs (provided with libc++) prevents the driver from linking + // libraries needed with -fsanitize=address. http://b/18650275 (WAI) + flags.LinkFlags = append(flags.LinkFlags, []string{"-Wl,--no-as-needed"}...) + } } return flags, deps } @@ -245,7 +258,7 @@ func (sanitize *sanitize) deps(ctx BaseModuleContext, deps Deps) Deps { func rustSanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { if mod, ok := mctx.Module().(*Module); ok && mod.sanitize != nil { - if !mod.Enabled() { + if !mod.Enabled(mctx) { return } @@ -254,12 +267,6 @@ func rustSanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { if Bool(mod.sanitize.Properties.Sanitize.Diag.Memtag_heap) { noteDep = "note_memtag_heap_sync" } - // If we're using snapshots, redirect to snapshot whenever possible - // TODO(b/178470649): clean manual snapshot redirections - snapshot := mctx.Provider(cc.SnapshotInfoProvider).(cc.SnapshotInfo) - if lib, ok := snapshot.StaticLibs[noteDep]; ok { - noteDep = lib - } depTag := cc.StaticDepTag(true) variations := append(mctx.Target().Variations(), blueprint.Variation{Mutator: "link", Variation: "static"}) @@ -273,14 +280,19 @@ func rustSanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { var depTag blueprint.DependencyTag var deps []string - if mod.IsSanitizerEnabled(cc.Asan) || - (mod.IsSanitizerEnabled(cc.Fuzzer) && (mctx.Arch().ArchType != android.Arm64 || !mctx.Os().Bionic())) { - variations = append(variations, - blueprint.Variation{Mutator: "link", Variation: "shared"}) - depTag = cc.SharedDepTag() - deps = []string{config.LibclangRuntimeLibrary(mod.toolchain(mctx), "asan")} - } else if mod.IsSanitizerEnabled(cc.Hwasan) || - (mod.IsSanitizerEnabled(cc.Fuzzer) && mctx.Arch().ArchType == android.Arm64 && mctx.Os().Bionic()) { + if mod.IsSanitizerEnabled(cc.Asan) { + if mod.Host() { + variations = append(variations, + blueprint.Variation{Mutator: "link", Variation: "static"}) + depTag = cc.StaticDepTag(false) + deps = []string{config.LibclangRuntimeLibrary(mod.toolchain(mctx), "asan.static")} + } else { + variations = append(variations, + blueprint.Variation{Mutator: "link", Variation: "shared"}) + depTag = cc.SharedDepTag() + deps = []string{config.LibclangRuntimeLibrary(mod.toolchain(mctx), "asan")} + } + } else if mod.IsSanitizerEnabled(cc.Hwasan) { // TODO(b/204776996): HWASan for static Rust binaries isn't supported yet. if binary, ok := mod.compiler.(binaryInterface); ok { if binary.staticallyLinked() { @@ -394,7 +406,8 @@ func (sanitize *sanitize) AndroidMk(ctx AndroidMkContext, entries *android.Andro } func (mod *Module) SanitizerSupported(t cc.SanitizerType) bool { - if mod.Host() { + // Sanitizers are not supported on Windows targets. + if mod.Os() == android.Windows { return false } switch t { @@ -420,18 +433,11 @@ func (mod *Module) IsSanitizerEnabled(t cc.SanitizerType) bool { } func (mod *Module) IsSanitizerExplicitlyDisabled(t cc.SanitizerType) bool { - if mod.Host() { + // Sanitizers are not supported on Windows targets. + if mod.Os() == android.Windows { return true } - // TODO(b/178365482): Rust/CC interop doesn't work just yet; don't sanitize rust_ffi modules until - // linkage issues are resolved. - if lib, ok := mod.compiler.(libraryInterface); ok { - if lib.shared() || lib.static() { - return true - } - } - return mod.sanitize.isSanitizerExplicitlyDisabled(t) } |