Teach BugReporter to "escape" the occurance of '%' characters in diagnostic messages when emitted results to the standard Diagnostics output. Fixes PR 6033.

llvm-svn: 93507
This commit is contained in:
Ted Kremenek 2010-01-15 07:56:51 +00:00
parent 959990b840
commit d74cc397c8
2 changed files with 27 additions and 2 deletions

View File

@ -1818,8 +1818,23 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) {
R->getRanges(Beg, End); R->getRanges(Beg, End);
Diagnostic& Diag = getDiagnostic(); Diagnostic& Diag = getDiagnostic();
FullSourceLoc L(R->getLocation(), getSourceManager()); FullSourceLoc L(R->getLocation(), getSourceManager());
unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
R->getShortDescription()); // Search the description for '%', as that will be interpretted as a
// format character by FormatDiagnostics.
llvm::StringRef desc = R->getShortDescription();
unsigned ErrorDiag;
{
llvm::SmallString<512> TmpStr;
llvm::raw_svector_ostream Out(TmpStr);
for (llvm::StringRef::iterator I=desc.begin(), E=desc.end(); I!=E; ++I)
if (*I == '%')
Out << "%%";
else
Out << *I;
Out.flush();
ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning, TmpStr);
}
switch (End-Beg) { switch (End-Beg) {
default: assert(0 && "Don't handle this many ranges yet!"); default: assert(0 && "Don't handle this many ranges yet!");

View File

@ -801,3 +801,13 @@ void test_bad_msg(TestBadArg *p) {
[p testBadArg:y]; // expected-warning{{Pass-by-value argument in message expression is undefined}} [p testBadArg:y]; // expected-warning{{Pass-by-value argument in message expression is undefined}}
} }
//===----------------------------------------------------------------------===//
// PR 6033 - Test emitting the correct output in a warning where we use '%'
// with operands that are undefined.
//===----------------------------------------------------------------------===//
int pr6033(int x) {
int y;
return x % y; // expected-warning{{The right operand of '%' is a garbage value}}
}