1846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek// SValBuilder.h - Construction of SVals from evaluating expressions -*- C++ -*- 2e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// 3e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// The LLVM Compiler Infrastructure 4e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// 5e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// This file is distributed under the University of Illinois Open Source 6e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// License. See LICENSE.TXT for details. 7e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// 8e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===// 9e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// 10846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek// This file defines SValBuilder, a class that defines the interface for 11e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// "symbolical evaluators" which construct an SVal from an expression. 121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// 13e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===// 14e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_SVALBUILDER 165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_SVALBUILDER 17e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 18478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h" 19e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#include "clang/AST/Expr.h" 201a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek#include "clang/AST/ExprObjC.h" 219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h" 229b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h" 2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" 24e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 25e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremeneknamespace clang { 26c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 27c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerclass CXXBoolLiteralExpr; 28c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer 299ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 31846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenekclass SValBuilder { 3299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 33e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekprotected: 34c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek ASTContext &Context; 35c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 36c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek /// Manager of APSInt values. 37c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek BasicValueFactory BasicVals; 38c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 39c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek /// Manages the creation of symbols. 40c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek SymbolManager SymMgr; 41c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek /// Manages the creation of memory regions. 43c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek MemRegionManager MemMgr; 44c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 4518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ProgramStateManager &StateMgr; 46c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 47c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek /// The scalar type to use for array indices. 48c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const QualType ArrayIndexTy; 49c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 50c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek /// The width of the scalar type used for array indices. 51c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const unsigned ArrayIndexWidth; 5232c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek 53aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks virtual SVal evalCastFromNonLoc(NonLoc val, QualType castTy) = 0; 54aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks virtual SVal evalCastFromLoc(Loc val, QualType castTy) = 0; 55aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks 56c50e6df965ff264952d8d5805d151f89c89af302Ted Kremenekpublic: 579f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan // FIXME: Make these protected again once RegionStoreManager correctly 589f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan // handles loads from different bound value types. 59aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks virtual SVal dispatchCast(SVal val, QualType castTy) = 0; 6032c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek 61e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekpublic: 62c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek SValBuilder(llvm::BumpPtrAllocator &alloc, ASTContext &context, 6318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ProgramStateManager &stateMgr) 64c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek : Context(context), BasicVals(context, alloc), 65c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek SymMgr(context, BasicVals, alloc), 66c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek MemMgr(context, alloc), 67c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek StateMgr(stateMgr), 68c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek ArrayIndexTy(context.IntTy), 69c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek ArrayIndexWidth(context.getTypeSize(ArrayIndexTy)) {} 70c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 71846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek virtual ~SValBuilder() {} 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73432a4558b8161c362efc319f8a38e074e74da201Anna Zaks bool haveSameType(const SymExpr *Sym1, const SymExpr *Sym2) { 74732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek return haveSameType(Sym1->getType(), Sym2->getType()); 75432a4558b8161c362efc319f8a38e074e74da201Anna Zaks } 76432a4558b8161c362efc319f8a38e074e74da201Anna Zaks 77432a4558b8161c362efc319f8a38e074e74da201Anna Zaks bool haveSameType(QualType Ty1, QualType Ty2) { 78432a4558b8161c362efc319f8a38e074e74da201Anna Zaks // FIXME: Remove the second disjunct when we support symbolic 79432a4558b8161c362efc319f8a38e074e74da201Anna Zaks // truncation/extension. 80432a4558b8161c362efc319f8a38e074e74da201Anna Zaks return (Context.getCanonicalType(Ty1) == Context.getCanonicalType(Ty2) || 81a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose (Ty1->isIntegralOrEnumerationType() && 82a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose Ty2->isIntegralOrEnumerationType())); 83432a4558b8161c362efc319f8a38e074e74da201Anna Zaks } 84432a4558b8161c362efc319f8a38e074e74da201Anna Zaks 859f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan SVal evalCast(SVal val, QualType castTy, QualType originalType); 865b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 879c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek virtual SVal evalMinus(NonLoc val) = 0; 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 899c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek virtual SVal evalComplement(NonLoc val) = 0; 90e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 910d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// Create a new value which represents a binary expression with two non 920d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// location operands. 938bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek virtual SVal evalBinOpNN(ProgramStateRef state, BinaryOperator::Opcode op, 94cd8f6ac9b613e1fe962ebf9c87d822ce765275e6Ted Kremenek NonLoc lhs, NonLoc rhs, QualType resultTy) = 0; 95e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 960d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// Create a new value which represents a binary expression with two memory 970d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// location operands. 988bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek virtual SVal evalBinOpLL(ProgramStateRef state, BinaryOperator::Opcode op, 99eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose Loc lhs, Loc rhs, QualType resultTy) = 0; 100e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 1010d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// Create a new value which represents a binary expression with a memory 1020d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// location and non location operands. For example, this would be used to 1030d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// evaluate a pointer arithmetic operation. 1048bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek virtual SVal evalBinOpLN(ProgramStateRef state, BinaryOperator::Opcode op, 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Loc lhs, NonLoc rhs, QualType resultTy) = 0; 10632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 1070d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// Evaluates a given SVal. If the SVal has only one possible (integer) value, 1080d339d06f8721d14befd6311bd306ac485772188Anna Zaks /// that value is returned. Otherwise, returns NULL. 1098bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek virtual const llvm::APSInt *getKnownValue(ProgramStateRef state, SVal val) = 0; 1105b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 111e2241cbb0455a60ba27d6c4b9d601ffef3ed103fAnna Zaks /// Constructs a symbolic expression for two non-location values. 112e2241cbb0455a60ba27d6c4b9d601ffef3ed103fAnna Zaks SVal makeSymExprValNN(ProgramStateRef state, BinaryOperator::Opcode op, 113e2241cbb0455a60ba27d6c4b9d601ffef3ed103fAnna Zaks NonLoc lhs, NonLoc rhs, QualType resultTy); 1140d339d06f8721d14befd6311bd306ac485772188Anna Zaks 1158bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek SVal evalBinOp(ProgramStateRef state, BinaryOperator::Opcode op, 1169f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan SVal lhs, SVal rhs, QualType type); 1175b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 1188bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek DefinedOrUnknownSVal evalEQ(ProgramStateRef state, DefinedOrUnknownSVal lhs, 1199f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedOrUnknownSVal rhs); 120c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 121c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek ASTContext &getContext() { return Context; } 122c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const ASTContext &getContext() const { return Context; } 123c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 12418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ProgramStateManager &getStateManager() { return StateMgr; } 1256bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek 1266bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek QualType getConditionType() const { 127a4317709127e3b63c44a34f9fa1c3f8abe6a77a3Ted Kremenek return Context.getLangOpts().CPlusPlus ? Context.BoolTy : Context.IntTy; 1286bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek } 1296bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek 1306bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek QualType getArrayIndexType() const { 1316bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek return ArrayIndexTy; 1326bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek } 133c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 134c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek BasicValueFactory &getBasicValueFactory() { return BasicVals; } 135c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const BasicValueFactory &getBasicValueFactory() const { return BasicVals; } 136c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 137c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek SymbolManager &getSymbolManager() { return SymMgr; } 138c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const SymbolManager &getSymbolManager() const { return SymMgr; } 139c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 140c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek MemRegionManager &getRegionManager() { return MemMgr; } 141c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek const MemRegionManager &getRegionManager() const { return MemMgr; } 142c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 143c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek // Forwarding methods to SymbolManager. 144c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 1453b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const SymbolConjured* conjureSymbol(const Stmt *stmt, 1463b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const LocationContext *LCtx, 1473b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek QualType type, 1483b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek unsigned visitCount, 1493b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const void *symbolTag = 0) { 1503b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek return SymMgr.conjureSymbol(stmt, LCtx, type, visitCount, symbolTag); 151c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 152c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 1533b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const SymbolConjured* conjureSymbol(const Expr *expr, 1543b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const LocationContext *LCtx, 1553b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek unsigned visitCount, 1563b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const void *symbolTag = 0) { 1573b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek return SymMgr.conjureSymbol(expr, LCtx, visitCount, symbolTag); 158c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 159c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 160426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// Construct an SVal representing '0' for the specified type. 1619f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedOrUnknownSVal makeZeroVal(QualType type); 162c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 163426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// Make a unique symbol for value of region. 1649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek DefinedOrUnknownSVal getRegionValueSymbolVal(const TypedValueRegion *region); 165c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 166426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// \brief Create a new symbol with a unique 'name'. 167426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// 168426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// We resort to conjured symbols when we cannot construct a derived symbol. 169426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// The advantage of symbols derived/built from other symbols is that we 170426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// preserve the relation between related(or even equivalent) expressions, so 171426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks /// conjured symbols should be used sparingly. 1723b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, 1733b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const Expr *expr, 1743b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const LocationContext *LCtx, 1753b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek unsigned count); 1763b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, 1773b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const Expr *expr, 1783b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const LocationContext *LCtx, 1793b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek QualType type, 1803b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek unsigned count); 181337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek 1823b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek DefinedOrUnknownSVal conjureSymbolVal(const Stmt *stmt, 1833b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek const LocationContext *LCtx, 1843b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek QualType type, 1853b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek unsigned visitCount); 186e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// \brief Conjure a symbol representing heap allocated memory region. 187e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// 188e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks /// Note, the expression should represent a location. 189e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks DefinedOrUnknownSVal getConjuredHeapSymbolVal(const Expr *E, 190e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks const LocationContext *LCtx, 191e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks unsigned Count); 192c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 1939f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedOrUnknownSVal getDerivedRegionValueSymbolVal( 1949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek SymbolRef parentSymbol, const TypedValueRegion *region); 195c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 1969f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedSVal getMetadataSymbolVal( 1979f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan const void *symbolTag, const MemRegion *region, 1989f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan const Expr *expr, QualType type, unsigned count); 199c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2009f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedSVal getFunctionPointer(const FunctionDecl *func); 201c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2029f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedSVal getBlockPointer(const BlockDecl *block, CanQualType locTy, 2039f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan const LocationContext *locContext); 204c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 205e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose /// Returns the value of \p E, if it can be determined in a non-path-sensitive 206e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose /// manner. 207e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose /// 208e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose /// If \p E is not a constant or cannot be modeled, returns \c None. 209e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose Optional<SVal> getConstantVal(const Expr *E); 210e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose 2119f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan NonLoc makeCompoundVal(QualType type, llvm::ImmutableList<SVal> vals) { 2129f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::CompoundVal(BasicVals.getCompoundValData(type, vals)); 213c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 214c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2159697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek NonLoc makeLazyCompoundVal(const StoreRef &store, 2169697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek const TypedValueRegion *region) { 2179f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::LazyCompoundVal( 2189f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan BasicVals.getLazyCompoundValData(store, region)); 219c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 220c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 221c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek NonLoc makeZeroArrayIndex() { 222c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::ConcreteInt(BasicVals.getValue(0, ArrayIndexTy)); 223c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 224c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 225c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek NonLoc makeArrayIndex(uint64_t idx) { 226c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::ConcreteInt(BasicVals.getValue(idx, ArrayIndexTy)); 227c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 228c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2299f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan SVal convertToArrayIndex(SVal val); 230c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2319f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan nonloc::ConcreteInt makeIntVal(const IntegerLiteral* integer) { 2329f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt( 2339f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan BasicVals.getValue(integer->getValue(), 2345e9ebb3c0fb554d9285aa99c470abdf283272bd9Douglas Gregor integer->getType()->isUnsignedIntegerOrEnumerationType())); 235c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 2362e4457a006fa2beaa87d909b743aa8f09fbf9ec6Bob Wilson 2371a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek nonloc::ConcreteInt makeBoolVal(const ObjCBoolLiteralExpr *boolean) { 2381a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek return makeTruthVal(boolean->getValue(), boolean->getType()); 2391a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek } 240c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 241c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer nonloc::ConcreteInt makeBoolVal(const CXXBoolLiteralExpr *boolean); 242c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2439f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan nonloc::ConcreteInt makeIntVal(const llvm::APSInt& integer) { 2449f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt(BasicVals.getValue(integer)); 245c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 246c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2479f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan loc::ConcreteInt makeIntLocVal(const llvm::APSInt &integer) { 2489f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return loc::ConcreteInt(BasicVals.getValue(integer)); 249c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 250c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2519f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan NonLoc makeIntVal(const llvm::APInt& integer, bool isUnsigned) { 2529f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt(BasicVals.getValue(integer, isUnsigned)); 253c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 254c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2559f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan DefinedSVal makeIntVal(uint64_t integer, QualType type) { 2569f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan if (Loc::isLocType(type)) 2579f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return loc::ConcreteInt(BasicVals.getValue(integer, type)); 258c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2599f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt(BasicVals.getValue(integer, type)); 260c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 261c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2629f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan NonLoc makeIntVal(uint64_t integer, bool isUnsigned) { 2639f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt(BasicVals.getIntValue(integer, isUnsigned)); 264c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 265c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2669f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan NonLoc makeIntValWithPtrWidth(uint64_t integer, bool isUnsigned) { 2679f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt( 2689f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan BasicVals.getIntWithPtrWidth(integer, isUnsigned)); 269c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 270c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2719f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan NonLoc makeLocAsInteger(Loc loc, unsigned bits) { 2729f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::LocAsInteger(BasicVals.getPersistentSValWithData(loc, bits)); 273c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 274c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 275c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op, 2769f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan const llvm::APSInt& rhs, QualType type); 277c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2786d6a83c3754b449ac24cb83bc6d3a50b10535061Anna Zaks NonLoc makeNonLoc(const llvm::APSInt& rhs, BinaryOperator::Opcode op, 2796d6a83c3754b449ac24cb83bc6d3a50b10535061Anna Zaks const SymExpr *lhs, QualType type); 2806d6a83c3754b449ac24cb83bc6d3a50b10535061Anna Zaks 281c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op, 2829f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan const SymExpr *rhs, QualType type); 283c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 284aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks /// \brief Create a NonLoc value for cast. 285aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks NonLoc makeNonLoc(const SymExpr *operand, QualType fromTy, QualType toTy); 286aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks 2879f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan nonloc::ConcreteInt makeTruthVal(bool b, QualType type) { 2889f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return nonloc::ConcreteInt(BasicVals.getTruthValue(b, type)); 289c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 290c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 291370e6e984cc32167228b66eaf9610c010da0d794Argyrios Kyrtzidis nonloc::ConcreteInt makeTruthVal(bool b) { 292c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return nonloc::ConcreteInt(BasicVals.getTruthValue(b)); 293c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 294c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 295c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek Loc makeNull() { 296c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return loc::ConcreteInt(BasicVals.getZeroWithPtrWidth()); 297c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 298c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 2999f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan Loc makeLoc(SymbolRef sym) { 3009f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym)); 301c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 302c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 3039f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan Loc makeLoc(const MemRegion* region) { 3049f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return loc::MemRegionVal(region); 305c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 306c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 3079f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan Loc makeLoc(const AddrLabelExpr *expr) { 3089f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return loc::GotoLabel(expr->getLabel()); 309c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 310c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 3119f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan Loc makeLoc(const llvm::APSInt& integer) { 3129f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan return loc::ConcreteInt(BasicVals.getValue(integer)); 313c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek } 314c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek 31510f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek /// Return a memory region for the 'this' object reference. 31610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek loc::MemRegionVal getCXXThis(const CXXMethodDecl *D, 31710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek const StackFrameContext *SFC); 31810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek 31910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek /// Return a memory region for the 'this' object reference. 32010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek loc::MemRegionVal getCXXThis(const CXXRecordDecl *D, 32110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek const StackFrameContext *SFC); 322e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek}; 3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 324c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekSValBuilder* createSimpleSValBuilder(llvm::BumpPtrAllocator &alloc, 325c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek ASTContext &context, 32618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek ProgramStateManager &stateMgr); 3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3285a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace 3295a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 330e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek} // end clang namespace 3315a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 332e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#endif 333