forked from OSchip/llvm-project
Add an experimental flag -fsanitize-memory-use-after-dtor.
This flag will enable detection of use-after-destructor (but before memory deallocation) bugs. No actual functionality yet. https://code.google.com/p/address-sanitizer/issues/detail?id=73 Patch by Naomi Musgrave. llvm-svn: 241935
This commit is contained in:
parent
959e0542b8
commit
45be9e0d24
|
@ -559,6 +559,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_memory_use_after_dtor : Flag<["-"], "fsanitize-memory-use-after-dtor">,
|
||||
Group<f_clang_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Enable use-after-destroy detection 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">;
|
||||
|
|
|
@ -29,6 +29,7 @@ class SanitizerArgs {
|
|||
std::vector<std::string> BlacklistFiles;
|
||||
int CoverageFeatures;
|
||||
int MsanTrackOrigins;
|
||||
bool MsanUseAfterDtor;
|
||||
int AsanFieldPadding;
|
||||
bool AsanZeroBaseShadow;
|
||||
bool AsanSharedRuntime;
|
||||
|
|
|
@ -112,6 +112,8 @@ CODEGENOPT(SanitizeAddressZeroBaseShadow , 1, 0) ///< Map shadow memory at zero
|
|||
///< offset in AddressSanitizer.
|
||||
CODEGENOPT(SanitizeMemoryTrackOrigins, 2, 0) ///< Enable tracking origins in
|
||||
///< MemorySanitizer
|
||||
CODEGENOPT(SanitizeMemoryUseAfterDtor, 1, 0) ///< Enable use-after-delete detection
|
||||
///< in MemorySanitizer
|
||||
CODEGENOPT(SanitizeCoverageType, 2, 0) ///< Type of sanitizer coverage
|
||||
///< instrumentation.
|
||||
CODEGENOPT(SanitizeCoverageIndirectCalls, 1, 0) ///< Enable sanitizer coverage
|
||||
|
|
|
@ -176,6 +176,7 @@ void SanitizerArgs::clear() {
|
|||
BlacklistFiles.clear();
|
||||
CoverageFeatures = 0;
|
||||
MsanTrackOrigins = 0;
|
||||
MsanUseAfterDtor = false;
|
||||
AsanFieldPadding = 0;
|
||||
AsanZeroBaseShadow = false;
|
||||
AsanSharedRuntime = false;
|
||||
|
@ -417,6 +418,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
|
|||
}
|
||||
}
|
||||
}
|
||||
MsanUseAfterDtor =
|
||||
Args.hasArg(options::OPT_fsanitize_memory_use_after_dtor);
|
||||
}
|
||||
|
||||
// Parse -f(no-)?sanitize-coverage flags if coverage is supported by the
|
||||
|
@ -562,6 +565,10 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
|
|||
if (MsanTrackOrigins)
|
||||
CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins=" +
|
||||
llvm::utostr(MsanTrackOrigins)));
|
||||
|
||||
if (MsanUseAfterDtor)
|
||||
CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-use-after-dtor"));
|
||||
|
||||
if (AsanFieldPadding)
|
||||
CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" +
|
||||
llvm::utostr(AsanFieldPadding)));
|
||||
|
|
|
@ -557,6 +557,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Args.hasArg(OPT_fsanitize_coverage_8bit_counters);
|
||||
Opts.SanitizeMemoryTrackOrigins =
|
||||
getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags);
|
||||
Opts.SanitizeMemoryUseAfterDtor =
|
||||
Args.hasArg(OPT_fsanitize_memory_use_after_dtor);
|
||||
Opts.SSPBufferSize =
|
||||
getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags);
|
||||
Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
|
||||
|
|
|
@ -122,6 +122,9 @@
|
|||
// 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=memory -fsanitize-memory-use-after-dtor -pie %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MSAN-USE-AFTER-DTOR
|
||||
// CHECK-MSAN-USE-AFTER-DTOR: -cc1{{.*}}-fsanitize-memory-use-after-dtor
|
||||
|
||||
// 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
|
||||
|
|
Loading…
Reference in New Issue