<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 7, 2015 at 5:27 PM, Richard Trieu <span dir="ltr"><<a href="mailto:rtrieu@google.com" target="_blank">rtrieu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rtrieu<br>
Date: Wed Jan  7 19:27:03 2015<br>
New Revision: 225423<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225423&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=225423&view=rev</a><br>
Log:<br>
When the diagnostic text is simply "%0", sanitize the string for any<br>
unprintable characters.  Fixes PR22048.<br>
<br>
Added:<br>
    cfe/trunk/test/Misc/diag-special-chars.c<br>
Modified:<br>
    cfe/trunk/lib/Basic/Diagnostic.cpp<br>
<br>
Modified: cfe/trunk/lib/Basic/Diagnostic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=225423&r1=225422&r2=225423&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=225423&r1=225422&r2=225423&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/Diagnostic.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Diagnostic.cpp Wed Jan  7 19:27:03 2015<br>
@@ -19,6 +19,7 @@<br>
 #include "llvm/ADT/SmallString.h"<br>
 #include "llvm/ADT/StringExtras.h"<br>
 #include "llvm/Support/CrashRecoveryContext.h"<br>
+#include "llvm/Support/Locale.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
<br>
 using namespace clang;<br>
@@ -629,6 +630,20 @@ void Diagnostic::<br>
 FormatDiagnostic(const char *DiagStr, const char *DiagEnd,<br>
                  SmallVectorImpl<char> &OutStr) const {<br>
<br>
+  // When the diagnostic string is only "%0", the entire string is being given<br>
+  // by an outside source.  Remove unprintable characters from this string<br>
+  // and skip all the other string processing.<br>
+  if (DiagEnd - DiagStr == 2 && DiagStr[0] == '%' && DiagStr[1] == '0' &&<br></blockquote><div><br></div><div>Might be nicer as StringRef(DiagStr, DiagEnd - DiagStr).equals("%0")</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      getArgKind(0) == DiagnosticsEngine::ak_std_string) {<br>
+    const std::string &S = getArgStdStr(0);<br>
+    for (char c : S) {<br>
+      if (llvm::sys::locale::isPrint(c) || c == '\t') {<br>
+        OutStr.push_back(c);<br>
+      }<br>
+    }<br>
+    return;<br>
+  }<br>
+<br>
   /// FormattedArgs - Keep track of all of the arguments formatted by<br>
   /// ConvertArgToString and pass them into subsequent calls to<br>
   /// ConvertArgToString, allowing the implementation to avoid redundancies in<br>
<br>
Added: cfe/trunk/test/Misc/diag-special-chars.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/diag-special-chars.c?rev=225423&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/diag-special-chars.c?rev=225423&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Misc/diag-special-chars.c (added)<br>
+++ cfe/trunk/test/Misc/diag-special-chars.c Wed Jan  7 19:27:03 2015<br>
@@ -0,0 +1,11 @@<br>
+// RUN: %clang_cc1 %s -verify<br>
+// RUN: not %clang_cc1 %s 2>&1 | FileCheck %s<br>
+<br>
+// There are two special characters on the following line, one which is used<br>
+// as a marker character for diagnostic printing.  Ensure diagnostics involving<br>
+// these characters do not cause problems with the diagnostic printer.<br>
+#error Hi   Â€ Bye<br>
+//expected-error@-1 {{Hi   Bye}}<br>
+<br>
+// CHECK: error: Hi   Bye<br>
+// CHECK: #error Hi <U+007F> <U+0080> Bye<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>