forked from OSchip/llvm-project
[asan] Add gcc 8's driver option -fsanitize=pointer-compare and -fsanitize=pointer-substract.
Disabled by default as this is still an experimental feature. Reviewed By: thakis Differential Revision: https://reviews.llvm.org/D59221 llvm-svn: 358285
This commit is contained in:
parent
ce0a88a5e1
commit
1e39fc1faa
|
@ -40,6 +40,12 @@
|
|||
// AddressSanitizer
|
||||
SANITIZER("address", Address)
|
||||
|
||||
// Requires AddressSanitizer
|
||||
SANITIZER("pointer-compare", PointerCompare)
|
||||
|
||||
// Requires AddressSanitizer
|
||||
SANITIZER("pointer-subtract", PointerSubtract)
|
||||
|
||||
// Kernel AddressSanitizer (KASan)
|
||||
SANITIZER("kernel-address", KernelAddress)
|
||||
|
||||
|
|
|
@ -38,6 +38,8 @@ class SanitizerArgs {
|
|||
bool AsanPoisonCustomArrayCookie = false;
|
||||
bool AsanGlobalsDeadStripping = false;
|
||||
bool AsanUseOdrIndicator = false;
|
||||
bool AsanInvalidPointerCmp = false;
|
||||
bool AsanInvalidPointerSub = false;
|
||||
std::string HwasanAbi;
|
||||
bool LinkCXXRuntimes = false;
|
||||
bool NeedPIE = false;
|
||||
|
|
|
@ -775,8 +775,27 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
|
|||
Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
|
||||
options::OPT_fno_sanitize_address_use_odr_indicator,
|
||||
AsanUseOdrIndicator);
|
||||
|
||||
if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
|
||||
AsanInvalidPointerCmp = true;
|
||||
}
|
||||
|
||||
if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
|
||||
AsanInvalidPointerSub = true;
|
||||
}
|
||||
|
||||
} else {
|
||||
AsanUseAfterScope = false;
|
||||
// -fsanitize=pointer-compare/pointer-subtract requires -fsanitize=address.
|
||||
SanitizerMask DetectInvalidPointerPairs =
|
||||
SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
|
||||
if (AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) {
|
||||
TC.getDriver().Diag(clang::diag::err_drv_argument_only_allowed_with)
|
||||
<< lastArgumentForMask(D, Args,
|
||||
SanitizerKind::PointerCompare |
|
||||
SanitizerKind::PointerSubtract)
|
||||
<< "-fsanitize=address";
|
||||
}
|
||||
}
|
||||
|
||||
if (AllAddedKinds & SanitizerKind::HWAddress) {
|
||||
|
@ -963,6 +982,16 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
|
|||
if (AsanUseOdrIndicator)
|
||||
CmdArgs.push_back("-fsanitize-address-use-odr-indicator");
|
||||
|
||||
if (AsanInvalidPointerCmp) {
|
||||
CmdArgs.push_back("-mllvm");
|
||||
CmdArgs.push_back("-asan-detect-invalid-pointer-cmp");
|
||||
}
|
||||
|
||||
if (AsanInvalidPointerSub) {
|
||||
CmdArgs.push_back("-mllvm");
|
||||
CmdArgs.push_back("-asan-detect-invalid-pointer-sub");
|
||||
}
|
||||
|
||||
if (!HwasanAbi.empty()) {
|
||||
CmdArgs.push_back("-default-function-attr");
|
||||
CmdArgs.push_back(Args.MakeArgString("hwasan-abi=" + HwasanAbi));
|
||||
|
|
|
@ -277,6 +277,8 @@ AddCXXStdlibLibArgs(const llvm::opt::ArgList &DriverArgs,
|
|||
clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers() const {
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
return Res;
|
||||
}
|
||||
|
||||
|
|
|
@ -2375,6 +2375,8 @@ SanitizerMask Darwin::getSupportedSanitizers() const {
|
|||
const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Leak;
|
||||
Res |= SanitizerKind::Fuzzer;
|
||||
Res |= SanitizerKind::FuzzerNoLink;
|
||||
|
|
|
@ -410,6 +410,8 @@ SanitizerMask FreeBSD::getSupportedSanitizers() const {
|
|||
const bool IsMIPS64 = getTriple().isMIPS64();
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Vptr;
|
||||
if (IsX86_64 || IsMIPS64) {
|
||||
Res |= SanitizerKind::Leak;
|
||||
|
|
|
@ -283,6 +283,8 @@ void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args,
|
|||
SanitizerMask Fuchsia::getSupportedSanitizers() const {
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Fuzzer;
|
||||
Res |= SanitizerKind::FuzzerNoLink;
|
||||
Res |= SanitizerKind::SafeStack;
|
||||
|
|
|
@ -1003,6 +1003,8 @@ SanitizerMask Linux::getSupportedSanitizers() const {
|
|||
getTriple().getArch() == llvm::Triple::thumbeb;
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Fuzzer;
|
||||
Res |= SanitizerKind::FuzzerNoLink;
|
||||
Res |= SanitizerKind::KernelAddress;
|
||||
|
|
|
@ -1317,6 +1317,8 @@ MSVCToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
|
|||
SanitizerMask MSVCToolChain::getSupportedSanitizers() const {
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Fuzzer;
|
||||
Res |= SanitizerKind::FuzzerNoLink;
|
||||
Res &= ~SanitizerKind::CFIMFCall;
|
||||
|
|
|
@ -459,6 +459,8 @@ toolchains::MinGW::GetExceptionModel(const ArgList &Args) const {
|
|||
SanitizerMask toolchains::MinGW::getSupportedSanitizers() const {
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
return Res;
|
||||
}
|
||||
|
||||
|
|
|
@ -463,6 +463,8 @@ SanitizerMask NetBSD::getSupportedSanitizers() const {
|
|||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
if (IsX86 || IsX86_64) {
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Function;
|
||||
Res |= SanitizerKind::Leak;
|
||||
Res |= SanitizerKind::SafeStack;
|
||||
|
|
|
@ -425,6 +425,8 @@ bool toolchains::PS4CPU::HasNativeLLVMSupport() const { return true; }
|
|||
SanitizerMask toolchains::PS4CPU::getSupportedSanitizers() const {
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
Res |= SanitizerKind::Vptr;
|
||||
return Res;
|
||||
}
|
||||
|
|
|
@ -199,6 +199,8 @@ SanitizerMask Solaris::getSupportedSanitizers() const {
|
|||
// FIXME: Omit X86_64 until 64-bit support is figured out.
|
||||
if (IsX86) {
|
||||
Res |= SanitizerKind::Address;
|
||||
Res |= SanitizerKind::PointerCompare;
|
||||
Res |= SanitizerKind::PointerSubtract;
|
||||
}
|
||||
Res |= SanitizerKind::Vptr;
|
||||
return Res;
|
||||
|
|
|
@ -829,3 +829,14 @@
|
|||
// CHECK-HWASAN-INTERCEPTOR-ABI: "-default-function-attr" "hwasan-abi=interceptor"
|
||||
// CHECK-HWASAN-PLATFORM-ABI: "-default-function-attr" "hwasan-abi=platform"
|
||||
// CHECK-HWASAN-FOO-ABI: error: invalid value 'foo' in '-fsanitize-hwaddress-abi=foo'
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address,pointer-compare,pointer-subtract %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-POINTER-ALL
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=pointer-compare %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-POINTER-CMP-NEEDS-ADDRESS
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=pointer-subtract %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-POINTER-SUB-NEEDS-ADDRESS
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=pointer-subtract -fno-sanitize=pointer-subtract %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-POINTER-SUB
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=pointer-compare -fno-sanitize=pointer-compare %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-POINTER-CMP
|
||||
// CHECK-POINTER-ALL: -cc1{{.*}}-fsanitize={{[^"]*}}pointer-compare,pointer-subtract{{.*}}" {{.*}} "-mllvm" "-asan-detect-invalid-pointer-cmp" {{.*}}"-mllvm" "-asan-detect-invalid-pointer-sub"
|
||||
// CHECK-POINTER-CMP-NEEDS-ADDRESS: error: invalid argument '-fsanitize=pointer-compare' only allowed with '-fsanitize=address'
|
||||
// CHECK-POINTER-SUB-NEEDS-ADDRESS: error: invalid argument '-fsanitize=pointer-subtract' only allowed with '-fsanitize=address'
|
||||
// CHECK-NO-POINTER-SUB-NOT: {{.*}}asan-detect-invalid-pointer{{.*}}
|
||||
// CHECK-NO-POINTER-CMP-NOT: {{.*}}asan-detect-invalid-pointer{{.*}}
|
||||
|
|
Loading…
Reference in New Issue