[cfe-commits] r70415 - in /cfe/trunk: include/clang/Analysis/PathDiagnostic.h include/clang/Analysis/PathSensitive/BugReporter.h lib/Analysis/BugReporter.cpp lib/Analysis/GRExprEngineInternalChecks.cpp lib/Frontend/PlistDiagnostics.cpp
Ted Kremenek
kremenek at apple.com
Wed Apr 29 14:58:13 PDT 2009
Author: kremenek
Date: Wed Apr 29 16:58:13 2009
New Revision: 70415
URL: http://llvm.org/viewvc/llvm-project?rev=70415&view=rev
Log:
BugReporter/PathDiagnostics:
- Add an (optional) short description for BugReports for clients that want
to distinguish between long and short descriptions for bugs
- Make the bug report for VLA less obscene for Plist diagnostics by using
the short description
Modified:
cfe/trunk/include/clang/Analysis/PathDiagnostic.h
cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h
cfe/trunk/lib/Analysis/BugReporter.cpp
cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp
cfe/trunk/lib/Frontend/PlistDiagnostics.cpp
Modified: cfe/trunk/include/clang/Analysis/PathDiagnostic.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathDiagnostic.h?rev=70415&r1=70414&r2=70415&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathDiagnostic.h (original)
+++ cfe/trunk/include/clang/Analysis/PathDiagnostic.h Wed Apr 29 16:58:13 2009
@@ -50,6 +50,7 @@
virtual PathGenerationScheme getGenerationScheme() const { return Minimal; }
virtual bool supportsLogicalOpControlFlow() const { return false; }
virtual bool supportsAllBlockEdges() const { return false; }
+ virtual bool useVerboseDescription() const { return true; }
};
//===----------------------------------------------------------------------===//
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h?rev=70415&r1=70414&r2=70415&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h Wed Apr 29 16:58:13 2009
@@ -48,6 +48,7 @@
class BugReport {
protected:
BugType& BT;
+ std::string ShortDescription;
std::string Description;
const ExplodedNode<GRState> *EndNode;
SourceRange R;
@@ -70,6 +71,11 @@
BugReport(BugType& bt, const char* desc, const ExplodedNode<GRState> *n)
: BT(bt), Description(desc), EndNode(n) {}
+
+ BugReport(BugType& bt, const char* shortDesc, const char* desc,
+ const ExplodedNode<GRState> *n)
+ : BT(bt), ShortDescription(shortDesc), Description(desc), EndNode(n) {}
+
virtual ~BugReport();
@@ -84,6 +90,10 @@
Stmt* getStmt(BugReporter& BR) const;
const std::string& getDescription() const { return Description; }
+
+ const std::string& getShortDescription() const {
+ return ShortDescription.empty() ? Description : ShortDescription;
+ }
// FIXME: Is this needed?
virtual std::pair<const char**,const char**> getExtraDescriptiveText() {
@@ -197,6 +207,10 @@
RangedBugReport(BugType& D, const char* description, ExplodedNode<GRState> *n)
: BugReport(D, description, n) {}
+ RangedBugReport(BugType& D, const char *shortDescription,
+ const char *description, ExplodedNode<GRState> *n)
+ : BugReport(D, shortDescription, description, n) {}
+
~RangedBugReport();
// FIXME: Move this out of line.
Modified: cfe/trunk/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BugReporter.cpp?rev=70415&r1=70414&r2=70415&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BugReporter.cpp (original)
+++ cfe/trunk/lib/Analysis/BugReporter.cpp Wed Apr 29 16:58:13 2009
@@ -1667,14 +1667,18 @@
void BugReporter::FlushReport(BugReportEquivClass& EQ) {
assert(!EQ.Reports.empty());
BugReport &R = **EQ.begin();
+ PathDiagnosticClient* PD = getPathDiagnosticClient();
// FIXME: Make sure we use the 'R' for the path that was actually used.
// Probably doesn't make a difference in practice.
BugType& BT = R.getBugType();
- llvm::OwningPtr<PathDiagnostic> D(new PathDiagnostic(R.getBugType().getName(),
- R.getDescription(),
- BT.getCategory()));
+ llvm::OwningPtr<PathDiagnostic>
+ D(new PathDiagnostic(R.getBugType().getName(),
+ PD->useVerboseDescription()
+ ? R.getDescription() : R.getShortDescription(),
+ BT.getCategory()));
+
GeneratePathDiagnostic(*D.get(), EQ);
// Get the meta data.
@@ -1682,7 +1686,6 @@
for (const char** s = Meta.first; s != Meta.second; ++s) D->addMeta(*s);
// Emit a summary diagnostic to the regular Diagnostics engine.
- PathDiagnosticClient* PD = getPathDiagnosticClient();
const SourceRange *Beg = 0, *End = 0;
R.getRanges(*this, Beg, End);
Diagnostic& Diag = getDiagnostic();
Modified: cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp?rev=70415&r1=70414&r2=70415&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp Wed Apr 29 16:58:13 2009
@@ -405,12 +405,23 @@
"variable-length array (VLA) '"
<< VD->getNameAsString() << "' evaluates to ";
- if (Eng.getStateManager().GetSVal(N->getState(), SizeExpr).isUndef())
+ bool isUndefined = Eng.getStateManager().GetSVal(N->getState(),
+ SizeExpr).isUndef();
+
+ if (isUndefined)
os << "an undefined or garbage value.";
else
os << "0. VLAs with no elements have undefined behavior.";
-
- RangedBugReport *report = new RangedBugReport(*this, os.str().c_str(), N);
+
+ std::string shortBuf;
+ llvm::raw_string_ostream os_short(shortBuf);
+ os_short << "Variable-length array '" << VD->getNameAsString() << "' "
+ << (isUndefined ? " garbage value for array size"
+ : " has zero elements (undefined behavior)");
+
+ RangedBugReport *report = new RangedBugReport(*this,
+ os_short.str().c_str(),
+ os.str().c_str(), N);
report->addRange(SizeExpr->getSourceRange());
BR.EmitReport(report);
}
Modified: cfe/trunk/lib/Frontend/PlistDiagnostics.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PlistDiagnostics.cpp?rev=70415&r1=70414&r2=70415&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PlistDiagnostics.cpp (original)
+++ cfe/trunk/lib/Frontend/PlistDiagnostics.cpp Wed Apr 29 16:58:13 2009
@@ -45,6 +45,7 @@
PathGenerationScheme getGenerationScheme() const { return Extensive; }
bool supportsLogicalOpControlFlow() const { return true; }
bool supportsAllBlockEdges() const { return true; }
+ virtual bool useVerboseDescription() const { return false; }
};
} // end anonymous namespace
More information about the cfe-commits
mailing list