|
14 | 14 | #include <analyses/variable-sensitivity/context_abstract_object.h>
|
15 | 15 | #include <analyses/variable-sensitivity/value_set_pointer_abstract_object.h>
|
16 | 16 |
|
17 |
| -static exprt rewrite_expression( |
18 |
| - const exprt &expr, |
19 |
| - const std::vector<abstract_object_pointert> &ops); |
20 |
| - |
21 |
| -static std::vector<abstract_object_sett> |
22 |
| -unwrap_operands(const std::vector<abstract_object_pointert> &operands); |
23 |
| - |
24 | 17 | static abstract_object_sett
|
25 | 18 | unwrap_and_extract_values(const abstract_object_sett &values);
|
26 | 19 |
|
@@ -101,81 +94,25 @@ value_set_pointer_abstract_objectt::value_set_pointer_abstract_objectt(
|
101 | 94 | std::make_shared<constant_pointer_abstract_objectt>(expr, environment, ns));
|
102 | 95 | }
|
103 | 96 |
|
104 |
| -abstract_object_pointert |
105 |
| -value_set_pointer_abstract_objectt::expression_transform( |
106 |
| - const exprt &expr, |
107 |
| - const std::vector<abstract_object_pointert> &operands, |
108 |
| - const abstract_environmentt &environment, |
109 |
| - const namespacet &ns) const |
110 |
| -{ |
111 |
| - PRECONDITION(operands.size() == expr.operands().size()); |
112 |
| - |
113 |
| - auto collective_operands = unwrap_operands(operands); |
114 |
| - |
115 |
| - if(expr.id() == ID_if) |
116 |
| - return evaluate_conditional( |
117 |
| - expr.type(), collective_operands, environment, ns); |
118 |
| - |
119 |
| - abstract_object_sett resulting_objects; |
120 |
| - |
121 |
| - auto dispatcher = values.first(); |
122 |
| - for_each_comb( |
123 |
| - collective_operands, |
124 |
| - [&resulting_objects, &dispatcher, &expr, &environment, &ns]( |
125 |
| - const std::vector<abstract_object_pointert> &ops) { |
126 |
| - auto rewritten_expr = rewrite_expression(expr, ops); |
127 |
| - resulting_objects.insert( |
128 |
| - dispatcher->expression_transform(rewritten_expr, ops, environment, ns)); |
129 |
| - }); |
130 |
| - |
131 |
| - return resolve_new_values(resulting_objects, environment); |
132 |
| -} |
133 |
| - |
134 |
| -abstract_object_pointert |
135 |
| -value_set_pointer_abstract_objectt::evaluate_conditional( |
136 |
| - const typet &type, |
137 |
| - const std::vector<abstract_object_sett> &operands, |
| 97 | +abstract_object_pointert value_set_pointer_abstract_objectt::read_dereference( |
138 | 98 | const abstract_environmentt &env,
|
139 | 99 | const namespacet &ns) const
|
140 | 100 | {
|
141 |
| - auto const condition = operands[0]; |
142 |
| - |
143 |
| - auto const true_result = operands[1]; |
144 |
| - auto const false_result = operands[2]; |
145 |
| - |
146 |
| - auto all_true = true; |
147 |
| - auto all_false = true; |
148 |
| - for(auto v : condition) |
| 101 | + if(is_top() || is_bottom()) |
149 | 102 | {
|
150 |
| - auto expr = v->to_constant(); |
151 |
| - all_true = all_true && expr.is_true(); |
152 |
| - all_false = all_false && expr.is_false(); |
| 103 | + return env.abstract_object_factory( |
| 104 | + type().subtype(), ns, is_top(), !is_top()); |
153 | 105 | }
|
154 |
| - auto indeterminate = !all_true && !all_false; |
155 |
| - |
156 |
| - abstract_object_sett resulting_objects; |
157 |
| - if(all_true || indeterminate) |
158 |
| - resulting_objects.insert(true_result); |
159 |
| - if(all_false || indeterminate) |
160 |
| - resulting_objects.insert(false_result); |
161 |
| - return resolve_new_values(resulting_objects, env); |
162 |
| -} |
163 | 106 |
|
164 |
| -abstract_object_pointert value_set_pointer_abstract_objectt::write( |
165 |
| - abstract_environmentt &environment, |
166 |
| - const namespacet &ns, |
167 |
| - const std::stack<exprt> &stack, |
168 |
| - const exprt &specifier, |
169 |
| - const abstract_object_pointert &value, |
170 |
| - bool merging_write) const |
171 |
| -{ |
172 |
| - abstract_object_sett new_values; |
173 |
| - for(const auto &st_value : values) |
| 107 | + abstract_object_sett results; |
| 108 | + for(auto value : values) |
174 | 109 | {
|
175 |
| - new_values.insert( |
176 |
| - st_value->write(environment, ns, stack, specifier, value, merging_write)); |
| 110 | + auto pointer = |
| 111 | + std::dynamic_pointer_cast<const abstract_pointer_objectt>(value); |
| 112 | + results.insert(pointer->read_dereference(env, ns)); |
177 | 113 | }
|
178 |
| - return resolve_new_values(new_values, environment); |
| 114 | + |
| 115 | + return results.first(); |
179 | 116 | }
|
180 | 117 |
|
181 | 118 | abstract_object_pointert value_set_pointer_abstract_objectt::resolve_new_values(
|
@@ -255,33 +192,6 @@ void value_set_pointer_abstract_objectt::output(
|
255 | 192 | }
|
256 | 193 | }
|
257 | 194 |
|
258 |
| -exprt rewrite_expression( |
259 |
| - const exprt &expr, |
260 |
| - const std::vector<abstract_object_pointert> &ops) |
261 |
| -{ |
262 |
| - auto operands_expr = exprt::operandst{}; |
263 |
| - for(auto v : ops) |
264 |
| - operands_expr.push_back(v->to_constant()); |
265 |
| - auto rewritten_expr = exprt(expr.id(), expr.type(), std::move(operands_expr)); |
266 |
| - return rewritten_expr; |
267 |
| -} |
268 |
| - |
269 |
| -std::vector<abstract_object_sett> |
270 |
| -unwrap_operands(const std::vector<abstract_object_pointert> &operands) |
271 |
| -{ |
272 |
| - auto unwrapped = std::vector<abstract_object_sett>{}; |
273 |
| - |
274 |
| - for(const auto &op : operands) |
275 |
| - { |
276 |
| - auto vsab = |
277 |
| - std::dynamic_pointer_cast<const value_set_tag>(maybe_unwrap_context(op)); |
278 |
| - INVARIANT(vsab, "should be a value set abstract object"); |
279 |
| - unwrapped.push_back(vsab->get_values()); |
280 |
| - } |
281 |
| - |
282 |
| - return unwrapped; |
283 |
| -} |
284 |
| - |
285 | 195 | abstract_object_sett
|
286 | 196 | unwrap_and_extract_values(const abstract_object_sett &values)
|
287 | 197 | {
|
|
0 commit comments