Selectively disable sanitizer instrumentation
Add `no_sanitize` attribute that allows to opt out from sanitizer instrumentation in an annotated function.
This commit is contained in:
parent
eda1a7adfc
commit
b846b42c8d
18 changed files with 255 additions and 17 deletions
32
src/test/codegen/sanitizer-no-sanitize-inlining.rs
Normal file
32
src/test/codegen/sanitizer-no-sanitize-inlining.rs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
// Verifies that no_sanitize attribute prevents inlining when
|
||||
// given sanitizer is enabled, but has no effect on inlining otherwise.
|
||||
//
|
||||
// needs-sanitizer-support
|
||||
// only-x86_64
|
||||
//
|
||||
// revisions: ASAN LSAN
|
||||
//
|
||||
//[ASAN] compile-flags: -Zsanitizer=address -C opt-level=3 -Z mir-opt-level=3
|
||||
//[LSAN] compile-flags: -Zsanitizer=leak -C opt-level=3 -Z mir-opt-level=3
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![feature(no_sanitize)]
|
||||
|
||||
// ASAN-LABEL: define void @test
|
||||
// ASAN: tail call fastcc void @random_inline
|
||||
// ASAN: }
|
||||
//
|
||||
// LSAN-LABEL: define void @test
|
||||
// LSAN-NO: call
|
||||
// LSAN: }
|
||||
#[no_mangle]
|
||||
pub fn test(n: &mut u32) {
|
||||
random_inline(n);
|
||||
}
|
||||
|
||||
#[no_sanitize(address)]
|
||||
#[inline]
|
||||
#[no_mangle]
|
||||
pub fn random_inline(n: &mut u32) {
|
||||
*n = 42;
|
||||
}
|
||||
29
src/test/codegen/sanitizer-no-sanitize.rs
Normal file
29
src/test/codegen/sanitizer-no-sanitize.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Verifies that no_sanitze attribute can be used to
|
||||
// selectively disable sanitizer instrumentation.
|
||||
//
|
||||
// needs-sanitizer-support
|
||||
// compile-flags: -Zsanitizer=address
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![feature(no_sanitize)]
|
||||
|
||||
// CHECK-LABEL: ; sanitizer_no_sanitize::unsanitized
|
||||
// CHECK-NEXT: ; Function Attrs:
|
||||
// CHECK-NOT: sanitize_address
|
||||
// CHECK: start:
|
||||
// CHECK-NOT: call void @__asan_report_load
|
||||
// CHECK: }
|
||||
#[no_sanitize(address)]
|
||||
pub fn unsanitized(b: &mut u8) -> u8 {
|
||||
*b
|
||||
}
|
||||
|
||||
// CHECK-LABEL: ; sanitizer_no_sanitize::sanitized
|
||||
// CHECK-NEXT: ; Function Attrs:
|
||||
// CHECK: sanitize_address
|
||||
// CHECK: start:
|
||||
// CHECK: call void @__asan_report_load
|
||||
// CHECK: }
|
||||
pub fn sanitized(b: &mut u8) -> u8 {
|
||||
*b
|
||||
}
|
||||
4
src/test/ui/feature-gates/feature-gate-no_sanitize.rs
Normal file
4
src/test/ui/feature-gates/feature-gate-no_sanitize.rs
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#[no_sanitize(address)]
|
||||
//~^ the `#[no_sanitize]` attribute is an experimental feature
|
||||
fn main() {
|
||||
}
|
||||
12
src/test/ui/feature-gates/feature-gate-no_sanitize.stderr
Normal file
12
src/test/ui/feature-gates/feature-gate-no_sanitize.stderr
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0658]: the `#[no_sanitize]` attribute is an experimental feature
|
||||
--> $DIR/feature-gate-no_sanitize.rs:1:1
|
||||
|
|
||||
LL | #[no_sanitize(address)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/39699
|
||||
= help: add `#![feature(no_sanitize)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
5
src/test/ui/invalid/invalid-no-sanitize.rs
Normal file
5
src/test/ui/invalid/invalid-no-sanitize.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#![feature(no_sanitize)]
|
||||
|
||||
#[no_sanitize(brontosaurus)] //~ ERROR invalid argument
|
||||
fn main() {
|
||||
}
|
||||
10
src/test/ui/invalid/invalid-no-sanitize.stderr
Normal file
10
src/test/ui/invalid/invalid-no-sanitize.stderr
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
error: invalid argument for `no_sanitize`
|
||||
--> $DIR/invalid-no-sanitize.rs:3:15
|
||||
|
|
||||
LL | #[no_sanitize(brontosaurus)]
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: expected one of: `address`, `memory` or `thread`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
15
src/test/ui/sanitize-inline-always.rs
Normal file
15
src/test/ui/sanitize-inline-always.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// check-pass
|
||||
|
||||
#![feature(no_sanitize)]
|
||||
|
||||
#[inline(always)]
|
||||
//~^ NOTE inlining requested here
|
||||
#[no_sanitize(address)]
|
||||
//~^ WARN will have no effect after inlining
|
||||
//~| NOTE on by default
|
||||
fn x() {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
x()
|
||||
}
|
||||
13
src/test/ui/sanitize-inline-always.stderr
Normal file
13
src/test/ui/sanitize-inline-always.stderr
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
warning: `no_sanitize` will have no effect after inlining
|
||||
--> $DIR/sanitize-inline-always.rs:7:1
|
||||
|
|
||||
LL | #[no_sanitize(address)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(inline_no_sanitize)]` on by default
|
||||
note: inlining requested here
|
||||
--> $DIR/sanitize-inline-always.rs:5:1
|
||||
|
|
||||
LL | #[inline(always)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue