From: Ted Kremenek Date: Wed, 6 Feb 2008 17:32:17 +0000 (+0000) Subject: Added assumption logic for symbolic non-lvalues when used in conditions such as X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=feb01f6962d393da70185cb7dbcf5f7d021c1097;p=clang Added assumption logic for symbolic non-lvalues when used in conditions such as "if(x)". On the true branch we know the value is != 0, and on the false branch we know it is 0. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46814 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp index bd5cb0689b..a9371ee4e6 100644 --- a/Analysis/GRConstants.cpp +++ b/Analysis/GRConstants.cpp @@ -898,6 +898,19 @@ GRConstants::StateTy GRConstants::Assume(StateTy St, NonLValue Cond, assert (false && "'Assume' not implemented for this NonLValue."); return St; + + case nonlval::SymbolValKind: { + lval::SymbolVal& SV = cast(Cond); + SymbolID sym = SV.getSymbol(); + + if (Assumption) + return AssumeSymNE(St, sym, ValMgr.getValue(0, SymMgr.getType(sym)), + isFeasible); + else + return AssumeSymEQ(St, sym, ValMgr.getValue(0, SymMgr.getType(sym)), + isFeasible); + } + case nonlval::SymIntConstraintValKind: return AssumeSymInt(St, Assumption, diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp index fba59b42ac..df6db08db2 100644 --- a/Analysis/RValues.cpp +++ b/Analysis/RValues.cpp @@ -34,6 +34,16 @@ SymbolID SymbolManager::getSymbol(ParmVarDecl* D) { return X; } +QualType SymbolData::getType() const { + switch (getKind()) { + default: + assert (false && "getType() not implemented for this symbol."); + + case ParmKind: + return static_cast(getPtr())->getType(); + } +} + SymbolManager::SymbolManager() {} SymbolManager::~SymbolManager() {} diff --git a/Analysis/RValues.h b/Analysis/RValues.h index 9bb97caf40..bf3fe0dec9 100644 --- a/Analysis/RValues.h +++ b/Analysis/RValues.h @@ -71,7 +71,9 @@ public: inline Kind getKind() const { return (Kind) (Data & Mask); } inline void* getPtr() const { return reinterpret_cast(Data & ~Mask); } - inline bool operator==(const SymbolData& R) const { return Data == R.Data; } + inline bool operator==(const SymbolData& R) const { return Data == R.Data; } + + QualType getType() const; }; @@ -114,12 +116,16 @@ public: SymbolManager(); ~SymbolManager(); - SymbolData getSymbolData(SymbolID id) const { - assert (id < SymbolToData.size()); - return SymbolToData[id]; + SymbolID getSymbol(ParmVarDecl* D); + + inline SymbolData getSymbolData(SymbolID ID) const { + assert (ID < SymbolToData.size()); + return SymbolToData[ID]; } - SymbolID getSymbol(ParmVarDecl* D); + inline QualType getType(SymbolID ID) const { + return getSymbolData(ID).getType(); + } };