mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:06:44 +00:00
[asan] Optionally print reproducer cmdline in ASan reports.
Differential Revision: http://reviews.llvm.org/D16070 llvm-svn: 258037
This commit is contained in:
parent
42a13308a1
commit
1965cc6258
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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).")
|
||||
|
@ -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);
|
||||
|
@ -666,6 +666,10 @@ void MaybeReexec() {
|
||||
LeakyResetEnv(kDyldInsertLibraries, new_env);
|
||||
}
|
||||
|
||||
char **GetArgv() {
|
||||
return *_NSGetArgv();
|
||||
}
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
||||
#endif // SANITIZER_MAC
|
||||
|
@ -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
|
||||
|
18
compiler-rt/test/asan/TestCases/Posix/print_cmdline.cc
Normal file
18
compiler-rt/test/asan/TestCases/Posix/print_cmdline.cc
Normal 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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user