[analyzer] Convert SimpleStreamChecker over to CallEvent.
authorJordan Rose <jordan_rose@apple.com>
Fri, 2 Nov 2012 23:49:35 +0000 (23:49 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 2 Nov 2012 23:49:35 +0000 (23:49 +0000)
llvm-svn: 167340

clang/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp

index fd548bc..641f2ed 100644 (file)
@@ -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);
 }