]> granicus.if.org Git - clang/commitdiff
End paths when calling a function marked "noreturn."
authorTed Kremenek <kremenek@apple.com>
Wed, 27 Feb 2008 20:43:44 +0000 (20:43 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 27 Feb 2008 20:43:44 +0000 (20:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47690 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRExprEngine.cpp
include/clang/Analysis/PathSensitive/GRExprEngine.h

index f227160bfb1fdccfa7d90fcb73c9baaa741d4910..45dbac7045ab895a9c9756ba29bbc449e8dbe83f 100644 (file)
@@ -550,6 +550,21 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
     else
       St = EvalCall(CE, cast<LVal>(L), (*DI)->getState());
     
+    // Check for the "noreturn" attribute.
+    
+    if (isa<lval::FuncVal>(L))
+      if (cast<lval::FuncVal>(L).getDecl()->getAttr<NoReturnAttr>()) {
+        
+        NodeTy* N = Builder->generateNode(CE, St, *DI);
+          
+        if (N) {
+          N->markAsSink();
+          NoReturnCalls.insert(N);
+        }
+        
+        continue;
+      }
+    
     Nodify(Dst, CE, *DI, St);
   }
 }
index 13abf53cb39f0a3c85fad544e125e2ce329d13a6..6b96ccf201e618d8ef9ad6fa111a39202c435f63 100644 (file)
@@ -87,20 +87,25 @@ protected:
   
   /// CurrentStmt - The current block-level statement.
   Stmt* CurrentStmt;
+
+  typedef llvm::SmallPtrSet<NodeTy*,2> UninitBranchesTy;  
+  typedef llvm::SmallPtrSet<NodeTy*,2> UninitStoresTy;
+  typedef llvm::SmallPtrSet<NodeTy*,2> BadDerefTy;
+  typedef llvm::SmallPtrSet<NodeTy*,2> BadDividesTy;
+  typedef llvm::SmallPtrSet<NodeTy*,2> NoReturnCallsTy;  
   
   /// UninitBranches - Nodes in the ExplodedGraph that result from
   ///  taking a branch based on an uninitialized value.
-  typedef llvm::SmallPtrSet<NodeTy*,5> UninitBranchesTy;
   UninitBranchesTy UninitBranches;
-
-  typedef llvm::SmallPtrSet<NodeTy*,5> UninitStoresTy;
-  typedef llvm::SmallPtrSet<NodeTy*,5> BadDerefTy;
-  typedef llvm::SmallPtrSet<NodeTy*,5> BadDividesTy;
   
   /// UninitStores - Sinks in the ExplodedGraph that result from
   ///  making a store to an uninitialized lvalue.
   UninitStoresTy UninitStores;
   
+  /// NoReturnCalls - Sinks in the ExplodedGraph that result from
+  //  calling a function with the attribute "noreturn".
+  NoReturnCallsTy NoReturnCalls;
+  
   /// ImplicitNullDeref - Nodes in the ExplodedGraph that result from
   ///  taking a dereference on a symbolic pointer that MAY be NULL.
   BadDerefTy ImplicitNullDeref;
@@ -176,6 +181,10 @@ public:
     return N->isSink() && BadDivides.count(const_cast<NodeTy*>(N)) != 0; 
   }
   
+  bool isNoReturnCall(const NodeTy* N) const {
+    return N->isSink() && NoReturnCalls.count(const_cast<NodeTy*>(N)) != 0;
+  }
+
   typedef BadDerefTy::iterator null_deref_iterator;
   null_deref_iterator null_derefs_begin() { return ExplicitNullDeref.begin(); }
   null_deref_iterator null_derefs_end() { return ExplicitNullDeref.end(); }