Skip to content

Commit

Permalink
Rollup merge of #132773 - jakos-sec:fix-asan-win32, r=jieyouxu
Browse files Browse the repository at this point in the history
PassWrapper: disable UseOdrIndicator for Asan Win32

As described in https://reviews.llvm.org/D137227 UseOdrIndicator should be disabled on Windows since link.exe does not support duplicate weak definitions.

Fixes #124390.

Credits also belong to `@1c3t3a`  who worked with me on this.
We are currently testing this on a Windows machine.
  • Loading branch information
GuillaumeGomez authored Nov 14, 2024
2 parents 475203f + 61013f0 commit e3c76c5
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 4 deletions.
15 changes: 11 additions & 4 deletions compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -882,10 +882,12 @@ extern "C" LLVMRustResult LLVMRustOptimize(
SanitizerOptions->SanitizeKernelAddress) {
OptimizerLastEPCallbacks.push_back(
#if LLVM_VERSION_GE(20, 0)
[SanitizerOptions](ModulePassManager &MPM, OptimizationLevel Level,
ThinOrFullLTOPhase phase) {
[SanitizerOptions, TM](ModulePassManager &MPM,
OptimizationLevel Level,
ThinOrFullLTOPhase phase) {
#else
[SanitizerOptions](ModulePassManager &MPM, OptimizationLevel Level) {
[SanitizerOptions, TM](ModulePassManager &MPM,
OptimizationLevel Level) {
#endif
auto CompileKernel = SanitizerOptions->SanitizeKernelAddress;
AddressSanitizerOptions opts = AddressSanitizerOptions{
Expand All @@ -895,7 +897,12 @@ extern "C" LLVMRustResult LLVMRustOptimize(
/*UseAfterScope=*/true,
AsanDetectStackUseAfterReturnMode::Runtime,
};
MPM.addPass(AddressSanitizerPass(opts));
MPM.addPass(AddressSanitizerPass(
opts,
/*UseGlobalGC*/ true,
// UseOdrIndicator should be false on windows machines
// https://reviews.llvm.org/D137227
!TM->getTargetTriple().isOSWindows()));
});
}
if (SanitizerOptions->SanitizeHWAddress) {
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/asan-odr-win/asan_odr_windows.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//! Check that crates can be linked together with `-Z sanitizer=address` on msvc.
//! See <https://github.com/rust-lang/rust/issues/124390>.
//@ run-pass
//@ compile-flags:-Zsanitizer=address
//@ aux-build: asan_odr_win-2.rs
//@ only-windows-msvc

extern crate othercrate;

fn main() {
let result = std::panic::catch_unwind(|| {
println!("hello!");
});
assert!(result.is_ok());

othercrate::exposed_func();
}
11 changes: 11 additions & 0 deletions tests/ui/asan-odr-win/auxiliary/asan_odr_win-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//@ no-prefer-dynamic
//@ compile-flags: -Z sanitizer=address
#![crate_name = "othercrate"]
#![crate_type = "rlib"]

pub fn exposed_func() {
let result = std::panic::catch_unwind(|| {
println!("hello!");
});
assert!(result.is_ok());
}

0 comments on commit e3c76c5

Please sign in to comment.