[cfe-commits] r167340 - /cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp

Jordan Rose jordan_rose at apple.com
Fri Nov 2 16:49:35 PDT 2012


Author: jrose
Date: Fri Nov  2 18:49:35 2012
New Revision: 167340

URL: http://llvm.org/viewvc/llvm-project?rev=167340&view=rev
Log:
[analyzer] Convert SimpleStreamChecker over to CallEvent.

Modified:
    cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp

Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp?rev=167340&r1=167339&r2=167340&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp Fri Nov  2 18:49:35 2012
@@ -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 @@
   }
 };
 
-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 @@
   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 @@
   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 @@
   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 @@
   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::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 @@
   // 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);
 }





More information about the cfe-commits mailing list