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.
This commit is contained in:
parent
982a58e900
commit
d7d3bd1221
2 changed files with 36 additions and 11 deletions
|
@ -1316,6 +1316,32 @@ bitflags::bitflags! {
|
|||
rustc_data_structures::external_bitflags_debug! { SanitizerSet }
|
||||
|
||||
impl SanitizerSet {
|
||||
const MUTUALLY_EXCLUSIVE: &'static [(SanitizerSet, SanitizerSet)] = &[
|
||||
(SanitizerSet::MEMORY, SanitizerSet::ADDRESS),
|
||||
(SanitizerSet::MEMORY, SanitizerSet::LEAK),
|
||||
(SanitizerSet::THREAD, SanitizerSet::ADDRESS),
|
||||
(SanitizerSet::THREAD, SanitizerSet::LEAK),
|
||||
(SanitizerSet::THREAD, SanitizerSet::MEMORY),
|
||||
(SanitizerSet::HWADDRESS, SanitizerSet::ADDRESS),
|
||||
(SanitizerSet::HWADDRESS, SanitizerSet::MEMORY),
|
||||
(SanitizerSet::HWADDRESS, SanitizerSet::THREAD),
|
||||
(SanitizerSet::MEMTAG, SanitizerSet::ADDRESS),
|
||||
(SanitizerSet::MEMTAG, SanitizerSet::HWADDRESS),
|
||||
(SanitizerSet::KCFI, SanitizerSet::CFI),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::ADDRESS),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::LEAK),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::MEMORY),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::THREAD),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::HWADDRESS),
|
||||
(SanitizerSet::KERNELADDRESS, SanitizerSet::MEMTAG),
|
||||
(SanitizerSet::SAFESTACK, SanitizerSet::ADDRESS),
|
||||
(SanitizerSet::SAFESTACK, SanitizerSet::LEAK),
|
||||
(SanitizerSet::SAFESTACK, SanitizerSet::MEMORY),
|
||||
(SanitizerSet::SAFESTACK, SanitizerSet::THREAD),
|
||||
(SanitizerSet::SAFESTACK, SanitizerSet::HWADDRESS),
|
||||
(SanitizerSet::SAFESTACK, SanitizerSet::KERNELADDRESS),
|
||||
];
|
||||
|
||||
/// Return sanitizer's name
|
||||
///
|
||||
/// Returns none if the flags is a set of sanitizers numbering not exactly one.
|
||||
|
@ -1336,6 +1362,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