blob: a9afa6d86bd0eb1f7849103ef0be6bc01ab86e68 [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
45 case Stmt::StringLiteralClass:
Zhongxing Xu1c96b242008-10-17 05:57:07 +000046 return Loc::MakeVal(cast<StringLiteral>(E));
Ted Kremenekd72ee902008-07-10 17:19:18 +000047
48 // Casts where the source and target type are the same
49 // are no-ops. We blast through these to get the descendant
50 // subexpression that has a value.
51
Argyrios Kyrtzidis0835a3c2008-08-18 23:01:59 +000052 case Stmt::ImplicitCastExprClass:
53 case Stmt::ExplicitCastExprClass: {
Ted Kremenekd72ee902008-07-10 17:19:18 +000054 CastExpr* C = cast<CastExpr>(E);
55 QualType CT = C->getType();
56 QualType ST = C->getSubExpr()->getType();
57
58 if (CT->isVoidType())
59 return UnknownVal();
60
61 break;
62 }
63
64 // Handle all other Expr* using a lookup.
65
66 default:
67 break;
68 };
69
70 break;
71 }
72
73 return LookupExpr(E);
74}
Ted Kremenek8133a262008-07-08 21:46:56 +000075
Zhongxing Xu1c96b242008-10-17 05:57:07 +000076SVal Environment::GetBlkExprSVal(Expr* E, BasicValueFactory& BasicVals) const {
Ted Kremenekd72ee902008-07-10 17:19:18 +000077
78 E = E->IgnoreParens();
79
80 switch (E->getStmtClass()) {
81 case Stmt::CharacterLiteralClass: {
82 CharacterLiteral* C = cast<CharacterLiteral>(E);
Zhongxing Xu1c96b242008-10-17 05:57:07 +000083 return NonLoc::MakeVal(BasicVals, C->getValue(), C->getType());
Ted Kremenekd72ee902008-07-10 17:19:18 +000084 }
85
86 case Stmt::IntegerLiteralClass: {
Zhongxing Xu1c96b242008-10-17 05:57:07 +000087 return NonLoc::MakeVal(BasicVals, cast<IntegerLiteral>(E));
Ted Kremenekd72ee902008-07-10 17:19:18 +000088 }
89
90 default:
91 return LookupBlkExpr(E);
92 }
93}
Ted Kremenek8133a262008-07-08 21:46:56 +000094
Zhongxing Xu1c96b242008-10-17 05:57:07 +000095Environment EnvironmentManager::SetSVal(const Environment& Env, Expr* E, SVal V,
Ted Kremenekd72ee902008-07-10 17:19:18 +000096 bool isBlkExpr, bool Invalidate) {
97 assert (E);
98
99 if (V.isUnknown()) {
100 if (Invalidate)
101 return isBlkExpr ? RemoveBlkExpr(Env, E) : RemoveSubExpr(Env, E);
102 else
103 return Env;
104 }
Ted Kremenek8133a262008-07-08 21:46:56 +0000105
Ted Kremenekd72ee902008-07-10 17:19:18 +0000106 return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V);
107}
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000108
109Environment
Ted Kremenek9e240492008-10-04 05:50:14 +0000110EnvironmentManager::RemoveDeadBindings(Environment Env, Stmt* Loc,
111 const LiveVariables& Liveness,
112 llvm::SmallVectorImpl<const MemRegion*>& DRoots,
113 StoreManager::LiveSymbolsTy& LSymbols) {
114
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000115 // Drop bindings for subexpressions.
116 Env = RemoveSubExprBindings(Env);
117
118 // Iterate over the block-expr bindings.
119 for (Environment::beb_iterator I = Env.beb_begin(), E = Env.beb_end();
120 I != E; ++I) {
121 Expr* BlkExpr = I.getKey();
122
123 if (Liveness.isLive(Loc, BlkExpr)) {
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000124 SVal X = I.getData();
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000125
Ted Kremenek9e240492008-10-04 05:50:14 +0000126 // If the block expr's value is a memory region, then mark that region.
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000127 if (isa<loc::MemRegionVal>(X))
128 DRoots.push_back(cast<loc::MemRegionVal>(X).getRegion());
Ted Kremenek9e240492008-10-04 05:50:14 +0000129
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000130
131 // Mark all symbols in the block expr's value.
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000132 for (SVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end();
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000133 SI != SE; ++SI) {
134 LSymbols.insert(*SI);
135 }
136 } else {
137 // The block expr is dead.
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000138 SVal X = I.getData();
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000139
Zhongxing Xua950fe22008-08-21 23:00:21 +0000140 // Do not misclean LogicalExpr or ConditionalOperator. It is dead at the
141 // beginning of itself, but we need its UndefinedVal to determine its
Zhongxing Xu1c96b242008-10-17 05:57:07 +0000142 // SVal.
Ted Kremenekdf9cdf82008-08-20 17:08:29 +0000143
144 if (X.isUndef() && cast<UndefinedVal>(X).getData())
145 continue;
146
147 Env = RemoveBlkExpr(Env, BlkExpr);
148 }
149 }
150
151 return Env;
152}