diff options
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 11 | ||||
-rw-r--r-- | lib/Analysis/GRExprEngineInternalChecks.cpp | 17 |
2 files changed, 21 insertions, 7 deletions
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 3c814dbb67..4e88baab57 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -1667,14 +1667,18 @@ void BugReporter::EmitReport(BugReport* R) { 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 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) { 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(); diff --git a/lib/Analysis/GRExprEngineInternalChecks.cpp b/lib/Analysis/GRExprEngineInternalChecks.cpp index 1b03149204..a40eff8fc4 100644 --- a/lib/Analysis/GRExprEngineInternalChecks.cpp +++ b/lib/Analysis/GRExprEngineInternalChecks.cpp @@ -405,12 +405,23 @@ public: "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); } |