[asan] Optionally print reproducer cmdline in ASan reports.

Differential Revision: http://reviews.llvm.org/D16070

llvm-svn: 258037
This commit is contained in:
Maxim Ostapenko 2016-01-18 07:55:12 +00:00
parent 42a13308a1
commit 1965cc6258
8 changed files with 50 additions and 1 deletions

View File

@ -687,6 +687,9 @@ class ScopedInErrorReport {
if (flags()->print_stats)
__asan_print_accumulated_stats();
if (common_flags()->print_cmdline)
PrintCmdline();
// Copy the message buffer so that we could start logging without holding a
// lock that gets aquired during printing.
InternalScopedBuffer<char> buffer_copy(kErrorMessageBufferSize);

View File

@ -487,6 +487,15 @@ uptr ReadBinaryNameCached(/*out*/char *buf, uptr buf_len) {
return name_len;
}
void PrintCmdline() {
char **argv = GetArgv();
if (!argv) return;
Printf("\nCommand: ");
for (uptr i = 0; argv[i]; ++i)
Printf("%s ", argv[i]);
Printf("\n\n");
}
} // namespace __sanitizer
using namespace __sanitizer; // NOLINT

View File

@ -282,6 +282,8 @@ bool IsAbsolutePath(const char *path);
u32 GetUid();
void ReExec();
char **GetArgv();
void PrintCmdline();
bool StackSizeIsUnlimited();
void SetStackSizeLimitInBytes(uptr limit);
bool AddressSpaceIsUnlimited();

View File

@ -200,3 +200,5 @@ COMMON_FLAG(
COMMON_FLAG(bool, suppress_equal_pcs, true,
"Deduplicate multiple reports for single source location in "
"halt_on_error=false mode (asan only).")
COMMON_FLAG(bool, print_cmdline, false, "Print command line on crash "
"(asan only).")

View File

@ -424,7 +424,7 @@ static void ReadNullSepFileToArray(const char *path, char ***arr,
}
#endif
static void GetArgsAndEnv(char*** argv, char*** envp) {
static void GetArgsAndEnv(char ***argv, char ***envp) {
#if !SANITIZER_GO
if (&__libc_stack_end) {
#endif
@ -441,6 +441,12 @@ static void GetArgsAndEnv(char*** argv, char*** envp) {
#endif
}
char **GetArgv() {
char **argv, **envp;
GetArgsAndEnv(&argv, &envp);
return argv;
}
void ReExec() {
char **argv, **envp;
GetArgsAndEnv(&argv, &envp);

View File

@ -666,6 +666,10 @@ void MaybeReexec() {
LeakyResetEnv(kDyldInsertLibraries, new_env);
}
char **GetArgv() {
return *_NSGetArgv();
}
} // namespace __sanitizer
#endif // SANITIZER_MAC

View File

@ -770,6 +770,11 @@ void MaybeReexec() {
// No need to re-exec on Windows.
}
char **GetArgv() {
// FIXME: Actually implement this function.
return 0;
}
} // namespace __sanitizer
#endif // _WIN32

View File

@ -0,0 +1,18 @@
// Check that ASan can print reproducer cmdline for failed binary if desired.
//
// RUN: %clang_asan %s -o %t-exe
//
// RUN: env not %run %t-exe 2>&1 | FileCheck %s
// RUN: %env_asan_opts=print_cmdline=false not %run %t-exe 2>&1 | FileCheck %s
// RUN: %env_asan_opts=print_cmdline=true not %run %t-exe first second/third [fourth] 2>&1 | FileCheck %s --check-prefix CHECK-PRINT
volatile int ten = 10;
int main() {
char x[10];
// CHECK-NOT: Command:
// CHECK-PRINT: {{Command: .*-exe first second/third \[fourth\]}}
x[ten] = 1; // BOOM
return 0;
}