From c213b48206c55ca0eb1387cfa1651de504f147d1 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 15 Jan 2010 07:56:51 +0000 Subject: [PATCH] Teach BugReporter to "escape" the occurance of '%' characters in diagnostic messages when emitted results to the standard Diagnostics output. Fixes PR 6033. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93507 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/BugReporter.cpp | 19 +++++++++++++++++-- test/Analysis/misc-ps.m | 10 ++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 13b7f4510d..2a9531df60 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -1818,8 +1818,23 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) { R->getRanges(Beg, End); Diagnostic& Diag = getDiagnostic(); 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) { default: assert(0 && "Don't handle this many ranges yet!"); diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 149be03ac2..9543a98fe3 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -801,3 +801,13 @@ void test_bad_msg(TestBadArg *p) { [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}} +} + -- 2.50.1