diff --git a/Utilities/StaticAnalyzers/src/ClassChecker.cpp b/Utilities/StaticAnalyzers/src/ClassChecker.cpp index b0c0d461280c2..07dbfca3d7e32 100644 --- a/Utilities/StaticAnalyzers/src/ClassChecker.cpp +++ b/Utilities/StaticAnalyzers/src/ClassChecker.cpp @@ -95,8 +95,6 @@ class WalkAST : public clang::StmtVisitor { AC(ac), visitingCallExpr(0) {} - - bool hasWork() const { return !WList.empty(); } /// This method adds a CallExpr to the worklist @@ -489,7 +487,7 @@ void WalkAST::ReportMember(const clang::MemberExpr *ME) { std::string tolog = "data class '"+MD->getParent()->getNameAsString()+"' const function '" + support::getQualifiedName(*MD) + "' Warning: " + os.str(); if (!m_exception.reportClass( CELoc, BR ) ) return; writeLog(tolog); - BR.EmitBasicReport(AC->getDecl(),"Class Checker : Member data modified in const function","ThreadSafety",os.str(),CELoc,R); + BR.EmitBasicReport(AC->getDecl(),"Class Checker : Member data modified in const function","ThreadSafety",os.str(),CELoc); } void WalkAST::ReportCall(const clang::CXXMemberCallExpr *CE) { @@ -580,7 +578,7 @@ void WalkAST::ReportCallArg(const clang::CXXMemberCallExpr *CE,const int i) { if (!m_exception.reportClass( ELoc, BR ) ) return; writeLog(tolog); - BR.EmitBasicReport(CE->getCalleeDecl(),"Class Checker : Member data passed to non-const reference","ThreadSafety",os.str(),ELoc,L); + BR.EmitBasicReport(CE->getCalleeDecl(),"Class Checker : Member data passed to non-const reference","ThreadSafety",os.str(),ELoc); } diff --git a/Utilities/StaticAnalyzers/src/FunctionDumper.cpp b/Utilities/StaticAnalyzers/src/FunctionDumper.cpp index d596e91e13a0f..3c5016876d99b 100644 --- a/Utilities/StaticAnalyzers/src/FunctionDumper.cpp +++ b/Utilities/StaticAnalyzers/src/FunctionDumper.cpp @@ -16,18 +16,39 @@ class FDumper : public clang::StmtVisitor { clang::ento::BugReporter &BR; clang::AnalysisDeclContext *AC; + enum Kind { NotVisited, + Visited }; + + /// A DenseMap that records visited states of CallExpr. + llvm::DenseMap VisitedExpr; + public: FDumper(clang::ento::BugReporter &br, clang::AnalysisDeclContext *ac ) : BR(br), AC(ac) {} + + /// This method adds a CallExpr to the worklist + void setVisited(Expr * E) { + Kind &K = VisitedExpr[E]; + if ( K = NotVisited ) { + VisitedExpr[E] = Visited; + return; + } + } + + bool wasVisited(Expr * E) { + Kind &K = VisitedExpr[E]; + if ( K = Visited ) return true; + return false; + } + const clang::Stmt * ParentStmt(const Stmt *S) { const Stmt * P = AC->getParentMap().getParentIgnoreParens(S); if (!P) return 0; return P; } - void VisitChildren(clang::Stmt *S ); void VisitStmt( clang::Stmt *S) { VisitChildren(S); } void VisitCallExpr( CallExpr *CE ); @@ -43,6 +64,8 @@ void FDumper::VisitChildren( clang::Stmt *S) { } void FDumper::VisitCXXConstructExpr( CXXConstructExpr *CCE ) { +// if (wasVisited(CCE)) return; +// setVisited(CCE); LangOptions LangOpts; LangOpts.CPlusPlus = true; PrintingPolicy Policy(LangOpts); @@ -61,11 +84,14 @@ void FDumper::VisitCXXConstructExpr( CXXConstructExpr *CCE ) { tname+="/tmp/function-dumper.txt.unsorted"; std::string ostring = "function '"+ mdname + "' " + "calls function '" + mname + "'\n"; std::ofstream file(tname.c_str(),std::ios::app); - file<getCallee()->IgnoreParens()); + VisitChildren(CE); } void FunctionDumper::checkASTDecl(const CXXMethodDecl *MD, AnalysisManager& mgr, diff --git a/Utilities/StaticAnalyzers/src/edmChecker.cpp b/Utilities/StaticAnalyzers/src/edmChecker.cpp index 18da55dc3ea64..4a0be9d07ffc0 100644 --- a/Utilities/StaticAnalyzers/src/edmChecker.cpp +++ b/Utilities/StaticAnalyzers/src/edmChecker.cpp @@ -45,7 +45,7 @@ void edmChecker::checkASTDecl(const clang::CXXRecordDecl *RD, clang::ento::Analy } clang::ento::PathDiagnosticLocation ELoc =clang::ento::PathDiagnosticLocation::createBegin( MD, SM ); clang::SourceLocation SL = MD->getLocStart(); - BR.EmitBasicReport(MD, "Class Checker : inherits from edm::EDProducer or edm::EDFilter","optional",os.str(),ELoc,SL); + BR.EmitBasicReport(MD, "Class Checker : inherits from edm::EDProducer or edm::EDFilter","optional",os.str(),ELoc); } } }