From c79a7094b0cadc7820da5a16bee21b28c733e295 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Mon, 9 Apr 2018 20:10:29 +0000 Subject: [PATCH] asan: kernel: make no_sanitize("address") attribute work with -fsanitize=kernel-address Summary: Right now to disable -fsanitize=kernel-address instrumentation, one needs to use no_sanitize("kernel-address"). Make either no_sanitize("address") or no_sanitize("kernel-address") disable both ASan and KASan instrumentation. Also remove redundant test. Patch by Andrey Konovalov Reviewers: eugenis, kcc, glider, dvyukov, vitalybuka Reviewed By: eugenis, vitalybuka Differential Revision: https://reviews.llvm.org/D44981 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@329612 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenFunction.cpp | 10 +++- test/CodeGen/address-safety-attr-flavors.cpp | 55 +++++++++++++++++++ .../address-safety-attr-kasan-hwasan.cpp | 53 ------------------ test/CodeGen/address-safety-attr-kasan.cpp | 38 ------------- 4 files changed, 63 insertions(+), 93 deletions(-) create mode 100644 test/CodeGen/address-safety-attr-flavors.cpp delete mode 100644 test/CodeGen/address-safety-attr-kasan-hwasan.cpp delete mode 100644 test/CodeGen/address-safety-attr-kasan.cpp diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index e5db4e52b4..57b1c4b4db 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -846,8 +846,14 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, if (D) { // Apply the no_sanitize* attributes to SanOpts. - for (auto Attr : D->specific_attrs()) - SanOpts.Mask &= ~Attr->getMask(); + for (auto Attr : D->specific_attrs()) { + SanitizerMask mask = Attr->getMask(); + SanOpts.Mask &= ~mask; + if (mask & SanitizerKind::Address) + SanOpts.set(SanitizerKind::KernelAddress, false); + if (mask & SanitizerKind::KernelAddress) + SanOpts.set(SanitizerKind::Address, false); + } } // Apply sanitizer attributes to the function. diff --git a/test/CodeGen/address-safety-attr-flavors.cpp b/test/CodeGen/address-safety-attr-flavors.cpp new file mode 100644 index 0000000000..fd05fb4112 --- /dev/null +++ b/test/CodeGen/address-safety-attr-flavors.cpp @@ -0,0 +1,55 @@ +// Make sure the sanitize_address attribute is emitted when using ASan, KASan or +// HWASan. Either __attribute__((no_sanitize("address")) or +// __attribute__((no_sanitize("kernel-address")) disables both ASan and KASan +// instrumentation. + +// RUN: %clang_cc1 -triple i386-unknown-linux -disable-O0-optnone \ +// RUN: -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-NOASAN %s + +// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=address \ +// RUN: -disable-O0-optnone -emit-llvm -o - %s | \ +// RUN: FileCheck -check-prefix=CHECK-ASAN %s + +// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=kernel-address \ +// RUN: -disable-O0-optnone -emit-llvm -o - %s | \ +// RUN: FileCheck -check-prefix=CHECK-KASAN %s + +// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=hwaddress \ +// RUN: -disable-O0-optnone -emit-llvm -o - %s | \ +// RUN: FileCheck -check-prefix=CHECK-HWASAN %s + +int HasSanitizeAddress() { return 1; } +// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-ASAN: Function Attrs: noinline nounwind sanitize_address +// CHECK-KASAN: Function Attrs: noinline nounwind sanitize_address +// CHECK-HWASAN: Function Attrs: noinline nounwind sanitize_hwaddress + +__attribute__((no_sanitize("address"))) int NoSanitizeQuoteAddress() { + return 0; +} +// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-KASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-HWASAN: {{Function Attrs: noinline nounwind sanitize_hwaddress$}} + +__attribute__((no_sanitize_address)) int NoSanitizeAddress() { return 0; } +// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-KASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-HWASAN: {{Function Attrs: noinline nounwind sanitize_hwaddress$}} + +__attribute__((no_sanitize("kernel-address"))) int NoSanitizeKernelAddress() { + return 0; +} +// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-KASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-HWASAN: {{Function Attrs: noinline nounwind sanitize_hwaddress$}} + +__attribute__((no_sanitize("hwaddress"))) int NoSanitizeHWAddress() { + return 0; +} +// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} +// CHECK-ASAN: {{Function Attrs: noinline nounwind sanitize_address$}} +// CHECK-KASAN: {{Function Attrs: noinline nounwind sanitize_address$}} +// CHECK-HWASAN: {{Function Attrs: noinline nounwind$}} diff --git a/test/CodeGen/address-safety-attr-kasan-hwasan.cpp b/test/CodeGen/address-safety-attr-kasan-hwasan.cpp deleted file mode 100644 index 7a84b798e4..0000000000 --- a/test/CodeGen/address-safety-attr-kasan-hwasan.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// Make sure the sanitize_address attribute is emitted when using both ASan and KASan. -// Also document that __attribute__((no_sanitize_address)) doesn't disable KASan instrumentation. - -/// RUN: %clang_cc1 -triple i386-unknown-linux -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-NOASAN %s -/// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=address -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-ASAN %s -/// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=kernel-address -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-KASAN %s -/// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=hwaddress -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-HWASAN %s - -int HasSanitizeAddress() { - return 1; -} -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: Function Attrs: noinline nounwind sanitize_address -// CHECK-KASAN: Function Attrs: noinline nounwind sanitize_address -// CHECK-HWASAN: Function Attrs: noinline nounwind sanitize_hwaddress - -__attribute__((no_sanitize("address"))) -int NoSanitizeQuoteAddress() { - return 0; -} -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind sanitize_address$}} -// CHECK-HWASAN: {{Function Attrs: noinline nounwind sanitize_hwaddress$}} - -__attribute__((no_sanitize_address)) -int NoSanitizeAddress() { - return 0; -} -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind sanitize_address$}} -// CHECK-HWASAN: {{Function Attrs: noinline nounwind sanitize_hwaddress$}} - -__attribute__((no_sanitize("kernel-address"))) -int NoSanitizeKernelAddress() { - return 0; -} - -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind sanitize_address$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-HWASAN: {{Function Attrs: noinline nounwind sanitize_hwaddress$}} - -__attribute__((no_sanitize("hwaddress"))) -int NoSanitizeHWAddress() { - return 0; -} - -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind sanitize_address$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind sanitize_address$}} -// CHECK-HWASAN: {{Function Attrs: noinline nounwind$}} diff --git a/test/CodeGen/address-safety-attr-kasan.cpp b/test/CodeGen/address-safety-attr-kasan.cpp deleted file mode 100644 index 603134db69..0000000000 --- a/test/CodeGen/address-safety-attr-kasan.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Make sure the sanitize_address attribute is emitted when using both ASan and KASan. -// Also document that __attribute__((no_sanitize_address)) doesn't disable KASan instrumentation. - -/// RUN: %clang_cc1 -triple i386-unknown-linux -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-NOASAN %s -/// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=address -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-ASAN %s -/// RUN: %clang_cc1 -triple i386-unknown-linux -fsanitize=kernel-address -disable-O0-optnone -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-KASAN %s - -int HasSanitizeAddress() { - return 1; -} -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: Function Attrs: noinline nounwind sanitize_address -// CHECK-KASAN: Function Attrs: noinline nounwind sanitize_address - -__attribute__((no_sanitize("address"))) -int NoSanitizeQuoteAddress() { - return 0; -} -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind sanitize_address$}} - -__attribute__((no_sanitize_address)) -int NoSanitizeAddress() { - return 0; -} -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind sanitize_address$}} - -__attribute__((no_sanitize("kernel-address"))) -int NoSanitizeKernelAddress() { - return 0; -} - -// CHECK-NOASAN: {{Function Attrs: noinline nounwind$}} -// CHECK-ASAN: {{Function Attrs: noinline nounwind sanitize_address$}} -// CHECK-KASAN: {{Function Attrs: noinline nounwind$}} -- 2.40.0