]> granicus.if.org Git - clang/commitdiff
Used conjured symbols to recover path-sensitivity when the result of a compound assig...
authorTed Kremenek <kremenek@apple.com>
Mon, 20 Oct 2008 23:13:25 +0000 (23:13 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 20 Oct 2008 23:13:25 +0000 (23:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57851 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/GRExprEngine.cpp

index 98fa58f5ddb9a67d37b6df84ddfdf01b1a86818e..94fbf35b1bf2e626f1db2a124da6adccefa94ad6 100644 (file)
@@ -2204,6 +2204,19 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
           
           continue;
         }
+
+        // EXPERIMENTAL: "Conjured" symbols.
+        // FIXME: Handle structs.
+        QualType T = RHS->getType();
+        
+        if (Result.isUnknown() && (T->isIntegerType() || Loc::IsLocType(T))) {            
+          unsigned Count = Builder->getCurrentBlockCount();
+          SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
+          
+          Result = Loc::IsLocType(B->getRHS()->getType()) 
+                 ? cast<SVal>(loc::SymbolVal(Sym)) 
+                 : cast<SVal>(nonloc::SymbolVal(Sym));            
+        }
  
         EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, Result), location, Result);
       }