SValBuilder.cpp 23 KB

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