]> granicus.if.org Git - clang/commitdiff
When the diagnostic text is simply "%0", sanitize the string for any
authorRichard Trieu <rtrieu@google.com>
Thu, 8 Jan 2015 01:27:03 +0000 (01:27 +0000)
committerRichard Trieu <rtrieu@google.com>
Thu, 8 Jan 2015 01:27:03 +0000 (01:27 +0000)
unprintable characters.  Fixes PR22048.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225423 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Diagnostic.cpp
test/Misc/diag-special-chars.c [new file with mode: 0644]

index a8929466084d637211bc3f65a784d7cb348f4fc7..83228ad3c55d90e8c2026402fa347c347e6572db 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/CrashRecoveryContext.h"
+#include "llvm/Support/Locale.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace clang;
@@ -629,6 +630,20 @@ void Diagnostic::
 FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
                  SmallVectorImpl<char> &OutStr) const {
 
+  // When the diagnostic string is only "%0", the entire string is being given
+  // by an outside source.  Remove unprintable characters from this string
+  // and skip all the other string processing.
+  if (DiagEnd - DiagStr == 2 && DiagStr[0] == '%' && DiagStr[1] == '0' &&
+      getArgKind(0) == DiagnosticsEngine::ak_std_string) {
+    const std::string &S = getArgStdStr(0);
+    for (char c : S) {
+      if (llvm::sys::locale::isPrint(c) || c == '\t') {
+        OutStr.push_back(c);
+      }
+    }
+    return;
+  }
+
   /// FormattedArgs - Keep track of all of the arguments formatted by
   /// ConvertArgToString and pass them into subsequent calls to
   /// ConvertArgToString, allowing the implementation to avoid redundancies in
diff --git a/test/Misc/diag-special-chars.c b/test/Misc/diag-special-chars.c
new file mode 100644 (file)
index 0000000..007f9d0
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 %s -verify
+// RUN: not %clang_cc1 %s 2>&1 | FileCheck %s
+
+// There are two special characters on the following line, one which is used
+// as a marker character for diagnostic printing.  Ensure diagnostics involving
+// these characters do not cause problems with the diagnostic printer.
+#error Hi \7f \80 Bye
+//expected-error@-1 {{Hi   Bye}}
+
+// CHECK: error: Hi   Bye
+// CHECK: #error Hi <U+007F> <U+0080> Bye