blob: 0effe3ae58f9ecab4367844b9495aabeaadb88cf [file] [log] [blame]
Ted Kremenek8133a262008-07-08 21:46:56 +00001//== Environment.cpp - Map from Expr* to Locations/Values -------*- C++ -*--==//
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 defined the Environment and EnvironmentManager classes.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Analysis/PathSensitive/Environment.h"
Ted Kremenekdf9cdf82008-08-20 17:08:29 +000015#include "clang/Analysis/Analyses/LiveVariables.h"
Ted Kremenek8133a262008-07-08 21:46:56 +000016#include "llvm/ADT/ImmutableMap.h"
Ted Kremenekdf9cdf82008-08-20 17:08:29 +000017#include "llvm/Support/Streams.h"
Ted Kremenek8133a262008-07-08 21:46:56 +000018
19using namespace clang;
20
Zhongxing Xu1c96b242008-10-17 05:57:07 +000021SVal Environment::GetSVal(Expr* E, BasicValueFactory& BasicVals) const {
Ted Kremenekd72ee902008-07-10 17:19:18 +000022
23 for (;;) {
24
25 switch (E->getStmtClass()) {
26
27 case Stmt::AddrLabelExprClass:
Zhongxing Xu1c96b242008-10-17 05:57:07 +000028 return Loc::MakeVal(cast<AddrLabelExpr>(E));
Ted Kremenekd72ee902008-07-10 17:19:18 +000029
30 // ParenExprs are no-ops.
31
32 case Stmt::ParenExprClass:
33 E = cast<ParenExpr>(E)->getSubExpr();
34 continue;
35
36 case Stmt::CharacterLiteralClass: {
37 CharacterLiteral* C = cast<CharacterLiteral>(E);
Zhongxing Xu1c96b242008-10-17 05:57:07 +000038 return NonLoc::MakeVal(BasicVals, C->getValue(), C->getType());
Ted Kremenekd72ee902008-07-10 17:19:18 +000039 }
40
41 case Stmt::IntegerLiteralClass: {
Zhongxing Xu1c96b242008-10-17 05:57:07 +000042 return NonLoc::MakeVal(BasicVals, cast<IntegerLiteral>(E));
Ted Kremenekd72ee902008-07-10 17:19:18 +000043 }
44
Zhongxing Xu143bf822008-10-25 14:18:57 +000045 // Casts where the source and target type are the same
46 // are no-ops. We blast through these to get the descendant
47 // subexpression that has a value.
48
Argyrios Kyrtzidis0835a3c2008-08-18 23:01:59 +000049 case Stmt::ImplicitCastExprClass:
Douglas Gregor6eec8e82008-10-28 15:36:24 +000050 case Stmt::CStyleCastExprClass: {
Ted Kremenekd72ee902008-07-10 17:19:18 +000051 CastExpr* C = cast<CastExpr>(E);
52 QualType CT = C->getType();
53 QualType ST = C->getSubExpr()->getType();
54
55 if (CT->isVoidType())
56 return UnknownVal();
57
58 break;
59 }
60
61 // Handle all other Expr* using a lookup.
62
63 default:
64 break;
65 };
66
67 break;
68 }
69
70 return LookupExpr(E);
71}
Ted Kremenek8133a262008-07-08 21:46:56 +000072
Zhongxing Xu1c96b242008-10-17 05:57:07 +000073SVal Environment::GetBlkExprSVal(Expr* E, BasicValueFactory& BasicVals) const {
Ted Kremenekd72ee902008-07-10 17:19:18 +000074
75 E = E->IgnoreParens();
76
77 switch (E->getStmtClass()) {
78 case Stmt::CharacterLiteralClass: {
79 CharacterLiteral* C = cast<CharacterLiteral>(E);
Zhongxing Xu1c96b242008-10-17 05:57:07 +000080 return NonLoc::MakeVal(BasicVals, C->getValue(), C->getType());
Ted Kremenekd72ee902008-07-10 17:19:18 +000081 }
82
83 case Stmt::IntegerLiteralClass: {
Zhongxing Xu1c96b242008-10-17 05:57:07 +000084 return NonLoc::MakeVal(BasicVals, cast<IntegerLiteral>(E));
Ted Kremenekd72ee902008-07-10 17:19:18 +000085 }
86
87 default:
88 return LookupBlkExpr(E);
89 }
90}
Ted Kremenek8133a262008-07-08 21:46:56 +000091
Zhongxing Xu8cd5aae2008-10-30 05:33:54 +000092Environment EnvironmentManager::BindExpr(const Environment& Env, Expr* E,SVal V,
93 bool isBlkExpr, bool Invalidate) {
Ted Kremenekd72ee902008-07-10 17:19:18 +000094 assert (E);
95
96 if (V.isUnknown()) {
97 if (Invalidate)
98 return isBlkExpr ? RemoveBlkExpr(Env, E) : RemoveSubExpr(Env, E);
99 else
100 return Env;
101 }
Ted Kremenek8133a262008-07-08 21:46:56 +0000102
Ted Kremenekd72ee902008-07-10 17:19:18 +0000103 return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V);
104}
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000105
106Environment
Ted Kremenek9e240492008-10-04 05:50:14 +0000107EnvironmentManager::RemoveDeadBindings(Environment Env, Stmt* Loc,
108 const LiveVariables& Liveness,
109 llvm::SmallVectorImpl<const MemRegion*>& DRoots,
110 StoreManager::LiveSymbolsTy& LSymbols) {
111
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000112 // Drop bindings for subexpressions.
113 Env = RemoveSubExprBindings(Env);
114
115 // Iterate over the block-expr bindings.
116 for (Environment::beb_iterator I = Env.beb_begin(), E = Env.beb_end();
117 I != E; ++I) {
118 Expr* BlkExpr = I.getKey();
119
120 if (Liveness.isLive(Loc, BlkExpr)) {
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000121 SVal X = I.getData();
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000122
Ted Kremenek9e240492008-10-04 05:50:14 +0000123 // If the block expr's value is a memory region, then mark that region.
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000124 if (isa<loc::MemRegionVal>(X))
125 DRoots.push_back(cast<loc::MemRegionVal>(X).getRegion());
Ted Kremenek9e240492008-10-04 05:50:14 +0000126
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000127
128 // Mark all symbols in the block expr's value.
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000129 for (SVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end();
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000130 SI != SE; ++SI) {
131 LSymbols.insert(*SI);
132 }
133 } else {
134 // The block expr is dead.
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000135 SVal X = I.getData();
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000136
Zhongxing Xua950fe22008-08-21 23:00:21 +0000137 // Do not misclean LogicalExpr or ConditionalOperator. It is dead at the
138 // beginning of itself, but we need its UndefinedVal to determine its
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000139 // SVal.
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000140
141 if (X.isUndef() && cast<UndefinedVal>(X).getData())
142 continue;
143
144 Env = RemoveBlkExpr(Env, BlkExpr);
145 }
146 }
147
148 return Env;
149}