SValBuilder.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. //===- SValBuilder.cpp - Basic class for all SValBuilder implementations --===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines SValBuilder, the base class for all (complete) SValBuilder
  11. // implementations.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h"
  15. #include "clang/AST/ASTContext.h"
  16. #include "clang/AST/Decl.h"
  17. #include "clang/AST/DeclCXX.h"
  18. #include "clang/AST/ExprCXX.h"
  19. #include "clang/AST/ExprObjC.h"
  20. #include "clang/AST/Stmt.h"
  21. #include "clang/AST/Type.h"
  22. #include "clang/Basic/LLVM.h"
  23. #include "clang/Analysis/AnalysisDeclContext.h"
  24. #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
  25. #include "clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h"
  26. #include "clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h"
  27. #include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h"
  28. #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
  29. #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h"
  30. #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
  31. #include "clang/StaticAnalyzer/Core/PathSensitive/Store.h"
  32. #include "clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h"
  33. #include "clang/StaticAnalyzer/Core/PathSensitive/SymExpr.h"
  34. #include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h"
  35. #include "llvm/ADT/APSInt.h"
  36. #include "llvm/ADT/None.h"
  37. #include "llvm/ADT/Optional.h"
  38. #include "llvm/Support/Casting.h"
  39. #include "llvm/Support/Compiler.h"
  40. #include <cassert>
  41. #include <tuple>
  42. using namespace clang;
  43. using namespace ento;
  44. //===----------------------------------------------------------------------===//
  45. // Basic SVal creation.
  46. //===----------------------------------------------------------------------===//
  47. void SValBuilder::anchor() {}
  48. DefinedOrUnknownSVal SValBuilder::makeZeroVal(QualType type) {
  49. if (Loc::isLocType(type))
  50. return makeNull();
  51. if (type->isIntegralOrEnumerationType())
  52. return makeIntVal(0, type);
  53. if (type->isArrayType() || type->isRecordType() || type->isVectorType() ||
  54. type->isAnyComplexType())
  55. return makeCompoundVal(type, BasicVals.getEmptySValList());
  56. // FIXME: Handle floats.
  57. return UnknownVal();
  58. }
  59. NonLoc SValBuilder::makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
  60. const llvm::APSInt& rhs, QualType type) {
  61. // The Environment ensures we always get a persistent APSInt in
  62. // BasicValueFactory, so we don't need to get the APSInt from
  63. // BasicValueFactory again.
  64. assert(lhs);
  65. assert(!Loc::isLocType(type));
  66. return nonloc::SymbolVal(SymMgr.getSymIntExpr(lhs, op, rhs, type));
  67. }
  68. NonLoc SValBuilder::makeNonLoc(const llvm::APSInt& lhs,
  69. BinaryOperator::Opcode op, const SymExpr *rhs,
  70. QualType type) {
  71. assert(rhs);
  72. assert(!Loc::isLocType(type));
  73. return nonloc::SymbolVal(SymMgr.getIntSymExpr(lhs, op, rhs, type));
  74. }
  75. NonLoc SValBuilder::makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
  76. const SymExpr *rhs, QualType type) {
  77. assert(lhs && rhs);
  78. assert(!Loc::isLocType(type));
  79. return nonloc::SymbolVal(SymMgr.getSymSymExpr(lhs, op, rhs, type));
  80. }
  81. NonLoc SValBuilder::makeNonLoc(const SymExpr *operand,
  82. QualType fromTy, QualType toTy) {
  83. assert(operand);
  84. assert(!Loc::isLocType(toTy));
  85. return nonloc::SymbolVal(SymMgr.getCastSymbol(operand, fromTy, toTy));
  86. }
  87. SVal SValBuilder::convertToArrayIndex(SVal val) {
  88. if (val.isUnknownOrUndef())
  89. return val;
  90. // Common case: we have an appropriately sized integer.
  91. if (Optional<nonloc::ConcreteInt> CI = val.getAs<nonloc::ConcreteInt>()) {
  92. const llvm::APSInt& I = CI->getValue();
  93. if (I.getBitWidth() == ArrayIndexWidth && I.isSigned())
  94. return val;
  95. }
  96. return evalCastFromNonLoc(val.castAs<NonLoc>(), ArrayIndexTy);
  97. }
  98. nonloc::ConcreteInt SValBuilder::makeBoolVal(const CXXBoolLiteralExpr *boolean){
  99. return makeTruthVal(boolean->getValue());
  100. }
  101. DefinedOrUnknownSVal
  102. SValBuilder::getRegionValueSymbolVal(const TypedValueRegion *region) {
  103. QualType T = region->getValueType();
  104. if (T->isNullPtrType())
  105. return makeZeroVal(T);
  106. if (!SymbolManager::canSymbolicate(T))
  107. return UnknownVal();
  108. SymbolRef sym = SymMgr.getRegionValueSymbol(region);
  109. if (Loc::isLocType(T))
  110. return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym));
  111. return nonloc::SymbolVal(sym);
  112. }
  113. DefinedOrUnknownSVal SValBuilder::conjureSymbolVal(const void *SymbolTag,
  114. const Expr *Ex,
  115. const LocationContext *LCtx,
  116. unsigned Count) {
  117. QualType T = Ex->getType();
  118. if (T->isNullPtrType())
  119. return makeZeroVal(T);
  120. // Compute the type of the result. If the expression is not an R-value, the
  121. // result should be a location.
  122. QualType ExType = Ex->getType();
  123. if (Ex->isGLValue())
  124. T = LCtx->getAnalysisDeclContext()->getASTContext().getPointerType(ExType);
  125. return conjureSymbolVal(SymbolTag, Ex, LCtx, T, Count);
  126. }
  127. DefinedOrUnknownSVal SValBuilder::conjureSymbolVal(const void *symbolTag,
  128. const Expr *expr,
  129. const LocationContext *LCtx,
  130. QualType type,
  131. unsigned count) {
  132. if (type->isNullPtrType())
  133. return makeZeroVal(type);
  134. if (!SymbolManager::canSymbolicate(type))
  135. return UnknownVal();
  136. SymbolRef sym = SymMgr.conjureSymbol(expr, LCtx, type, count, symbolTag);
  137. if (Loc::isLocType(type))
  138. return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym));
  139. return nonloc::SymbolVal(sym);
  140. }
  141. DefinedOrUnknownSVal SValBuilder::conjureSymbolVal(const Stmt *stmt,
  142. const LocationContext *LCtx,
  143. QualType type,
  144. unsigned visitCount) {
  145. if (type->isNullPtrType())
  146. return makeZeroVal(type);
  147. if (!SymbolManager::canSymbolicate(type))
  148. return UnknownVal();
  149. SymbolRef sym = SymMgr.conjureSymbol(stmt, LCtx, type, visitCount);
  150. if (Loc::isLocType(type))
  151. return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym));
  152. return nonloc::SymbolVal(sym);
  153. }
  154. DefinedOrUnknownSVal
  155. SValBuilder::getConjuredHeapSymbolVal(const Expr *E,
  156. const LocationContext *LCtx,
  157. unsigned VisitCount) {
  158. QualType T = E->getType();
  159. assert(Loc::isLocType(T));
  160. assert(SymbolManager::canSymbolicate(T));
  161. if (T->isNullPtrType())
  162. return makeZeroVal(T);
  163. SymbolRef sym = SymMgr.conjureSymbol(E, LCtx, T, VisitCount);
  164. return loc::MemRegionVal(MemMgr.getSymbolicHeapRegion(sym));
  165. }
  166. DefinedSVal SValBuilder::getMetadataSymbolVal(const void *symbolTag,
  167. const MemRegion *region,
  168. const Expr *expr, QualType type,
  169. const LocationContext *LCtx,
  170. unsigned count) {
  171. assert(SymbolManager::canSymbolicate(type) && "Invalid metadata symbol type");
  172. SymbolRef sym =
  173. SymMgr.getMetadataSymbol(region, expr, type, LCtx, count, symbolTag);
  174. if (Loc::isLocType(type))
  175. return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym));
  176. return nonloc::SymbolVal(sym);
  177. }
  178. DefinedOrUnknownSVal
  179. SValBuilder::getDerivedRegionValueSymbolVal(SymbolRef parentSymbol,
  180. const TypedValueRegion *region) {
  181. QualType T = region->getValueType();
  182. if (T->isNullPtrType())
  183. return makeZeroVal(T);
  184. if (!SymbolManager::canSymbolicate(T))
  185. return UnknownVal();
  186. SymbolRef sym = SymMgr.getDerivedSymbol(parentSymbol, region);
  187. if (Loc::isLocType(T))
  188. return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym));
  189. return nonloc::SymbolVal(sym);
  190. }
  191. DefinedSVal SValBuilder::getMemberPointer(const DeclaratorDecl *DD) {
  192. assert(!DD || isa<CXXMethodDecl>(DD) || isa<FieldDecl>(DD));
  193. if (const auto *MD = dyn_cast_or_null<CXXMethodDecl>(DD)) {
  194. // Sema treats pointers to static member functions as have function pointer
  195. // type, so return a function pointer for the method.
  196. // We don't need to play a similar trick for static member fields
  197. // because these are represented as plain VarDecls and not FieldDecls
  198. // in the AST.
  199. if (MD->isStatic())
  200. return getFunctionPointer(MD);
  201. }
  202. return nonloc::PointerToMember(DD);
  203. }
  204. DefinedSVal SValBuilder::getFunctionPointer(const FunctionDecl *func) {
  205. return loc::MemRegionVal(MemMgr.getFunctionCodeRegion(func));
  206. }
  207. DefinedSVal SValBuilder::getBlockPointer(const BlockDecl *block,
  208. CanQualType locTy,
  209. const LocationContext *locContext,
  210. unsigned blockCount) {
  211. const BlockCodeRegion *BC =
  212. MemMgr.getBlockCodeRegion(block, locTy, locContext->getAnalysisDeclContext());
  213. const BlockDataRegion *BD = MemMgr.getBlockDataRegion(BC, locContext,
  214. blockCount);
  215. return loc::MemRegionVal(BD);
  216. }
  217. /// Return a memory region for the 'this' object reference.
  218. loc::MemRegionVal SValBuilder::getCXXThis(const CXXMethodDecl *D,
  219. const StackFrameContext *SFC) {
  220. return loc::MemRegionVal(getRegionManager().
  221. getCXXThisRegion(D->getThisType(getContext()), SFC));
  222. }
  223. /// Return a memory region for the 'this' object reference.
  224. loc::MemRegionVal SValBuilder::getCXXThis(const CXXRecordDecl *D,
  225. const StackFrameContext *SFC) {
  226. const Type *T = D->getTypeForDecl();
  227. QualType PT = getContext().getPointerType(QualType(T, 0));
  228. return loc::MemRegionVal(getRegionManager().getCXXThisRegion(PT, SFC));
  229. }
  230. Optional<SVal> SValBuilder::getConstantVal(const Expr *E) {
  231. E = E->IgnoreParens();
  232. switch (E->getStmtClass()) {
  233. // Handle expressions that we treat differently from the AST's constant
  234. // evaluator.
  235. case Stmt::AddrLabelExprClass:
  236. return makeLoc(cast<AddrLabelExpr>(E));
  237. case Stmt::CXXScalarValueInitExprClass:
  238. case Stmt::ImplicitValueInitExprClass:
  239. return makeZeroVal(E->getType());
  240. case Stmt::ObjCStringLiteralClass: {
  241. const auto *SL = cast<ObjCStringLiteral>(E);
  242. return makeLoc(getRegionManager().getObjCStringRegion(SL));
  243. }
  244. case Stmt::StringLiteralClass: {
  245. const auto *SL = cast<StringLiteral>(E);
  246. return makeLoc(getRegionManager().getStringRegion(SL));
  247. }
  248. // Fast-path some expressions to avoid the overhead of going through the AST's
  249. // constant evaluator
  250. case Stmt::CharacterLiteralClass: {
  251. const auto *C = cast<CharacterLiteral>(E);
  252. return makeIntVal(C->getValue(), C->getType());
  253. }
  254. case Stmt::CXXBoolLiteralExprClass:
  255. return makeBoolVal(cast<CXXBoolLiteralExpr>(E));
  256. case Stmt::TypeTraitExprClass: {
  257. const auto *TE = cast<TypeTraitExpr>(E);
  258. return makeTruthVal(TE->getValue(), TE->getType());
  259. }
  260. case Stmt::IntegerLiteralClass:
  261. return makeIntVal(cast<IntegerLiteral>(E));
  262. case Stmt::ObjCBoolLiteralExprClass:
  263. return makeBoolVal(cast<ObjCBoolLiteralExpr>(E));
  264. case Stmt::CXXNullPtrLiteralExprClass:
  265. return makeNull();
  266. case Stmt::CStyleCastExprClass:
  267. case Stmt::CXXFunctionalCastExprClass:
  268. case Stmt::CXXConstCastExprClass:
  269. case Stmt::CXXReinterpretCastExprClass:
  270. case Stmt::CXXStaticCastExprClass:
  271. case Stmt::ImplicitCastExprClass: {
  272. const auto *CE = cast<CastExpr>(E);
  273. switch (CE->getCastKind()) {
  274. default:
  275. break;
  276. case CK_ArrayToPointerDecay:
  277. case CK_IntegralToPointer:
  278. case CK_NoOp:
  279. case CK_BitCast: {
  280. const Expr *SE = CE->getSubExpr();
  281. Optional<SVal> Val = getConstantVal(SE);
  282. if (!Val)
  283. return None;
  284. return evalCast(*Val, CE->getType(), SE->getType());
  285. }
  286. }
  287. // FALLTHROUGH
  288. LLVM_FALLTHROUGH;
  289. }
  290. // If we don't have a special case, fall back to the AST's constant evaluator.
  291. default: {
  292. // Don't try to come up with a value for materialized temporaries.
  293. if (E->isGLValue())
  294. return None;
  295. ASTContext &Ctx = getContext();
  296. Expr::EvalResult Result;
  297. if (E->EvaluateAsInt(Result, Ctx))
  298. return makeIntVal(Result.Val.getInt());
  299. if (Loc::isLocType(E->getType()))
  300. if (E->isNullPointerConstant(Ctx, Expr::NPC_ValueDependentIsNotNull))
  301. return makeNull();
  302. return None;
  303. }
  304. }
  305. }
  306. SVal SValBuilder::makeSymExprValNN(BinaryOperator::Opcode Op,
  307. NonLoc LHS, NonLoc RHS,
  308. QualType ResultTy) {
  309. const SymExpr *symLHS = LHS.getAsSymExpr();
  310. const SymExpr *symRHS = RHS.getAsSymExpr();
  311. // TODO: When the Max Complexity is reached, we should conjure a symbol
  312. // instead of generating an Unknown value and propagate the taint info to it.
  313. const unsigned MaxComp = StateMgr.getOwningEngine()
  314. ->getAnalysisManager()
  315. .options.MaxSymbolComplexity;
  316. if (symLHS && symRHS &&
  317. (symLHS->computeComplexity() + symRHS->computeComplexity()) < MaxComp)
  318. return makeNonLoc(symLHS, Op, symRHS, ResultTy);
  319. if (symLHS && symLHS->computeComplexity() < MaxComp)
  320. if (Optional<nonloc::ConcreteInt> rInt = RHS.getAs<nonloc::ConcreteInt>())
  321. return makeNonLoc(symLHS, Op, rInt->getValue(), ResultTy);
  322. if (symRHS && symRHS->computeComplexity() < MaxComp)
  323. if (Optional<nonloc::ConcreteInt> lInt = LHS.getAs<nonloc::ConcreteInt>())
  324. return makeNonLoc(lInt->getValue(), Op, symRHS, ResultTy);
  325. return UnknownVal();
  326. }
  327. SVal SValBuilder::evalBinOp(ProgramStateRef state, BinaryOperator::Opcode op,
  328. SVal lhs, SVal rhs, QualType type) {
  329. if (lhs.isUndef() || rhs.isUndef())
  330. return UndefinedVal();
  331. if (lhs.isUnknown() || rhs.isUnknown())
  332. return UnknownVal();
  333. if (lhs.getAs<nonloc::LazyCompoundVal>() ||
  334. rhs.getAs<nonloc::LazyCompoundVal>()) {
  335. return UnknownVal();
  336. }
  337. if (Optional<Loc> LV = lhs.getAs<Loc>()) {
  338. if (Optional<Loc> RV = rhs.getAs<Loc>())
  339. return evalBinOpLL(state, op, *LV, *RV, type);
  340. return evalBinOpLN(state, op, *LV, rhs.castAs<NonLoc>(), type);
  341. }
  342. if (Optional<Loc> RV = rhs.getAs<Loc>()) {
  343. // Support pointer arithmetic where the addend is on the left
  344. // and the pointer on the right.
  345. assert(op == BO_Add);
  346. // Commute the operands.
  347. return evalBinOpLN(state, op, *RV, lhs.castAs<NonLoc>(), type);
  348. }
  349. return evalBinOpNN(state, op, lhs.castAs<NonLoc>(), rhs.castAs<NonLoc>(),
  350. type);
  351. }
  352. ConditionTruthVal SValBuilder::areEqual(ProgramStateRef state, SVal lhs,
  353. SVal rhs) {
  354. return state->isNonNull(evalEQ(state, lhs, rhs));
  355. }
  356. SVal SValBuilder::evalEQ(ProgramStateRef state, SVal lhs, SVal rhs) {
  357. return evalBinOp(state, BO_EQ, lhs, rhs, getConditionType());
  358. }
  359. DefinedOrUnknownSVal SValBuilder::evalEQ(ProgramStateRef state,
  360. DefinedOrUnknownSVal lhs,
  361. DefinedOrUnknownSVal rhs) {
  362. return evalEQ(state, static_cast<SVal>(lhs), static_cast<SVal>(rhs))
  363. .castAs<DefinedOrUnknownSVal>();
  364. }
  365. /// Recursively check if the pointer types are equal modulo const, volatile,
  366. /// and restrict qualifiers. Also, assume that all types are similar to 'void'.
  367. /// Assumes the input types are canonical.
  368. static bool shouldBeModeledWithNoOp(ASTContext &Context, QualType ToTy,
  369. QualType FromTy) {
  370. while (Context.UnwrapSimilarTypes(ToTy, FromTy)) {
  371. Qualifiers Quals1, Quals2;
  372. ToTy = Context.getUnqualifiedArrayType(ToTy, Quals1);
  373. FromTy = Context.getUnqualifiedArrayType(FromTy, Quals2);
  374. // Make sure that non-cvr-qualifiers the other qualifiers (e.g., address
  375. // spaces) are identical.
  376. Quals1.removeCVRQualifiers();
  377. Quals2.removeCVRQualifiers();
  378. if (Quals1 != Quals2)
  379. return false;
  380. }
  381. // If we are casting to void, the 'From' value can be used to represent the
  382. // 'To' value.
  383. //
  384. // FIXME: Doing this after unwrapping the types doesn't make any sense. A
  385. // cast from 'int**' to 'void**' is not special in the way that a cast from
  386. // 'int*' to 'void*' is.
  387. if (ToTy->isVoidType())
  388. return true;
  389. if (ToTy != FromTy)
  390. return false;
  391. return true;
  392. }
  393. // Handles casts of type CK_IntegralCast.
  394. // At the moment, this function will redirect to evalCast, except when the range
  395. // of the original value is known to be greater than the max of the target type.
  396. SVal SValBuilder::evalIntegralCast(ProgramStateRef state, SVal val,
  397. QualType castTy, QualType originalTy) {
  398. // No truncations if target type is big enough.
  399. if (getContext().getTypeSize(castTy) >= getContext().getTypeSize(originalTy))
  400. return evalCast(val, castTy, originalTy);
  401. const SymExpr *se = val.getAsSymbolicExpression();
  402. if (!se) // Let evalCast handle non symbolic expressions.
  403. return evalCast(val, castTy, originalTy);
  404. // Find the maximum value of the target type.
  405. APSIntType ToType(getContext().getTypeSize(castTy),
  406. castTy->isUnsignedIntegerType());
  407. llvm::APSInt ToTypeMax = ToType.getMaxValue();
  408. NonLoc ToTypeMaxVal =
  409. makeIntVal(ToTypeMax.isUnsigned() ? ToTypeMax.getZExtValue()
  410. : ToTypeMax.getSExtValue(),
  411. castTy)
  412. .castAs<NonLoc>();
  413. // Check the range of the symbol being casted against the maximum value of the
  414. // target type.
  415. NonLoc FromVal = val.castAs<NonLoc>();
  416. QualType CmpTy = getConditionType();
  417. NonLoc CompVal =
  418. evalBinOpNN(state, BO_LE, FromVal, ToTypeMaxVal, CmpTy).castAs<NonLoc>();
  419. ProgramStateRef IsNotTruncated, IsTruncated;
  420. std::tie(IsNotTruncated, IsTruncated) = state->assume(CompVal);
  421. if (!IsNotTruncated && IsTruncated) {
  422. // Symbol is truncated so we evaluate it as a cast.
  423. NonLoc CastVal = makeNonLoc(se, originalTy, castTy);
  424. return CastVal;
  425. }
  426. return evalCast(val, castTy, originalTy);
  427. }
  428. // FIXME: should rewrite according to the cast kind.
  429. SVal SValBuilder::evalCast(SVal val, QualType castTy, QualType originalTy) {
  430. castTy = Context.getCanonicalType(castTy);
  431. originalTy = Context.getCanonicalType(originalTy);
  432. if (val.isUnknownOrUndef() || castTy == originalTy)
  433. return val;
  434. if (castTy->isBooleanType()) {
  435. if (val.isUnknownOrUndef())
  436. return val;
  437. if (val.isConstant())
  438. return makeTruthVal(!val.isZeroConstant(), castTy);
  439. if (!Loc::isLocType(originalTy) &&
  440. !originalTy->isIntegralOrEnumerationType() &&
  441. !originalTy->isMemberPointerType())
  442. return UnknownVal();
  443. if (SymbolRef Sym = val.getAsSymbol(true)) {
  444. BasicValueFactory &BVF = getBasicValueFactory();
  445. // FIXME: If we had a state here, we could see if the symbol is known to
  446. // be zero, but we don't.
  447. return makeNonLoc(Sym, BO_NE, BVF.getValue(0, Sym->getType()), castTy);
  448. }
  449. // Loc values are not always true, they could be weakly linked functions.
  450. if (Optional<Loc> L = val.getAs<Loc>())
  451. return evalCastFromLoc(*L, castTy);
  452. Loc L = val.castAs<nonloc::LocAsInteger>().getLoc();
  453. return evalCastFromLoc(L, castTy);
  454. }
  455. // For const casts, casts to void, just propagate the value.
  456. if (!castTy->isVariableArrayType() && !originalTy->isVariableArrayType())
  457. if (shouldBeModeledWithNoOp(Context, Context.getPointerType(castTy),
  458. Context.getPointerType(originalTy)))
  459. return val;
  460. // Check for casts from pointers to integers.
  461. if (castTy->isIntegralOrEnumerationType() && Loc::isLocType(originalTy))
  462. return evalCastFromLoc(val.castAs<Loc>(), castTy);
  463. // Check for casts from integers to pointers.
  464. if (Loc::isLocType(castTy) && originalTy->isIntegralOrEnumerationType()) {
  465. if (Optional<nonloc::LocAsInteger> LV = val.getAs<nonloc::LocAsInteger>()) {
  466. if (const MemRegion *R = LV->getLoc().getAsRegion()) {
  467. StoreManager &storeMgr = StateMgr.getStoreManager();
  468. R = storeMgr.castRegion(R, castTy);
  469. return R ? SVal(loc::MemRegionVal(R)) : UnknownVal();
  470. }
  471. return LV->getLoc();
  472. }
  473. return dispatchCast(val, castTy);
  474. }
  475. // Just pass through function and block pointers.
  476. if (originalTy->isBlockPointerType() || originalTy->isFunctionPointerType()) {
  477. assert(Loc::isLocType(castTy));
  478. return val;
  479. }
  480. // Check for casts from array type to another type.
  481. if (const auto *arrayT =
  482. dyn_cast<ArrayType>(originalTy.getCanonicalType())) {
  483. // We will always decay to a pointer.
  484. QualType elemTy = arrayT->getElementType();
  485. val = StateMgr.ArrayToPointer(val.castAs<Loc>(), elemTy);
  486. // Are we casting from an array to a pointer? If so just pass on
  487. // the decayed value.
  488. if (castTy->isPointerType() || castTy->isReferenceType())
  489. return val;
  490. // Are we casting from an array to an integer? If so, cast the decayed
  491. // pointer value to an integer.
  492. assert(castTy->isIntegralOrEnumerationType());
  493. // FIXME: Keep these here for now in case we decide soon that we
  494. // need the original decayed type.
  495. // QualType elemTy = cast<ArrayType>(originalTy)->getElementType();
  496. // QualType pointerTy = C.getPointerType(elemTy);
  497. return evalCastFromLoc(val.castAs<Loc>(), castTy);
  498. }
  499. // Check for casts from a region to a specific type.
  500. if (const MemRegion *R = val.getAsRegion()) {
  501. // Handle other casts of locations to integers.
  502. if (castTy->isIntegralOrEnumerationType())
  503. return evalCastFromLoc(loc::MemRegionVal(R), castTy);
  504. // FIXME: We should handle the case where we strip off view layers to get
  505. // to a desugared type.
  506. if (!Loc::isLocType(castTy)) {
  507. // FIXME: There can be gross cases where one casts the result of a function
  508. // (that returns a pointer) to some other value that happens to fit
  509. // within that pointer value. We currently have no good way to
  510. // model such operations. When this happens, the underlying operation
  511. // is that the caller is reasoning about bits. Conceptually we are
  512. // layering a "view" of a location on top of those bits. Perhaps
  513. // we need to be more lazy about mutual possible views, even on an
  514. // SVal? This may be necessary for bit-level reasoning as well.
  515. return UnknownVal();
  516. }
  517. // We get a symbolic function pointer for a dereference of a function
  518. // pointer, but it is of function type. Example:
  519. // struct FPRec {
  520. // void (*my_func)(int * x);
  521. // };
  522. //
  523. // int bar(int x);
  524. //
  525. // int f1_a(struct FPRec* foo) {
  526. // int x;
  527. // (*foo->my_func)(&x);
  528. // return bar(x)+1; // no-warning
  529. // }
  530. assert(Loc::isLocType(originalTy) || originalTy->isFunctionType() ||
  531. originalTy->isBlockPointerType() || castTy->isReferenceType());
  532. StoreManager &storeMgr = StateMgr.getStoreManager();
  533. // Delegate to store manager to get the result of casting a region to a
  534. // different type. If the MemRegion* returned is NULL, this expression
  535. // Evaluates to UnknownVal.
  536. R = storeMgr.castRegion(R, castTy);
  537. return R ? SVal(loc::MemRegionVal(R)) : UnknownVal();
  538. }
  539. return dispatchCast(val, castTy);
  540. }