Author: szelethus Date: Thu Mar 14 09:10:29 2019 New Revision: 356161 URL: http://llvm.org/viewvc/llvm-project?rev=356161&view=rev Log: [analyzer] Fix an assertation failure for invalid sourcelocation, add a new debug checker
For a rather short code snippet, if debug.ReportStmts (added in this patch) was enabled, a bug reporter visitor crashed: struct h { operator int(); }; int k() { return h(); } Ultimately, this originated from PathDiagnosticLocation::createMemberLoc, as it didn't handle the case where it's MemberExpr typed parameter returned and invalid SourceLocation for MemberExpr::getMemberLoc. The solution was to find any related valid SourceLocaion, and Stmt::getBeginLoc happens to be just that. Differential Revision: https://reviews.llvm.org/D58777 Added: cfe/trunk/test/Analysis/diagnostics/invalid-srcloc-fix.cpp Modified: cfe/trunk/docs/analyzer/developer-docs/DebugChecks.rst cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp cfe/trunk/test/Analysis/plist-html-macros.c Modified: cfe/trunk/docs/analyzer/developer-docs/DebugChecks.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/analyzer/developer-docs/DebugChecks.rst?rev=356161&r1=356160&r2=356161&view=diff ============================================================================== --- cfe/trunk/docs/analyzer/developer-docs/DebugChecks.rst (original) +++ cfe/trunk/docs/analyzer/developer-docs/DebugChecks.rst Thu Mar 14 09:10:29 2019 @@ -285,3 +285,10 @@ There is also an additional -analyzer-st statistics within the analyzer engine. Note the Stats checker (which produces at least one bug report per function) may actually change the values reported by -analyzer-stats. + +Output testing checkers +======================= + +- debug.ReportStmts reports a warning at **every** statement, making it a very + useful tool for testing thoroughly bug report construction and output + emission. Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td?rev=356161&r1=356160&r2=356161&view=diff ============================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td (original) +++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td Thu Mar 14 09:10:29 2019 @@ -1019,6 +1019,10 @@ def ExplodedGraphViewer : Checker<"ViewE HelpText<"View Exploded Graphs using GraphViz">, Documentation<NotDocumented>; +def ReportStmts : Checker<"ReportStmts">, + HelpText<"Emits a warning for every statement.">, + Documentation<NotDocumented>; + } // end "debug" Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp?rev=356161&r1=356160&r2=356161&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/DebugCheckers.cpp Thu Mar 14 09:10:29 2019 @@ -266,3 +266,34 @@ void ento::registerExplodedGraphViewer(C bool ento::shouldRegisterExplodedGraphViewer(const LangOptions &LO) { return true; } + +//===----------------------------------------------------------------------===// +// Emits a report for every Stmt that the analyzer visits. +//===----------------------------------------------------------------------===// + +namespace { + +class ReportStmts : public Checker<check::PreStmt<Stmt>> { + BuiltinBug BT_stmtLoc{this, "Statement"}; + +public: + void checkPreStmt(const Stmt *S, CheckerContext &C) const { + ExplodedNode *Node = C.generateNonFatalErrorNode(); + if (!Node) + return; + + auto Report = llvm::make_unique<BugReport>(BT_stmtLoc, "Statement", Node); + + C.emitReport(std::move(Report)); + } +}; + +} // end of anonymous namespace + +void ento::registerReportStmts(CheckerManager &mgr) { + mgr.registerChecker<ReportStmts>(); +} + +bool ento::shouldRegisterReportStmts(const LangOptions &LO) { + return true; +} Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=356161&r1=356160&r2=356161&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Thu Mar 14 09:10:29 2019 @@ -571,6 +571,8 @@ static SourceLocation getValidSourceLoca } while (!L.isValid()); } + // FIXME: Ironically, this assert actually fails in some cases. + //assert(L.isValid()); return L; } @@ -671,7 +673,15 @@ PathDiagnosticLocation::createConditiona PathDiagnosticLocation PathDiagnosticLocation::createMemberLoc(const MemberExpr *ME, const SourceManager &SM) { - return PathDiagnosticLocation(ME->getMemberLoc(), SM, SingleLocK); + + assert(ME->getMemberLoc().isValid() || ME->getBeginLoc().isValid()); + + // In some cases, getMemberLoc isn't valid -- in this case we'll return with + // some other related valid SourceLocation. + if (ME->getMemberLoc().isValid()) + return PathDiagnosticLocation(ME->getMemberLoc(), SM, SingleLocK); + + return PathDiagnosticLocation(ME->getBeginLoc(), SM, SingleLocK); } PathDiagnosticLocation Added: cfe/trunk/test/Analysis/diagnostics/invalid-srcloc-fix.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/diagnostics/invalid-srcloc-fix.cpp?rev=356161&view=auto ============================================================================== --- cfe/trunk/test/Analysis/diagnostics/invalid-srcloc-fix.cpp (added) +++ cfe/trunk/test/Analysis/diagnostics/invalid-srcloc-fix.cpp Thu Mar 14 09:10:29 2019 @@ -0,0 +1,12 @@ +// RUN: %clang_analyze_cc1 -verify %s \ +// RUN: -analyzer-output=plist -o %t.plist \ +// RUN: -analyzer-checker=core \ +// RUN: -analyzer-checker=debug.ReportStmts + +struct h { + operator int(); +}; + +int k() { + return h(); // expected-warning 3 {{Statement}} +} Modified: cfe/trunk/test/Analysis/plist-html-macros.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/plist-html-macros.c?rev=356161&r1=356160&r2=356161&view=diff ============================================================================== --- cfe/trunk/test/Analysis/plist-html-macros.c (original) +++ cfe/trunk/test/Analysis/plist-html-macros.c Thu Mar 14 09:10:29 2019 @@ -3,7 +3,10 @@ // RUN: rm -rf %t.dir // RUN: mkdir -p %t.dir -// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-html -o %t.dir/index.plist %s +// +// RUN: %clang_analyze_cc1 -o %t.dir/index.plist %s \ +// RUN: -analyzer-checker=core -analyzer-output=plist-html +// // RUN: ls %t.dir | grep '\.html' | count 1 // RUN: grep '\.html' %t.dir/index.plist | count 1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits