Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compiletest: Add directives to detect sanitizer support #73044

Merged
merged 1 commit into from
Jun 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions src/test/codegen/sanitizer-memory-track-orgins.rs
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# needs-sanitizer-support
# only-x86_64
# needs-sanitizer-address
# only-linux

-include ../tools.mk
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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