[PATCH] D16070: [asan] Optionally print reproducer cmdline in ASan reports.
Maxim Ostapenko via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 11 09:57:40 PST 2016
m.ostapenko removed rL LLVM as the repository for this revision.
m.ostapenko updated this revision to Diff 44523.
m.ostapenko added a comment.
Updating according to Yura's nits.
http://reviews.llvm.org/D16070
Files:
lib/asan/asan_flags.inc
lib/asan/asan_report.cc
lib/sanitizer_common/sanitizer_common.h
lib/sanitizer_common/sanitizer_linux.cc
test/asan/TestCases/Posix/print_cmdline.cc
Index: test/asan/TestCases/Posix/print_cmdline.cc
===================================================================
--- /dev/null
+++ test/asan/TestCases/Posix/print_cmdline.cc
@@ -0,0 +1,19 @@
+// 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 --check-prefix CHECK-DONT-PRINT
+// 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: Reproducer cmdline:
+ // CHECK-DONT-PRINT-NOT: Reproducer cmdline:
+ // CHECK-PRINT: {{Reproducer cmdline: .*-exe first second/third \[fourth\]}}
+ x[ten] = 1; // BOOM
+ return 0;
+}
+
Index: lib/sanitizer_common/sanitizer_linux.cc
===================================================================
--- lib/sanitizer_common/sanitizer_linux.cc
+++ lib/sanitizer_common/sanitizer_linux.cc
@@ -424,7 +424,7 @@
}
#endif
-static void GetArgsAndEnv(char*** argv, char*** envp) {
+void GetArgsAndEnv(char ***argv, char ***envp) {
#if !SANITIZER_GO
if (&__libc_stack_end) {
#endif
Index: lib/sanitizer_common/sanitizer_common.h
===================================================================
--- lib/sanitizer_common/sanitizer_common.h
+++ lib/sanitizer_common/sanitizer_common.h
@@ -282,6 +282,7 @@
u32 GetUid();
void ReExec();
+void GetArgsAndEnv(char ***argv, char ***envp);
bool StackSizeIsUnlimited();
void SetStackSizeLimitInBytes(uptr limit);
bool AddressSpaceIsUnlimited();
Index: lib/asan/asan_report.cc
===================================================================
--- lib/asan/asan_report.cc
+++ lib/asan/asan_report.cc
@@ -238,6 +238,16 @@
DescribeThread(t->context());
}
+static void PrintReproducerCmdline() {
+ char **argv, **envp;
+ __sanitizer::GetArgsAndEnv(&argv, &envp);
+
+ Printf("\nReproducer cmdline: ");
+ for (uptr i = 0; argv[i] != 0; ++i)
+ Printf("%s ", argv[i]);
+ Printf("\n\n");
+}
+
// ---------------------- Address Descriptions ------------------- {{{1
static bool IsASCII(unsigned char c) {
@@ -687,6 +697,9 @@
if (flags()->print_stats)
__asan_print_accumulated_stats();
+ if (flags()->print_cmdline)
+ PrintReproducerCmdline();
+
// Copy the message buffer so that we could start logging without holding a
// lock that gets aquired during printing.
InternalScopedBuffer<char> buffer_copy(kErrorMessageBufferSize);
Index: lib/asan/asan_flags.inc
===================================================================
--- lib/asan/asan_flags.inc
+++ lib/asan/asan_flags.inc
@@ -135,3 +135,4 @@
ASAN_FLAG(bool, halt_on_error, true,
"Crash the program after printing the first error report "
"(WARNING: USE AT YOUR OWN RISK!)")
+ASAN_FLAG(bool, print_cmdline, false, "Print cmdline on crash.")
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16070.44523.patch
Type: text/x-patch
Size: 3014 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160111/bc4fb639/attachment.bin>
More information about the llvm-commits
mailing list