mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-16 05:56:56 +00:00
Auto merge of #79883 - frewsxcv:frewsxcv-san, r=shepmaster
Enable ASan, TSan, UBSan for aarch64-apple-darwin. I confirmed ASan, TSan, UBSan all work for me locally with `clang` on my new Macbook Air. ~This requires https://github.com/rust-lang/llvm-project/pull/86~
This commit is contained in:
commit
5986dd878f
@ -895,7 +895,7 @@ fn link_sanitizer_runtime(sess: &Session, linker: &mut dyn Linker, name: &str) {
|
||||
.unwrap_or_default();
|
||||
|
||||
match sess.opts.target_triple.triple() {
|
||||
"x86_64-apple-darwin" => {
|
||||
"aarch64-apple-darwin" | "x86_64-apple-darwin" => {
|
||||
// On Apple platforms, the sanitizer is always built as a dylib, and
|
||||
// LLVM will link to `@rpath/*.dylib`, so we need to specify an
|
||||
// rpath to the library as well (the rpath should be absolute, see
|
||||
|
@ -1522,6 +1522,7 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
||||
}
|
||||
|
||||
const ASAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-fuchsia",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"x86_64-apple-darwin",
|
||||
@ -1529,11 +1530,16 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
||||
"x86_64-unknown-freebsd",
|
||||
"x86_64-unknown-linux-gnu",
|
||||
];
|
||||
const LSAN_SUPPORTED_TARGETS: &[&str] =
|
||||
&["aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];
|
||||
const LSAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"x86_64-apple-darwin",
|
||||
"x86_64-unknown-linux-gnu",
|
||||
];
|
||||
const MSAN_SUPPORTED_TARGETS: &[&str] =
|
||||
&["aarch64-unknown-linux-gnu", "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu"];
|
||||
const TSAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"x86_64-apple-darwin",
|
||||
"x86_64-unknown-freebsd",
|
||||
|
@ -356,15 +356,12 @@ fn copy_sanitizers(
|
||||
let dst = libdir.join(&runtime.name);
|
||||
builder.copy(&runtime.path, &dst);
|
||||
|
||||
if target == "x86_64-apple-darwin" {
|
||||
// Update the library install name reflect the fact it has been renamed.
|
||||
let status = Command::new("install_name_tool")
|
||||
.arg("-id")
|
||||
.arg(format!("@rpath/{}", runtime.name))
|
||||
.arg(&dst)
|
||||
.status()
|
||||
.expect("failed to execute `install_name_tool`");
|
||||
assert!(status.success());
|
||||
if target == "x86_64-apple-darwin" || target == "aarch64-apple-darwin" {
|
||||
// Update the library’s install name to reflect that it has has been renamed.
|
||||
apple_darwin_update_library_name(&dst, &format!("@rpath/{}", &runtime.name));
|
||||
// Upon renaming the install name, the code signature of the file will invalidate,
|
||||
// so we will sign it again.
|
||||
apple_darwin_sign_file(&dst);
|
||||
}
|
||||
|
||||
target_deps.push(dst);
|
||||
@ -373,6 +370,27 @@ fn copy_sanitizers(
|
||||
target_deps
|
||||
}
|
||||
|
||||
fn apple_darwin_update_library_name(library_path: &Path, new_name: &str) {
|
||||
let status = Command::new("install_name_tool")
|
||||
.arg("-id")
|
||||
.arg(new_name)
|
||||
.arg(library_path)
|
||||
.status()
|
||||
.expect("failed to execute `install_name_tool`");
|
||||
assert!(status.success());
|
||||
}
|
||||
|
||||
fn apple_darwin_sign_file(file_path: &Path) {
|
||||
let status = Command::new("codesign")
|
||||
.arg("-f") // Force to rewrite the existing signature
|
||||
.arg("-s")
|
||||
.arg("-")
|
||||
.arg(file_path)
|
||||
.status()
|
||||
.expect("failed to execute `codesign`");
|
||||
assert!(status.success());
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct StartupObjects {
|
||||
pub compiler: Compiler,
|
||||
|
@ -802,6 +802,7 @@ fn supported_sanitizers(
|
||||
};
|
||||
|
||||
match &*target.triple {
|
||||
"aarch64-apple-darwin" => darwin_libs("osx", &["asan", "lsan", "tsan"]),
|
||||
"aarch64-fuchsia" => common_libs("fuchsia", "aarch64", &["asan"]),
|
||||
"aarch64-unknown-linux-gnu" => {
|
||||
common_libs("linux", "aarch64", &["asan", "lsan", "msan", "tsan"])
|
||||
|
@ -31,7 +31,12 @@ with runtime flag `ASAN_OPTIONS=detect_leaks=1` on macOS.
|
||||
|
||||
AddressSanitizer is supported on the following targets:
|
||||
|
||||
* `aarch64-apple-darwin`
|
||||
* `aarch64-fuchsia`
|
||||
* `aarch64-unknown-linux-gnu`
|
||||
* `x86_64-apple-darwin`
|
||||
* `x86_64-fuchsia`
|
||||
* `x86_64-unknown-freebsd`
|
||||
* `x86_64-unknown-linux-gnu`
|
||||
|
||||
AddressSanitizer works with non-instrumented code although it will impede its
|
||||
@ -169,10 +174,26 @@ Shadow byte legend (one shadow byte represents 8 application bytes):
|
||||
==39249==ABORTING
|
||||
```
|
||||
|
||||
# LeakSanitizer
|
||||
|
||||
LeakSanitizer is run-time memory leak detector.
|
||||
|
||||
LeakSanitizer is supported on the following targets:
|
||||
|
||||
* `aarch64-apple-darwin`
|
||||
* `aarch64-unknown-linux-gnu`
|
||||
* `x86_64-apple-darwin`
|
||||
* `x86_64-unknown-linux-gnu`
|
||||
|
||||
# MemorySanitizer
|
||||
|
||||
MemorySanitizer is detector of uninitialized reads. It is only supported on the
|
||||
`x86_64-unknown-linux-gnu` target.
|
||||
MemorySanitizer is detector of uninitialized reads.
|
||||
|
||||
MemorySanitizer is supported on the following targets:
|
||||
|
||||
* `aarch64-unknown-linux-gnu`
|
||||
* `x86_64-unknown-freebsd`
|
||||
* `x86_64-unknown-linux-gnu`
|
||||
|
||||
MemorySanitizer requires all program code to be instrumented. C/C++ dependencies
|
||||
need to be recompiled using Clang with `-fsanitize=memory` option. Failing to
|
||||
@ -219,7 +240,10 @@ $ cargo run -Zbuild-std --target x86_64-unknown-linux-gnu
|
||||
ThreadSanitizer is a data race detection tool. It is supported on the following
|
||||
targets:
|
||||
|
||||
* `aarch64-apple-darwin`
|
||||
* `aarch64-unknown-linux-gnu`
|
||||
* `x86_64-apple-darwin`
|
||||
* `x86_64-unknown-freebsd`
|
||||
* `x86_64-unknown-linux-gnu`
|
||||
|
||||
To work correctly ThreadSanitizer needs to be "aware" of all synchronization
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Verifies that no_sanitze attribute can be used to
|
||||
// Verifies that no_sanitize attribute can be used to
|
||||
// selectively disable sanitizer instrumentation.
|
||||
//
|
||||
// needs-sanitizer-address
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: `-Zsanitizer=leak` only works with targets: aarch64-unknown-linux-gnu, x86_64-apple-darwin, x86_64-unknown-linux-gnu
|
||||
error: `-Zsanitizer=leak` only works with targets: aarch64-apple-darwin, aarch64-unknown-linux-gnu, x86_64-apple-darwin, x86_64-unknown-linux-gnu
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -82,6 +82,7 @@ const ARCH_TABLE: &[(&str, &str)] = &[
|
||||
];
|
||||
|
||||
pub const ASAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-fuchsia",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"x86_64-apple-darwin",
|
||||
@ -90,13 +91,18 @@ pub const ASAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"x86_64-unknown-linux-gnu",
|
||||
];
|
||||
|
||||
pub const LSAN_SUPPORTED_TARGETS: &[&str] =
|
||||
&["aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"];
|
||||
pub const LSAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"x86_64-apple-darwin",
|
||||
"x86_64-unknown-linux-gnu",
|
||||
];
|
||||
|
||||
pub const MSAN_SUPPORTED_TARGETS: &[&str] =
|
||||
&["aarch64-unknown-linux-gnu", "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu"];
|
||||
|
||||
pub const TSAN_SUPPORTED_TARGETS: &[&str] = &[
|
||||
"aarch64-apple-darwin",
|
||||
"aarch64-unknown-linux-gnu",
|
||||
"x86_64-apple-darwin",
|
||||
"x86_64-unknown-freebsd",
|
||||
|
Loading…
Reference in New Issue
Block a user