Skip to content

Commit

Permalink
compiletest: Add directives to detect sanitizer support
Browse files Browse the repository at this point in the history
Add needs-sanitizer-{address,leak,memory,thread} directive indicating
that test requires target with support for specific sanitizer.

This is an addition to the existing needs-sanitizer-support directive
indicating that test requires a sanitizer runtime library.
  • Loading branch information
tmiasko committed Jun 13, 2020
1 parent 449e8ea commit d40e624
Show file tree
Hide file tree
Showing 20 changed files with 75 additions and 30 deletions.
4 changes: 1 addition & 3 deletions src/test/codegen/sanitizer-memory-track-orgins.rs
@@ -1,9 +1,7 @@
// Verifies that MemorySanitizer track-origins level can be controlled
// with -Zsanitizer-memory-track-origins option.
//
// needs-sanitizer-support
// only-linux
// only-x86_64
// needs-sanitizer-memory
// revisions:MSAN-0 MSAN-1 MSAN-2 MSAN-1-LTO MSAN-2-LTO
//
//[MSAN-0] compile-flags: -Zsanitizer=memory
Expand Down
6 changes: 2 additions & 4 deletions src/test/codegen/sanitizer-no-sanitize-inlining.rs
@@ -1,11 +1,9 @@
// 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
//
// needs-sanitizer-address
// needs-sanitizer-leak
// 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

Expand Down
2 changes: 1 addition & 1 deletion src/test/codegen/sanitizer-no-sanitize.rs
@@ -1,7 +1,7 @@
// Verifies that no_sanitze attribute can be used to
// selectively disable sanitizer instrumentation.
//
// needs-sanitizer-support
// needs-sanitizer-address
// compile-flags: -Zsanitizer=address

#![crate_type="lib"]
Expand Down
5 changes: 2 additions & 3 deletions src/test/codegen/sanitizer-recover.rs
@@ -1,9 +1,8 @@
// Verifies that AddressSanitizer and MemorySanitizer
// recovery mode can be enabled with -Zsanitizer-recover.
//
// needs-sanitizer-support
// only-linux
// only-x86_64
// needs-sanitizer-address
// needs-sanitizer-memory
// revisions:ASAN ASAN-RECOVER MSAN MSAN-RECOVER MSAN-RECOVER-LTO
// no-prefer-dynamic
//
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-make-fulldeps/sanitizer-cdylib-link/Makefile
@@ -1,5 +1,5 @@
# needs-sanitizer-support
# only-x86_64
# needs-sanitizer-address
# only-linux

-include ../tools.mk
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-make-fulldeps/sanitizer-dylib-link/Makefile
@@ -1,5 +1,5 @@
# needs-sanitizer-support
# only-x86_64
# needs-sanitizer-address
# only-linux

-include ../tools.mk
Expand Down
@@ -1,5 +1,5 @@
# needs-sanitizer-support
# only-x86_64
# needs-sanitizer-address
# only-linux

-include ../tools.mk
Expand Down
1 change: 1 addition & 0 deletions src/test/rustdoc/sanitizer-option.rs
@@ -1,4 +1,5 @@
// needs-sanitizer-support
// needs-sanitizer-address
// compile-flags: --test -Z sanitizer=address
//
// #43031: Verify that rustdoc passes `-Z` options to rustc. Use an extern
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/address.rs
@@ -1,5 +1,5 @@
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-address
//
// compile-flags: -Z sanitizer=address -O -g
//
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/badfree.rs
@@ -1,5 +1,5 @@
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-address
//
// compile-flags: -Z sanitizer=address -O
//
Expand Down
6 changes: 4 additions & 2 deletions src/test/ui/sanitize/cfg.rs
Expand Up @@ -2,8 +2,10 @@
// the `#[cfg(sanitize = "option")]` attribute is configured.

