From 9ff267d0d6b8249a017fca0b56a0c5a6bcb7ef8a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 20 Oct 2008 23:13:25 +0000 Subject: [PATCH] Used conjured symbols to recover path-sensitivity when the result of a compound assignment is UnknownVal(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57851 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/GRExprEngine.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 98fa58f5dd..94fbf35b1b 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -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(loc::SymbolVal(Sym)) + : cast(nonloc::SymbolVal(Sym)); + } EvalStore(Dst, B, LHS, *I3, SetSVal(St, B, Result), location, Result); } -- 2.50.1