[llvm] 537cbd9 - Escape command line arguments in backtraces

Luke Drummond via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 17 04:16:40 PST 2020


Author: Luke Drummond
Date: 2020-11-17T12:16:13Z
New Revision: 537cbd90c43dd9b166fa8f03347b1397505140e5

URL: https://github.com/llvm/llvm-project/commit/537cbd90c43dd9b166fa8f03347b1397505140e5
DIFF: https://github.com/llvm/llvm-project/commit/537cbd90c43dd9b166fa8f03347b1397505140e5.diff

LOG: Escape command line arguments in backtraces

A common routine is to have the compiler crash, and attempt to rerun the
cc1 command-line by copying and pasting the arguments printed by
`llvm::Support::PrettyStackProgram::print`. However, these arguments are
not quoted or escaped which means they must be manually edited before
working correctly. This patch ensures that shell-unfriendly characters
are C-escaped, and arguments with spaces are double-quoted reducing the
frustration of running cc1 inside a debugger.

As the quoting is C, this is "best effort for most shells", but should
be fine for at least bash, zsh, csh, and cmd.exe.

Reviewed by: jhenderson

Differential Revision: https://reviews.llvm.org/D90759

Added: 
    

Modified: 
    llvm/lib/Support/PrettyStackTrace.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/PrettyStackTrace.cpp b/llvm/lib/Support/PrettyStackTrace.cpp
index 9072f9d2d2ee..5d3d95b5e7cb 100644
--- a/llvm/lib/Support/PrettyStackTrace.cpp
+++ b/llvm/lib/Support/PrettyStackTrace.cpp
@@ -25,6 +25,7 @@
 #include <cassert>
 #include <cstdarg>
 #include <cstdio>
+#include <cstring>
 #include <tuple>
 
 #ifdef HAVE_CRASHREPORTERCLIENT_H
@@ -253,8 +254,16 @@ void PrettyStackTraceFormat::print(raw_ostream &OS) const { OS << Str << "\n"; }
 void PrettyStackTraceProgram::print(raw_ostream &OS) const {
   OS << "Program arguments: ";
   // Print the argument list.
-  for (unsigned i = 0, e = ArgC; i != e; ++i)
-    OS << ArgV[i] << ' ';
+  for (int I = 0; I < ArgC; ++I) {
+    const bool HaveSpace = ::strchr(ArgV[I], ' ');
+    if (I)
+      OS << ' ';
+    if (HaveSpace)
+      OS << '"';
+    OS.write_escaped(ArgV[I]);
+    if (HaveSpace)
+      OS << '"';
+  }
   OS << '\n';
 }
 


        


More information about the llvm-commits mailing list