From 8222663f1b35c88540dbc5a7179ca346098d6a0b Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Fri, 1 Feb 2019 10:50:50 +0900 Subject: [PATCH] Fix: runtime apex is not instrumented with sanitizer Fixing the problem that IsSanitizerEnabled always returns false due to the different sanitizer names from config.SanitizerDevice() and sanitizerType.String(). Bug: 123708856 Test: SANITIZE_TARGET=hwaddress m com.android.runtime.release $ ls -al out/soong/.intermediates/art/build/apex/com.android.runtime.release/android_common_hwasan_com.android.runtime.release/image.apex/lib | wc -l 34 $ ls -al out/soong/.intermediates/art/build/apex/com.android.runtime.release/android_common_hwasan_com.android.runtime.release/image.apex/lib64 | wc -l 35 $ ls -al out/target/product/blueline/apex/com.android.runtime.release/lib | wc -l 34 $ ls -al out/target/product/blueline/apex/com.android.runtime.release/lib64 | wc -l 35 Test: inspect out/soong/build.ninja - Variant of com.android.runtime.release is "android_common_hwasan_com.android.runtime.release" - Dependencies of com.android.runtime.release are hwasan variants: e.g., out/soong/.intermediates/bionic/libc/libc/android_arm64_armv8-2a_kryo385_core_shared_hwasan_com.android.runtime.release/libc.so Test: ls out/soong/.intermediates/art/build/apex/com.android.runtime.release/android_common_hwasan_com.android.runtime.release/image.apex/lib64/*.so | xargs readelf -d | grep libclang_rt.hwasan | wc -l 29 Change-Id: Idbb1f68a3ea6bdd02351d6f6048c3eedb9cf32d2 --- cc/sanitize.go | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/cc/sanitize.go b/cc/sanitize.go index 4576aa10d..b9787f0dd 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -79,7 +79,8 @@ const ( scs ) -func (t sanitizerType) String() string { +// Name of the sanitizer variation for this sanitizer type +func (t sanitizerType) variationName() string { switch t { case asan: return "asan" @@ -98,6 +99,26 @@ func (t sanitizerType) String() string { } } +// This is the sanitizer names in SANITIZE_[TARGET|HOST] +func (t sanitizerType) name() string { + switch t { + case asan: + return "address" + case hwasan: + return "hwaddress" + case tsan: + return "thread" + case intOverflow: + return "integer_overflow" + case cfi: + return "cfi" + case scs: + return "shadow-call-stack" + default: + panic(fmt.Errorf("unknown sanitizerType %d", t)) + } +} + type SanitizeProperties struct { // enable AddressSanitizer, ThreadSanitizer, or UndefinedBehaviorSanitizer Sanitize struct { @@ -830,14 +851,14 @@ func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { return func(mctx android.BottomUpMutatorContext) { if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil { if c.isDependencyRoot() && c.sanitize.isSanitizerEnabled(t) { - modules := mctx.CreateVariations(t.String()) + modules := mctx.CreateVariations(t.variationName()) modules[0].(*Module).sanitize.SetSanitizer(t, true) } else if c.sanitize.isSanitizerEnabled(t) || c.sanitize.Properties.SanitizeDep { // Save original sanitizer status before we assign values to variant // 0 as that overwrites the original. isSanitizerEnabled := c.sanitize.isSanitizerEnabled(t) - modules := mctx.CreateVariations("", t.String()) + modules := mctx.CreateVariations("", t.variationName()) modules[0].(*Module).sanitize.SetSanitizer(t, false) modules[1].(*Module).sanitize.SetSanitizer(t, true) @@ -926,9 +947,9 @@ func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { } } c.sanitize.Properties.SanitizeDep = false - } else if sanitizeable, ok := mctx.Module().(Sanitizeable); ok && sanitizeable.IsSanitizerEnabled(mctx, t.String()) { + } else if sanitizeable, ok := mctx.Module().(Sanitizeable); ok && sanitizeable.IsSanitizerEnabled(mctx, t.name()) { // APEX modules fall here - mctx.CreateVariations(t.String()) + mctx.CreateVariations(t.variationName()) } } }