When the diagnostic text is simply "%0", sanitize the string for any

unprintable characters.  Fixes PR22048.

llvm-svn: 225423
This commit is contained in:
Richard Trieu 2015-01-08 01:27:03 +00:00
parent a799e2e014
commit b3b8bb0029
2 changed files with 26 additions and 0 deletions

View 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

View File

@ -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  € Bye
//expected-error@-1 {{Hi Bye}}
// CHECK: error: Hi Bye
// CHECK: #error Hi <U+007F> <U+0080> Bye