// needs-sanitizer-support
// only-linux
// only-x86_64
// needs-sanitizer-address
// needs-sanitizer-leak
// needs-sanitizer-memory
// needs-sanitizer-thread
// check-pass
// revisions: address leak memory thread
//[address]compile-flags: -Zsanitizer=address --cfg address
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/issue-72154-lifetime-markers.rs
Expand Up @@ -4,7 +4,7 @@
// miscompilation which was subsequently detected by AddressSanitizer as UB.
//
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-address
//
// compile-flags: -Copt-level=0 -Zsanitizer=address
// run-pass
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/leak.rs
@@ -1,5 +1,5 @@
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-leak
//
// compile-flags: -Z sanitizer=leak -O
//
Expand Down
3 changes: 1 addition & 2 deletions src/test/ui/sanitize/memory.rs
@@ -1,6 +1,5 @@
// needs-sanitizer-support
// only-linux
// only-x86_64
// needs-sanitizer-memory
//
// compile-flags: -Z sanitizer=memory -Zsanitizer-memory-track-origins -O
//
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/new-llvm-pass-manager-thin-lto.rs
Expand Up @@ -4,7 +4,7 @@
//
// min-llvm-version 9.0
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-address
//
// no-prefer-dynamic
// revisions: opt0 opt1
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/thread.rs
Expand Up @@ -11,7 +11,7 @@
// would occasionally fail, making test flaky.
//
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-thread
//
// compile-flags: -Z sanitizer=thread -O
//
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/sanitize/use-after-scope.rs
@@ -1,5 +1,5 @@
// needs-sanitizer-support
// only-x86_64
// needs-sanitizer-address
//
// compile-flags: -Zsanitizer=address
// run-fail
Expand Down
28 changes: 23 additions & 5 deletions src/tools/compiletest/src/header.rs
Expand Up @@ -43,6 +43,10 @@ impl EarlyProps {
let mut props = EarlyProps::default();
let rustc_has_profiler_support = env::var_os("RUSTC_PROFILER_SUPPORT").is_some();
let rustc_has_sanitizer_support = env::var_os("RUSTC_SANITIZER_SUPPORT").is_some();
let has_asan = util::ASAN_SUPPORTED_TARGETS.contains(&&*config.target);
let has_lsan = util::LSAN_SUPPORTED_TARGETS.contains(&&*config.target);
let has_msan = util::MSAN_SUPPORTED_TARGETS.contains(&&*config.target);
let has_tsan = util::TSAN_SUPPORTED_TARGETS.contains(&&*config.target);

iter_header(testfile, None, rdr, &mut |ln| {
// we should check if any only-<platform> exists and if it exists
Expand Down Expand Up @@ -74,7 +78,25 @@ impl EarlyProps {
props.ignore = true;
}

if !rustc_has_sanitizer_support && config.parse_needs_sanitizer_support(ln) {
if !rustc_has_sanitizer_support
&& config.parse_name_directive(ln, "needs-sanitizer-support")
{
props.ignore = true;
}

if !has_asan && config.parse_name_directive(ln, "needs-sanitizer-address") {
props.ignore = true;
}

if !has_lsan && config.parse_name_directive(ln, "needs-sanitizer-leak") {
props.ignore = true;
}

if !has_msan && config.parse_name_directive(ln, "needs-sanitizer-memory") {
props.ignore = true;
}

if !has_tsan && config.parse_name_directive(ln, "needs-sanitizer-thread") {
props.ignore = true;
}

Expand Down Expand Up @@ -829,10 +851,6 @@ impl Config {
self.parse_name_directive(line, "needs-profiler-support")
}

fn parse_needs_sanitizer_support(&self, line: &str) -> bool {
self.parse_name_directive(line, "needs-sanitizer-support")
}

/// Parses a name-value directive which contains config-specific information, e.g., `ignore-x86`
/// or `normalize-stderr-32bit`.
fn parse_cfg_name_directive(&self, line: &str, prefix: &str) -> ParsedNameDirective {
Expand Down
19 changes: 19 additions & 0 deletions src/tools/compiletest/src/header/tests.rs
Expand Up @@ -195,3 +195,22 @@ fn debugger() {
config.debugger = Some(Debugger::Lldb);
assert!(parse_rs(&config, "// ignore-lldb").ignore);
}

#[test]
fn sanitizers() {
let mut config = config();

// Target that supports all sanitizers:
config.target = "x86_64-unknown-linux-gnu".to_owned();
assert!(!parse_rs(&config, "// needs-sanitizer-address").ignore);
assert!(!parse_rs(&config, "// needs-sanitizer-leak").ignore);
assert!(!parse_rs(&config, "// needs-sanitizer-memory").ignore);
assert!(!parse_rs(&config, "// needs-sanitizer-thread").ignore);

// Target that doesn't support sanitizers:
config.target = "wasm32-unknown-emscripten".to_owned();
assert!(parse_rs(&config, "// needs-sanitizer-address").ignore);
assert!(parse_rs(&config, "// needs-sanitizer-leak").ignore);
assert!(parse_rs(&config, "// needs-sanitizer-memory").ignore);
assert!(parse_rs(&config, "// needs-sanitizer-thread").ignore);
}
11 changes: 11 additions & 0 deletions src/tools/compiletest/src/util.rs
Expand Up @@ -81,6 +81,17 @@ const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[
("xcore", "xcore"),
];

pub const ASAN_SUPPORTED_TARGETS: &'static [&'static str] =
&["aarch64-fuchsia", "x86_64-apple-darwin", "x86_64-fuchsia", "x86_64-unknown-linux-gnu"];

pub const LSAN_SUPPORTED_TARGETS: &'static [&'static str] =
&["x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];

pub const MSAN_SUPPORTED_TARGETS: &'static [&'static str] = &["x86_64-unknown-linux-gnu"];

pub const TSAN_SUPPORTED_TARGETS: &'static [&'static str] =
&["x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];

pub fn matches_os(triple: &str, name: &str) -> bool {
// For the wasm32 bare target we ignore anything also ignored on emscripten
// and then we also recognize `wasm32-bare` as the os for the target
Expand Down

0 comments on commit d40e624

Please sign in to comment.