forked from OSchip/llvm-project
Add experimental clang/driver flag -fsanitize-address-field-padding=N
Summary: This change adds an experimental flag -fsanitize-address-field-padding=N (0, 1, 2) to clang and driver. With this flag ASAN will be able to detect some cases of intra-object-overflow bugs, see https://code.google.com/p/address-sanitizer/wiki/IntraObjectOverflow There is no actual functionality here yet, just the flag parsing. The functionality is being reviewed at http://reviews.llvm.org/D5687 Test Plan: Build and run SPEC, LLVM Bootstrap, Chrome with this flag. Reviewers: samsonov Reviewed By: samsonov Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D5676 llvm-svn: 219417
This commit is contained in:
parent
cb34fd09cd
commit
aed71a89bc
|
@ -26,6 +26,9 @@ namespace clang {
|
|||
struct SanitizerOptions {
|
||||
#define SANITIZER(NAME, ID) unsigned ID : 1;
|
||||
#include "clang/Basic/Sanitizers.def"
|
||||
/// \brief Controls how agressive is asan field padding (0: none, 1: least
|
||||
/// aggressive, 2: more aggressive).
|
||||
unsigned SanitizeAddressFieldPadding : 2;
|
||||
|
||||
/// \brief Cached set of sanitizer options with all sanitizers disabled.
|
||||
static const SanitizerOptions Disabled;
|
||||
|
|
|
@ -526,6 +526,9 @@ def fsanitize_memory_track_origins : Flag<["-"], "fsanitize-memory-track-origins
|
|||
def fno_sanitize_memory_track_origins : Flag<["-"], "fno-sanitize-memory-track-origins">,
|
||||
Group<f_clang_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Disable origins tracking in MemorySanitizer">;
|
||||
def fsanitize_address_field_padding : Joined<["-"], "fsanitize-address-field-padding=">,
|
||||
Group<f_clang_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Level of field padding for AddressSanitizer">;
|
||||
def fsanitize_recover : Flag<["-"], "fsanitize-recover">,
|
||||
Group<f_clang_Group>;
|
||||
def fno_sanitize_recover : Flag<["-"], "fno-sanitize-recover">,
|
||||
|
|
|
@ -49,6 +49,7 @@ class SanitizerArgs {
|
|||
|
||||
std::string BlacklistFile;
|
||||
int MsanTrackOrigins;
|
||||
int AsanFieldPadding;
|
||||
bool AsanZeroBaseShadow;
|
||||
bool UbsanTrapOnError;
|
||||
bool AsanSharedRuntime;
|
||||
|
|
|
@ -25,6 +25,7 @@ void SanitizerArgs::clear() {
|
|||
Kind = 0;
|
||||
BlacklistFile = "";
|
||||
MsanTrackOrigins = 0;
|
||||
AsanFieldPadding = 0;
|
||||
AsanZeroBaseShadow = false;
|
||||
UbsanTrapOnError = false;
|
||||
AsanSharedRuntime = false;
|
||||
|
@ -164,6 +165,15 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
|
|||
(TC.getTriple().getEnvironment() == llvm::Triple::Android);
|
||||
AsanZeroBaseShadow =
|
||||
(TC.getTriple().getEnvironment() == llvm::Triple::Android);
|
||||
if (Arg *A =
|
||||
Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
|
||||
StringRef S = A->getValue();
|
||||
// Legal values are 0 and 1, 2, but in future we may add more levels.
|
||||
if (S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
|
||||
AsanFieldPadding > 2) {
|
||||
D.Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Parse -link-cxx-sanitizer flag.
|
||||
|
@ -191,7 +201,9 @@ void SanitizerArgs::addArgs(const llvm::opt::ArgList &Args,
|
|||
if (MsanTrackOrigins)
|
||||
CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins=" +
|
||||
llvm::utostr(MsanTrackOrigins)));
|
||||
|
||||
if (AsanFieldPadding)
|
||||
CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" +
|
||||
llvm::utostr(AsanFieldPadding)));
|
||||
// Workaround for PR16386.
|
||||
if (needsMsanRt())
|
||||
CmdArgs.push_back(Args.MakeArgString("-fno-assume-sane-operator-new"));
|
||||
|
|
|
@ -1628,6 +1628,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
|||
break;
|
||||
}
|
||||
}
|
||||
// -fsanitize-address-field-padding=N has to be a LangOpt, parse it here.
|
||||
Opts.Sanitize.SanitizeAddressFieldPadding =
|
||||
getLastArgIntValue(Args, OPT_fsanitize_address_field_padding, 0, Diags);
|
||||
}
|
||||
|
||||
static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
|
||||
|
|
|
@ -80,6 +80,17 @@
|
|||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory -fsanitize-memory-track-origins=3 -pie %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TRACK-ORIGINS-3
|
||||
// CHECK-TRACK-ORIGINS-3: error: invalid value '3' in '-fsanitize-memory-track-origins=3'
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-field-padding=0 %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-FIELD-PADDING-0
|
||||
// CHECK-ASAN-FIELD-PADDING-0-NOT: -fsanitize-address-field-padding
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-field-padding=1 %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-FIELD-PADDING-1
|
||||
// CHECK-ASAN-FIELD-PADDING-1: -fsanitize-address-field-padding=1
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-field-padding=2 %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-FIELD-PADDING-2
|
||||
// CHECK-ASAN-FIELD-PADDING-2: -fsanitize-address-field-padding=2
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-address-field-padding=3 %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-FIELD-PADDING-3
|
||||
// CHECK-ASAN-FIELD-PADDING-3: error: invalid value '3' in '-fsanitize-address-field-padding=3'
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize-address-field-padding=2 %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-FIELD-PADDING-NO-ASAN
|
||||
// CHECK-ASAN-FIELD-PADDING-NO-ASAN: warning: argument unused during compilation: '-fsanitize-address-field-padding=2'
|
||||
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=vptr -fno-sanitize=vptr -fsanitize=undefined,address %s -### 2>&1
|
||||
// OK
|
||||
|
||||
|
|
Loading…
Reference in New Issue