Auto merge of #124676 - djkoloski:relax_multiple_sanitizers, r=cuviper,rcvalle
Relax restrictions on multiple sanitizers Most combinations of LLVM sanitizers are legal-enough to enable simultaneously. This change will allow simultaneously enabling ASAN and shadow call stacks on supported platforms. I used this python script to generate the mutually-exclusive sanitizer combinations: ```python #!/usr/bin/python3 import subprocess flags = [ ["-fsanitize=address"], ["-fsanitize=leak"], ["-fsanitize=memory"], ["-fsanitize=thread"], ["-fsanitize=hwaddress"], ["-fsanitize=cfi", "-flto", "-fvisibility=hidden"], ["-fsanitize=memtag", "--target=aarch64-linux-android", "-march=armv8a+memtag"], ["-fsanitize=shadow-call-stack"], ["-fsanitize=kcfi", "-flto", "-fvisibility=hidden"], ["-fsanitize=kernel-address"], ["-fsanitize=safe-stack"], ["-fsanitize=dataflow"], ] for i in range(len(flags)): for j in range(i): command = ["clang++"] + flags[i] + flags[j] + ["-o", "main.o", "-c", "main.cpp"] completed = subprocess.run(command, stderr=subprocess.DEVNULL) if completed.returncode != 0: first = flags[i][0][11:].replace('-', '').upper() second = flags[j][0][11:].replace('-', '').upper() print(f"(SanitizerSet::{first}, SanitizerSet::{second}),") ```
This commit is contained in:
commit
506512391b
5 changed files with 44 additions and 22 deletions
|
@ -1317,6 +1317,34 @@ bitflags::bitflags! {
|
|||
rustc_data_structures::external_bitflags_debug! { SanitizerSet }
|
||||
|
||||
impl SanitizerSet {
|
||||
// Taken from LLVM's sanitizer compatibility logic:
|
||||
// https://github.com/llvm/llvm-project/blob/release/18.x/clang/lib/Driver/SanitizerArgs.cpp#L512
|
||||
const MUTUALLY_EXCLUSIVE: &'static [(SanitizerSet, SanitizerSet)] = &[
|
||||
(SanitizerSet::ADDRESS, SanitizerSet::MEMORY),
|
||||
(SanitizerSet::ADDRESS, SanitizerSet::THREAD),
|
||||
(SanitizerSet::ADDRESS, SanitizerSet::HWADDRESS),
|
||||
(SanitizerSet::ADDRESS, SanitizerSet::MEMTAG),
|
||||
(SanitizerSet::ADDRESS, SanitizerSet::KERNELADDRESS),
|
||||
(SanitizerSet::ADDRESS, SanitizerSet::SAFESTACK),
|
||||
(SanitizerSet::LEAK, SanitizerSet::MEMORY),
|
||||
(SanitizerSet::LEAK, SanitizerSet::THREAD),
|
||||
(SanitizerSet::LEAK, SanitizerSet::KERNELADDRESS),
|
||||
(SanitizerSet::LEAK, SanitizerSet::SAFESTACK),
|
||||
(SanitizerSet::MEMORY, SanitizerSet::THREAD),
|
||||
(SanitizerSet::MEMORY, SanitizerSet::HWADDRESS),
|
||||
(SanitizerSet::MEMORY, SanitizerSet::KERNELADDRESS),
|
||||
(SanitizerSet::MEMORY, SanitizerSet::SAFESTACK),
|
||||
(SanitizerSet::THREAD, SanitizerSet::HWADDRESS),
|
||||
(SanitizerSet::THREAD, SanitizerSet::KERNELADDRESS),
|
||||
(SanitizerSet::THREAD, SanitizerSet::SAFESTACK),
|
||||
(SanitizerSet::HWADDRESS, SanitizerSet::MEMTAG),
|
||||
(SanitizerSet::HWADDRESS, SanitizerSet::KERNELADDRESS),
|
||||
(SanitizerSet::HWADDRESS, SanitizerSet::SAFESTACK),
|
||||
(SanitizerSet::CFI, SanitizerSet::KCFI),
|
||||
(SanitizerSet::MEMTAG, SanitizerSet::KERNELADDRESS),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::SAFESTACK),
|
||||
];
|
||||
|
||||
/// Return sanitizer's name
|
||||
///
|
||||
/// Returns none if the flags is a set of sanitizers numbering not exactly one.
|
||||
|
@ -1337,6 +1365,13 @@ impl SanitizerSet {
|
|||
_ => return None,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn mutually_exclusive(self) -> Option<(SanitizerSet, SanitizerSet)> {
|
||||
Self::MUTUALLY_EXCLUSIVE
|
||||
.into_iter()
|
||||
.find(|&(a, b)| self.contains(*a) && self.contains(*b))
|
||||
.copied()
|
||||
}
|
||||
}
|
||||
|
||||
/// Formats a sanitizer set as a comma separated list of sanitizers' names.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue