1a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//= RValues.cpp - Abstract RValues for Path-Sens. Value Tracking -*- C++ -*-==// 2a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 3a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// The LLVM Compiler Infrastructure 4a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 5a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// This file is distributed under the University of Illinois Open Source 6a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// License. See LICENSE.TXT for details. 7a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 8a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 9a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// This file defines SVal, Loc, and NonLoc, classes that represent 11a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// abstract r-values for use with path-sensitive value tracking. 12a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 13a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 14a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 1518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 1614429b918bd2f4cb52abc75546a7fe37142054caArgyrios Kyrtzidis#include "clang/AST/ExprObjC.h" 17c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/Basic/IdentifierTable.h" 18a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "llvm/Support/raw_ostream.h" 19a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing namespace clang; 209ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento; 21a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::APSInt; 22a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 23a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 24e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek// Symbol iteration within an SVal. 2590e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek//===----------------------------------------------------------------------===// 2690e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek 27a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 28e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek//===----------------------------------------------------------------------===// 29e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek// Utility methods. 30e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek//===----------------------------------------------------------------------===// 31cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 32264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xubool SVal::hasConjuredSymbol() const { 33dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::SymbolVal> SV = getAs<nonloc::SymbolVal>()) { 34264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu SymbolRef sym = SV->getSymbol(); 35264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu if (isa<SymbolConjured>(sym)) 36264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu return true; 37264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu } 38264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu 39dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<loc::MemRegionVal> RV = getAs<loc::MemRegionVal>()) { 40264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu const MemRegion *R = RV->getRegion(); 41264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) { 42264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu SymbolRef sym = SR->getSymbol(); 43264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu if (isa<SymbolConjured>(sym)) 44264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu return true; 45264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu } 46264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu } 47264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu 48264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu return false; 49264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu} 50264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu 51abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenekconst FunctionDecl *SVal::getAsFunctionDecl() const { 52dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>()) { 53369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu const MemRegion* R = X->getRegion(); 54eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek if (const FunctionTextRegion *CTR = R->getAs<FunctionTextRegion>()) 555fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CTR->getDecl())) 565fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks return FD; 57369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu } 58369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 5957e156a7ed2ce9083f77dde7a4b757ccc9cf8e50Anna Zaks return 0; 60369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu} 61369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 62076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// \brief If this SVal is a location (subclasses Loc) and wraps a symbol, 63076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// return that SymbolRef. Otherwise return 0. 64076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// 65076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// Implicit casts (ex: void* -> char*) can turn Symbolic region into Element 66076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// region. If that is the case, gets the underlining region. 678ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// When IncludeBaseRegions is set to true and the SubRegion is non-symbolic, 688ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// the first symbolic parent region is returned. 698ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna ZaksSymbolRef SVal::getAsLocSymbol(bool IncludeBaseRegions) const { 70076add680e281709cf081052be0dcb822dc8f37dAnna Zaks // FIXME: should we consider SymbolRef wrapped in CodeTextRegion? 71dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::LocAsInteger> X = getAs<nonloc::LocAsInteger>()) 7246d1a4f046e5a7d35a7857be271b6701823542faZhongxing Xu return X->getLoc().getAsLocSymbol(); 7346d1a4f046e5a7d35a7857be271b6701823542faZhongxing Xu 74dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>()) { 758ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks const MemRegion *R = X->getRegion(); 768ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks if (const SymbolicRegion *SymR = IncludeBaseRegions ? 778ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks R->getSymbolicBase() : 788ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks dyn_cast<SymbolicRegion>(R->StripCasts())) 79f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek return SymR->getSymbol(); 8094c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek } 8157e156a7ed2ce9083f77dde7a4b757ccc9cf8e50Anna Zaks return 0; 8294c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek} 8394c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek 84c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu/// Get the symbol in the SVal or its base region. 85c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing XuSymbolRef SVal::getLocSymbolInBase() const { 86dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>(); 87c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu 88c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu if (!X) 89c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu return 0; 90c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu 91c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu const MemRegion *R = X->getRegion(); 92c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu 93c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu while (const SubRegion *SR = dyn_cast<SubRegion>(R)) { 94c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SR)) 95c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu return SymR->getSymbol(); 96c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu else 97c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu R = SR->getSuperRegion(); 98c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu } 99c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu 100c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu return 0; 101c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu} 102c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu 103aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks// TODO: The next 3 functions have to be simplified. 104076add680e281709cf081052be0dcb822dc8f37dAnna Zaks 105076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// \brief If this SVal wraps a symbol return that SymbolRef. 1068ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// Otherwise, return 0. 1078ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// 1088ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// Casts are ignored during lookup. 1098ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// \param IncludeBaseRegions The boolean that controls whether the search 1108ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// should continue to the base regions if the region is not symbolic. 1118ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna ZaksSymbolRef SVal::getAsSymbol(bool IncludeBaseRegion) const { 112076add680e281709cf081052be0dcb822dc8f37dAnna Zaks // FIXME: should we consider SymbolRef wrapped in CodeTextRegion? 113dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::SymbolVal> X = getAs<nonloc::SymbolVal>()) 11494c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek return X->getSymbol(); 1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1168ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks return getAsLocSymbol(IncludeBaseRegion); 11794c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek} 11894c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek 119e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek/// getAsSymbolicExpression - If this Sval wraps a symbolic expression then 120e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek/// return that expression. Otherwise return NULL. 121e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenekconst SymExpr *SVal::getAsSymbolicExpression() const { 122dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::SymbolVal> X = getAs<nonloc::SymbolVal>()) 1235344baa704f42b22d9df25c24ffbbf6b4716603bAnna Zaks return X->getSymbol(); 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 125e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek return getAsSymbol(); 126e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek} 127edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu 12864595fad45abbaa75778609196b9223bf6f2ece3Anna Zaksconst SymExpr* SVal::getAsSymExpr() const { 12964595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks const SymExpr* Sym = getAsSymbol(); 13064595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks if (!Sym) 13164595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks Sym = getAsSymbolicExpression(); 13264595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks return Sym; 13364595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks} 13464595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks 135edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xuconst MemRegion *SVal::getAsRegion() const { 136dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>()) 137edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu return X->getRegion(); 138edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu 139dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::LocAsInteger> X = getAs<nonloc::LocAsInteger>()) 140604848a49d2a9c0985225bbe3a39fca223e961bbZhongxing Xu return X->getLoc().getAsRegion(); 141604848a49d2a9c0985225bbe3a39fca223e961bbZhongxing Xu 142edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu return 0; 143edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu} 144e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek 145b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *loc::MemRegionVal::stripCasts(bool StripBaseCasts) const { 1460e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek const MemRegion *R = getRegion(); 147b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose return R ? R->StripCasts(StripBaseCasts) : NULL; 1480e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek} 1490e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek 150bfcaf8048d1673320de60a22ca9c297d7484b2a8Zhongxing Xuconst void *nonloc::LazyCompoundVal::getStore() const { 151bfcaf8048d1673320de60a22ca9c297d7484b2a8Zhongxing Xu return static_cast<const LazyCompoundValData*>(Data)->getStore(); 152a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek} 153a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek 154978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Roseconst TypedValueRegion *nonloc::LazyCompoundVal::getRegion() const { 155a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek return static_cast<const LazyCompoundValData*>(Data)->getRegion(); 156a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek} 157a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek 158cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 159a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek// Other Iterators. 160a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek//===----------------------------------------------------------------------===// 161a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek 162a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremeneknonloc::CompoundVal::iterator nonloc::CompoundVal::begin() const { 163a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek return getValue()->begin(); 164a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek} 165a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek 166a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremeneknonloc::CompoundVal::iterator nonloc::CompoundVal::end() const { 167a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek return getValue()->end(); 168a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek} 169a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek 170a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek//===----------------------------------------------------------------------===// 17140fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek// Useful predicates. 17240fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===// 17340fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek 174b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xubool SVal::isConstant() const { 1755251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie return getAs<nonloc::ConcreteInt>() || getAs<loc::ConcreteInt>(); 176b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu} 177b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu 178db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Carebool SVal::isConstant(int I) const { 179dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<loc::ConcreteInt> LV = getAs<loc::ConcreteInt>()) 1805251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie return LV->getValue() == I; 181dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie if (Optional<nonloc::ConcreteInt> NV = getAs<nonloc::ConcreteInt>()) 1825251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie return NV->getValue() == I; 1835251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie return false; 18440fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek} 18540fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek 186db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Carebool SVal::isZeroConstant() const { 187db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care return isConstant(0); 188db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care} 189db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care 19040fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek 19140fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===// 1921c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Non-Locs. 193cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 194cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 195c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekSVal nonloc::ConcreteInt::evalBinOp(SValBuilder &svalBuilder, 1966c07bdba93b095b66e2c8c82dd5ed458fa8285eaTed Kremenek BinaryOperator::Opcode Op, 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const nonloc::ConcreteInt& R) const { 19875b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek const llvm::APSInt* X = 199c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek svalBuilder.getBasicValueFactory().evalAPSInt(Op, getValue(), R.getValue()); 2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2018cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek if (X) 2021c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::ConcreteInt(*X); 2038cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek else 2048cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek return UndefinedVal(); 205cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek} 206cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 2071c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt 208c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremeneknonloc::ConcreteInt::evalComplement(SValBuilder &svalBuilder) const { 209c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return svalBuilder.makeIntVal(~getValue()); 210cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek} 211cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 212c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremeneknonloc::ConcreteInt 213c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremeneknonloc::ConcreteInt::evalMinus(SValBuilder &svalBuilder) const { 214c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek return svalBuilder.makeIntVal(-getValue()); 215c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek} 216c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek 217cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 2181c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Locs. 219cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 220c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek 2219c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed KremenekSVal loc::ConcreteInt::evalBinOp(BasicValueFactory& BasicVals, 222ccaad9dd61b5dcbb489cfd06596ab40cda9a06acTed Kremenek BinaryOperator::Opcode Op, 223ccaad9dd61b5dcbb489cfd06596ab40cda9a06acTed Kremenek const loc::ConcreteInt& R) const { 2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 225a339cd66be6202c6e86916f52a347d0289bf2eeaJordan Rose assert(BinaryOperator::isComparisonOp(Op) || Op == BO_Sub); 2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 227a339cd66be6202c6e86916f52a347d0289bf2eeaJordan Rose const llvm::APSInt *X = BasicVals.evalAPSInt(Op, getValue(), R.getValue()); 2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2298cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek if (X) 230a339cd66be6202c6e86916f52a347d0289bf2eeaJordan Rose return nonloc::ConcreteInt(*X); 2318cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek else 2328cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek return UndefinedVal(); 233a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 234a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 235a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 236a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// Pretty-Printing. 237a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 238a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2396f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenekvoid SVal::dump() const { dumpToStream(llvm::errs()); } 240aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 2419c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SVal::dumpToStream(raw_ostream &os) const { 2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump switch (getBaseKind()) { 2439012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case UnknownKind: 24402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek os << "Unknown"; 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 2469012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case NonLocKind: 2475251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie castAs<NonLoc>().dumpToStream(os); 2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 2499012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case LocKind: 2505251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie castAs<Loc>().dumpToStream(os); 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 2529012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case UndefinedKind: 2536f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek os << "Undefined"; 2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 2559012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 2569012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 2579012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 2589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid NonLoc::dumpToStream(raw_ostream &os) const { 2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump switch (getSubKind()) { 260601fa4e4e2df34442aea987e9bc6621f350eef2dTed Kremenek case nonloc::ConcreteIntKind: { 2615251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie const nonloc::ConcreteInt& C = castAs<nonloc::ConcreteInt>(); 26235df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek if (C.getValue().isUnsigned()) 26335df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek os << C.getValue().getZExtValue(); 26435df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek else 26535df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek os << C.getValue().getSExtValue(); 26635df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek os << ' ' << (C.getValue().isUnsigned() ? 'U' : 'S') 267601fa4e4e2df34442aea987e9bc6621f350eef2dTed Kremenek << C.getValue().getBitWidth() << 'b'; 2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 269601fa4e4e2df34442aea987e9bc6621f350eef2dTed Kremenek } 2705344baa704f42b22d9df25c24ffbbf6b4716603bAnna Zaks case nonloc::SymbolValKind: { 2715251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie os << castAs<nonloc::SymbolVal>().getSymbol(); 2729012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2749012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case nonloc::LocAsIntegerKind: { 2755251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie const nonloc::LocAsInteger& C = castAs<nonloc::LocAsInteger>(); 2766f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek os << C.getLoc() << " [as " << C.getNumBits() << " bit integer]"; 2779012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 2789012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 279a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek case nonloc::CompoundValKind: { 2805251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie const nonloc::CompoundVal& C = castAs<nonloc::CompoundVal>(); 2817b679528c1e193ff08d496264c6aed051506d9bfTed Kremenek os << "compoundVal{"; 282b8b4161e52bacc6d189146bd632393dc5f060cb0Ted Kremenek bool first = true; 283b8b4161e52bacc6d189146bd632393dc5f060cb0Ted Kremenek for (nonloc::CompoundVal::iterator I=C.begin(), E=C.end(); I!=E; ++I) { 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (first) { 2856f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek os << ' '; first = false; 2866f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek } 2876f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek else 2886f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek os << ", "; 2896f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek 2906f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek (*I).dumpToStream(os); 291b8b4161e52bacc6d189146bd632393dc5f060cb0Ted Kremenek } 2927b679528c1e193ff08d496264c6aed051506d9bfTed Kremenek os << "}"; 293a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek break; 294a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek } 295a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek case nonloc::LazyCompoundValKind: { 2965251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie const nonloc::LazyCompoundVal &C = castAs<nonloc::LazyCompoundVal>(); 297cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman os << "lazyCompoundVal{" << const_cast<void *>(C.getStore()) 298cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman << ',' << C.getRegion() 299a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek << '}'; 300a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek break; 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3029012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu default: 3039012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu assert (false && "Pretty-printed not implemented for this NonLoc."); 3049012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 3059012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 3069012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 3079012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 3089c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid Loc::dumpToStream(raw_ostream &os) const { 3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump switch (getSubKind()) { 3109012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::ConcreteIntKind: 3115251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie os << castAs<loc::ConcreteInt>().getValue().getZExtValue() << " (Loc)"; 3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 3139012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::GotoLabelKind: 3145251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie os << "&&" << castAs<loc::GotoLabel>().getLabel()->getName(); 3159012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 3169012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::MemRegionKind: 3175251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie os << '&' << castAs<loc::MemRegionVal>().getRegion()->getString(); 3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 3199012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu default: 320b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Pretty-printing not implemented for this Loc."); 3219012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 3229012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 323