From 58e829346716884041b563ee69f80473902b7494 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Fri, 2 Nov 2012 23:49:35 +0000 Subject: [PATCH] [analyzer] Convert SimpleStreamChecker over to CallEvent. llvm-svn: 167340 --- .../Checkers/SimpleStreamChecker.cpp | 36 ++++++++++++++-------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp index fd548bc..641f2ed 100644 --- a/clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp @@ -18,6 +18,7 @@ #include "ClangSACheckers.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" using namespace clang; @@ -46,8 +47,8 @@ public: } }; -class SimpleStreamChecker : public Checker, - check::PreStmt, +class SimpleStreamChecker : public Checker { mutable IdentifierInfo *IIfopen, *IIfclose; @@ -58,7 +59,7 @@ class SimpleStreamChecker : public Checker, void initIdentifierInfo(ASTContext &Ctx) const; void reportDoubleClose(SymbolRef FileDescSym, - const CallExpr *Call, + const CallEvent &Call, CheckerContext &C) const; void reportLeaks(SymbolVector LeakedStreams, @@ -69,9 +70,9 @@ public: SimpleStreamChecker(); /// Process fopen. - void checkPostStmt(const CallExpr *Call, CheckerContext &C) const; + void checkPostCall(const CallEvent &Call, CheckerContext &C) const; /// Process fclose. - void checkPreStmt(const CallExpr *Call, CheckerContext &C) const; + void checkPreCall(const CallEvent &Call, CheckerContext &C) const; void checkDeadSymbols(SymbolReaper &SymReaper, CheckerContext &C) const; }; @@ -93,15 +94,18 @@ SimpleStreamChecker::SimpleStreamChecker() : IIfopen(0), IIfclose(0) { LeakBugType->setSuppressOnSink(true); } -void SimpleStreamChecker::checkPostStmt(const CallExpr *Call, +void SimpleStreamChecker::checkPostCall(const CallEvent &Call, CheckerContext &C) const { initIdentifierInfo(C.getASTContext()); - if (C.getCalleeIdentifier(Call) != IIfopen) + if (!Call.isGlobalCFunction()) + return; + + if (Call.getCalleeIdentifier() != IIfopen) return; // Get the symbolic value corresponding to the file handle. - SymbolRef FileDesc = C.getSVal(Call).getAsSymbol(); + SymbolRef FileDesc = Call.getReturnValue().getAsSymbol(); if (!FileDesc) return; @@ -111,15 +115,21 @@ void SimpleStreamChecker::checkPostStmt(const CallExpr *Call, C.addTransition(State); } -void SimpleStreamChecker::checkPreStmt(const CallExpr *Call, +void SimpleStreamChecker::checkPreCall(const CallEvent &Call, CheckerContext &C) const { initIdentifierInfo(C.getASTContext()); - if (C.getCalleeIdentifier(Call) != IIfclose || Call->getNumArgs() != 1) + if (!Call.isGlobalCFunction()) + return; + + if (Call.getCalleeIdentifier() != IIfclose) + return; + + if (Call.getNumArgs() != 1) return; // Get the symbolic value corresponding to the file handle. - SymbolRef FileDesc = C.getSVal(Call->getArg(0)).getAsSymbol(); + SymbolRef FileDesc = Call.getArgSVal(0).getAsSymbol(); if (!FileDesc) return; @@ -172,7 +182,7 @@ void SimpleStreamChecker::checkDeadSymbols(SymbolReaper &SymReaper, } void SimpleStreamChecker::reportDoubleClose(SymbolRef FileDescSym, - const CallExpr *CallExpr, + const CallEvent &Call, CheckerContext &C) const { // We reached a bug, stop exploring the path here by generating a sink. ExplodedNode *ErrNode = C.generateSink(); @@ -183,7 +193,7 @@ void SimpleStreamChecker::reportDoubleClose(SymbolRef FileDescSym, // Generate the report. BugReport *R = new BugReport(*DoubleCloseBugType, "Closing a previously closed file stream", ErrNode); - R->addRange(CallExpr->getSourceRange()); + R->addRange(Call.getSourceRange()); R->markInteresting(FileDescSym); C.emitReport(R); } -- 2.7.4