From: Petr Hosek Date: Wed, 7 Mar 2018 01:27:03 +0000 (+0000) Subject: [Driver] Automatically disable incompatible default sanitizers X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=548039d002dad963a7a67e80e03752447d57eec6;p=clang [Driver] Automatically disable incompatible default sanitizers When a sanitizer incompatible with one of the default sanitizers is explicitly enabled, automatically disable all the conflicting default sanitizers. Differential Revision: https://reviews.llvm.org/D44064 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326860 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/SanitizerArgs.cpp b/lib/Driver/SanitizerArgs.cpp index 06e04b17ba..0f00f67858 100644 --- a/lib/Driver/SanitizerArgs.cpp +++ b/lib/Driver/SanitizerArgs.cpp @@ -332,8 +332,30 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, } } + std::pair IncompatibleGroups[] = { + std::make_pair(Address, Thread | Memory), + std::make_pair(Thread, Memory), + std::make_pair(Leak, Thread | Memory), + std::make_pair(KernelAddress, Address | Leak | Thread | Memory), + std::make_pair(HWAddress, Address | Thread | Memory | KernelAddress), + std::make_pair(Efficiency, Address | HWAddress | Leak | Thread | Memory | + KernelAddress), + std::make_pair(Scudo, Address | HWAddress | Leak | Thread | Memory | + KernelAddress | Efficiency), + std::make_pair(SafeStack, Address | HWAddress | Leak | Thread | Memory | + KernelAddress | Efficiency)}; + // Enable toolchain specific default sanitizers if not explicitly disabled. - Kinds |= TC.getDefaultSanitizers() & ~AllRemove; + SanitizerMask Default = TC.getDefaultSanitizers() & ~AllRemove; + + // Disable default sanitizers that are incompatible with the default ones. + for (auto G : IncompatibleGroups) { + SanitizerMask Group = G.first; + if ((Default & Group) && (Kinds & G.second)) + Default &= ~Group; + } + + Kinds |= Default; // We disable the vptr sanitizer if it was enabled by group expansion but RTTI // is disabled. @@ -369,18 +391,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, } // Warn about incompatible groups of sanitizers. - std::pair IncompatibleGroups[] = { - std::make_pair(Address, Thread | Memory), - std::make_pair(Thread, Memory), - std::make_pair(Leak, Thread | Memory), - std::make_pair(KernelAddress, Address | Leak | Thread | Memory), - std::make_pair(HWAddress, Address | Thread | Memory | KernelAddress), - std::make_pair(Efficiency, Address | HWAddress | Leak | Thread | Memory | - KernelAddress), - std::make_pair(Scudo, Address | HWAddress | Leak | Thread | Memory | - KernelAddress | Efficiency), - std::make_pair(SafeStack, Address | HWAddress | Leak | Thread | Memory | - KernelAddress | Efficiency)}; for (auto G : IncompatibleGroups) { SanitizerMask Group = G.first; if (Kinds & Group) {