|
@@ -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));
|