diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2012-11-02 23:49:35 +0000 |
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2012-11-02 23:49:35 +0000 |
| commit | 58e829346716884041b563ee69f80473902b7494 (patch) | |
| tree | fa47bcf8b754fc94a94675f7a4c86a6ddc068ba7 | |
| parent | 4080b0ccebf7c7fbd39c125d74f15a3b7ec729be (diff) | |
| download | bcm5719-llvm-58e829346716884041b563ee69f80473902b7494.tar.gz bcm5719-llvm-58e829346716884041b563ee69f80473902b7494.zip | |
[analyzer] Convert SimpleStreamChecker over to CallEvent.
llvm-svn: 167340
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp index fd548bc1b05..641f2ed0b94 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::PostStmt<CallExpr>, - check::PreStmt<CallExpr>, +class SimpleStreamChecker : public Checker<check::PostCall, + check::PreCall, check::DeadSymbols > { mutable IdentifierInfo *IIfopen, *IIfclose; @@ -58,7 +59,7 @@ class SimpleStreamChecker : public Checker<check::PostStmt<CallExpr>, 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); } |

