]> granicus.if.org Git - clang/commitdiff
Add CFG support for implicit-control flow for VLA size expressions within an SizeOfAl...
authorTed Kremenek <kremenek@apple.com>
Fri, 26 Sep 2008 22:58:57 +0000 (22:58 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 26 Sep 2008 22:58:57 +0000 (22:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56706 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/CFG.cpp
test/Analysis/dead-stores.c

index 41ae454d44c5a28890dc75b66addb5898f352a37..0313ada82c50bfd44636fbd5220fa6303ab39c01 100644 (file)
@@ -180,6 +180,18 @@ private:
   
   bool badCFG;
 };
+  
+static VariableArrayType* FindVA(Type* t) {
+  while (ArrayType* vt = dyn_cast<ArrayType>(t)) {
+    if (VariableArrayType* vat = dyn_cast<VariableArrayType>(vt))
+      if (vat->getSizeExpr())
+        return vat;
+    
+    t = vt->getElementType().getTypePtr();
+  }
+  
+  return 0;
+}
     
 /// BuildCFG - Constructs a CFG from an AST (a Stmt*).  The AST can
 ///  represent an arbitrary statement.  Examples include a single expression
@@ -405,6 +417,17 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {
     case Stmt::StmtExprClass:
       return WalkAST_VisitStmtExpr(cast<StmtExpr>(Terminator));
 
+    case Stmt::SizeOfAlignOfTypeExprClass: {
+      SizeOfAlignOfTypeExpr* E = cast<SizeOfAlignOfTypeExpr>(Terminator);
+
+      // VLA types have expressions that must be evaluated.
+      for (VariableArrayType* VA = FindVA(E->getArgumentType().getTypePtr());
+           VA != 0; VA = FindVA(VA->getElementType().getTypePtr()))
+        addStmt(VA->getSizeExpr());
+
+      return Block;
+    }
+      
     case Stmt::UnaryOperatorClass: {
       UnaryOperator* U = cast<UnaryOperator>(Terminator);
       
@@ -475,18 +498,6 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {
   if (AlwaysAddStmt) Block->appendStmt(Terminator);
   return WalkAST_VisitChildren(Terminator);
 }
-
-static VariableArrayType* FindVA(Type* t) {
-  while (ArrayType* vt = dyn_cast<ArrayType>(t)) {
-    if (VariableArrayType* vat = dyn_cast<VariableArrayType>(vt))
-      if (vat->getSizeExpr())
-        return vat;
-    
-    t = vt->getElementType().getTypePtr();
-  }
-  
-  return 0;
-}
   
 /// WalkAST_VisitDeclSubExpr - Utility method to add block-level expressions
 ///  for initializers in Decls.
index b1f16b9c844e431b89255aa2c074b585d9280692..7335df5118095eda2c3632f330d07884f177b7d8 100644 (file)
@@ -66,7 +66,6 @@ int f9() {
   return 1;
 }
 
-
 int f10() {
   int x = 4;
   x = 10 + x; // expected-warning{{never read}}
@@ -115,3 +114,9 @@ void f15(unsigned x, unsigned y) {
   int z[count];
 }
 
+int f16(int x) {
+  x = x * 2;
+  x = sizeof(int [x = (x || x + 1) * 2]);  // expected-warning{{Although the value stored to 'x' is used}}
+  return x;
+}
+