Skip to content

Commit 5f790ab

Browse files
committed
Pull more functions out of abstract_environmentt::do_assume
Trim do_assume right down. assume_* function take expr by const ref now. Mark all assume_* as static.
1 parent 01ab0bf commit 5f790ab

File tree

4 files changed

+106
-93
lines changed

4 files changed

+106
-93
lines changed

scripts/expected_doxygen_warnings.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ warning: Included by graph for 'c_types.h' not generated, too many nodes (144),
2626
warning: Included by graph for 'config.h' not generated, too many nodes (77), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
2727
warning: Included by graph for 'exception_utils.h' not generated, too many nodes (61), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
2828
warning: Included by graph for 'expr.h' not generated, too many nodes (87), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
29-
warning: Included by graph for 'expr_util.h' not generated, too many nodes (62), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
29+
warning: Included by graph for 'expr_util.h' not generated, too many nodes (63), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
3030
warning: Included by graph for 'invariant.h' not generated, too many nodes (186), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
3131
warning: Included by graph for 'irep.h' not generated, too many nodes (62), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
3232
warning: Included by graph for 'message.h' not generated, too many nodes (118), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.

src/analyses/variable-sensitivity/abstract_environment.cpp

Lines changed: 100 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,28 @@
2626
#endif
2727

2828
typedef exprt (
29-
*assume_function)(abstract_environmentt &, exprt, const namespacet &);
30-
31-
exprt assume_eq(abstract_environmentt &env, exprt expr, const namespacet &ns);
32-
exprt assume_noteq(
29+
*assume_function)(abstract_environmentt &, const exprt &, const namespacet &);
30+
31+
static exprt
32+
assume_not(abstract_environmentt &env, const exprt &expr, const namespacet &ns);
33+
static exprt
34+
assume_or(abstract_environmentt &env, const exprt &expr, const namespacet &ns);
35+
static exprt
36+
assume_and(abstract_environmentt &env, const exprt &expr, const namespacet &ns);
37+
static exprt
38+
assume_eq(abstract_environmentt &env, const exprt &expr, const namespacet &ns);
39+
static exprt assume_noteq(
40+
abstract_environmentt &env,
41+
const exprt &expr,
42+
const namespacet &ns);
43+
static exprt assume_less_than(
3344
abstract_environmentt &env,
34-
exprt expr,
45+
const exprt &expr,
46+
const namespacet &ns);
47+
static exprt assume_greater_than(
48+
abstract_environmentt &env,
49+
const exprt &expr,
3550
const namespacet &ns);
36-
exprt assume_le(abstract_environmentt &env, exprt expr, const namespacet &ns);
37-
exprt assume_lt(abstract_environmentt &env, exprt expr, const namespacet &ns);
38-
exprt assume_ge(abstract_environmentt &env, exprt expr, const namespacet &ns);
39-
exprt assume_gt(abstract_environmentt &env, exprt expr, const namespacet &ns);
4051

4152
abstract_value_pointert as_value(const abstract_object_pointert &obj);
4253
bool is_value(const abstract_object_pointert &obj);
@@ -258,51 +269,20 @@ bool abstract_environmentt::assume(const exprt &expr, const namespacet &ns)
258269
}
259270

260271
static auto assume_functions =
261-
std::map<dstringt, assume_function>{{ID_equal, assume_eq},
272+
std::map<dstringt, assume_function>{{ID_not, assume_not},
273+
{ID_and, assume_and},
274+
{ID_or, assume_or},
275+
{ID_equal, assume_eq},
262276
{ID_notequal, assume_noteq},
263-
{ID_le, assume_le},
264-
{ID_lt, assume_lt},
265-
{ID_ge, assume_ge},
266-
{ID_gt, assume_gt}};
277+
{ID_le, assume_less_than},
278+
{ID_lt, assume_less_than},
279+
{ID_ge, assume_greater_than},
280+
{ID_gt, assume_greater_than}};
267281

268-
exprt abstract_environmentt::do_assume(exprt expr, const namespacet &ns)
282+
exprt abstract_environmentt::do_assume(const exprt &expr, const namespacet &ns)
269283
{
270284
auto expr_id = expr.id();
271285

272-
if(expr_id == ID_not)
273-
{
274-
auto not_expr = to_not_expr(expr);
275-
auto result = do_assume(not_expr.op(), ns);
276-
if(result.is_boolean())
277-
result = result.is_true() ? exprt(false_exprt()) : true_exprt();
278-
return result;
279-
}
280-
if(expr_id == ID_and)
281-
{
282-
auto and_expr = to_and_expr(expr);
283-
for(auto const &operand : and_expr.operands())
284-
{
285-
auto result = do_assume(operand, ns);
286-
if(result.is_nil() || result.is_false())
287-
return result;
288-
}
289-
return true_exprt();
290-
}
291-
if(expr_id == ID_or)
292-
{
293-
exprt or_result = false_exprt();
294-
auto or_expr = to_or_expr(expr);
295-
for(auto const &operand : or_expr.operands())
296-
{
297-
auto result = do_assume(operand, ns);
298-
if(result.is_nil())
299-
return result;
300-
if(result.is_true())
301-
or_result = true_exprt();
302-
}
303-
return or_result;
304-
}
305-
306286
auto fn = assume_functions[expr_id];
307287

308288
if(fn)
@@ -557,9 +537,57 @@ bool is_value(const abstract_object_pointert &obj)
557537
return as_value(obj) != nullptr;
558538
}
559539

560-
exprt assume_eq(abstract_environmentt &env, exprt expr, const namespacet &ns)
540+
exprt assume_not(
541+
abstract_environmentt &env,
542+
const exprt &expr,
543+
const namespacet &ns)
544+
{
545+
auto not_expr = to_not_expr(expr);
546+
auto result = env.do_assume(not_expr.op(), ns);
547+
if(result.is_boolean())
548+
result = result.is_true() ? exprt(false_exprt()) : true_exprt();
549+
return result;
550+
}
551+
552+
exprt assume_and(
553+
abstract_environmentt &env,
554+
const exprt &expr,
555+
const namespacet &ns)
556+
{
557+
auto and_expr = to_and_expr(expr);
558+
for(auto const &operand : and_expr.operands())
559+
{
560+
auto result = env.do_assume(operand, ns);
561+
if(result.is_nil() || result.is_false())
562+
return result;
563+
}
564+
return true_exprt();
565+
}
566+
567+
exprt assume_or(
568+
abstract_environmentt &env,
569+
const exprt &expr,
570+
const namespacet &ns)
571+
{
572+
exprt or_result = false_exprt();
573+
auto or_expr = to_or_expr(expr);
574+
for(auto const &operand : or_expr.operands())
575+
{
576+
auto result = env.do_assume(operand, ns);
577+
if(result.is_nil())
578+
return result;
579+
if(result.is_true())
580+
or_result = true_exprt();
581+
}
582+
return or_result;
583+
}
584+
585+
exprt assume_eq(
586+
abstract_environmentt &env,
587+
const exprt &expr,
588+
const namespacet &ns)
561589
{
562-
auto equal_expr = to_binary_expr(expr);
590+
auto const &equal_expr = to_binary_expr(expr);
563591

564592
auto left = env.eval(equal_expr.lhs(), ns);
565593
auto right = env.eval(equal_expr.rhs(), ns);
@@ -581,9 +609,12 @@ exprt assume_eq(abstract_environmentt &env, exprt expr, const namespacet &ns)
581609
return true_exprt();
582610
}
583611

584-
exprt assume_noteq(abstract_environmentt &env, exprt expr, const namespacet &ns)
612+
exprt assume_noteq(
613+
abstract_environmentt &env,
614+
const exprt &expr,
615+
const namespacet &ns)
585616
{
586-
auto notequal_expr = to_binary_expr(expr);
617+
auto const &notequal_expr = to_binary_expr(expr);
587618

588619
auto left = env.eval(notequal_expr.lhs(), ns);
589620
auto right = env.eval(notequal_expr.rhs(), ns);
@@ -601,7 +632,7 @@ exprt assume_noteq(abstract_environmentt &env, exprt expr, const namespacet &ns)
601632
return false_exprt();
602633
}
603634

604-
struct left_and_right_values
635+
struct left_and_right_valuest
605636
{
606637
abstract_value_pointert left;
607638
abstract_value_pointert right;
@@ -621,12 +652,12 @@ struct left_and_right_values
621652
}
622653
};
623654

624-
left_and_right_values eval_operands_as_values(
655+
left_and_right_valuest eval_operands_as_values(
625656
abstract_environmentt &env,
626-
exprt expr,
657+
const exprt &expr,
627658
const namespacet &ns)
628659
{
629-
auto relationship_expr = to_binary_expr(expr);
660+
auto const &relationship_expr = to_binary_expr(expr);
630661

631662
auto left = env.eval(relationship_expr.lhs(), ns);
632663
auto right = env.eval(relationship_expr.rhs(), ns);
@@ -637,7 +668,10 @@ left_and_right_values eval_operands_as_values(
637668
return {as_value(left), as_value(right)};
638669
}
639670

640-
exprt assume_le(abstract_environmentt &env, exprt expr, const namespacet &ns)
671+
exprt assume_less_than(
672+
abstract_environmentt &env,
673+
const exprt &expr,
674+
const namespacet &ns)
641675
{
642676
auto operands = eval_operands_as_values(env, expr, ns);
643677
if(!operands.are_good())
@@ -646,24 +680,15 @@ exprt assume_le(abstract_environmentt &env, exprt expr, const namespacet &ns)
646680
auto left_lower = operands.left_interval().get_lower();
647681
auto right_upper = operands.right_interval().get_upper();
648682

649-
auto reduced_le_expr = binary_relation_exprt(left_lower, ID_le, right_upper);
683+
auto reduced_le_expr =
684+
binary_relation_exprt(left_lower, expr.id(), right_upper);
650685
return env.eval(reduced_le_expr, ns)->to_constant();
651686
}
652687

653-
exprt assume_lt(abstract_environmentt &env, exprt expr, const namespacet &ns)
654-
{
655-
auto operands = eval_operands_as_values(env, expr, ns);
656-
if(!operands.are_good())
657-
return nil_exprt();
658-
659-
auto left_lower = operands.left_interval().get_lower();
660-
auto right_upper = operands.right_interval().get_upper();
661-
662-
auto reduced_lt_expr = binary_relation_exprt(left_lower, ID_lt, right_upper);
663-
return env.eval(reduced_lt_expr, ns)->to_constant();
664-
}
665-
666-
exprt assume_ge(abstract_environmentt &env, exprt expr, const namespacet &ns)
688+
exprt assume_greater_than(
689+
abstract_environmentt &env,
690+
const exprt &expr,
691+
const namespacet &ns)
667692
{
668693
auto operands = eval_operands_as_values(env, expr, ns);
669694
if(!operands.are_good())
@@ -672,19 +697,7 @@ exprt assume_ge(abstract_environmentt &env, exprt expr, const namespacet &ns)
672697
auto left_upper = operands.left_interval().get_upper();
673698
auto right_lower = operands.right_interval().get_lower();
674699

675-
auto reduced_ge_expr = binary_relation_exprt(left_upper, ID_ge, right_lower);
700+
auto reduced_ge_expr =
701+
binary_relation_exprt(left_upper, expr.id(), right_lower);
676702
return env.eval(reduced_ge_expr, ns)->to_constant();
677703
}
678-
679-
exprt assume_gt(abstract_environmentt &env, exprt expr, const namespacet &ns)
680-
{
681-
auto operands = eval_operands_as_values(env, expr, ns);
682-
if(!operands.are_good())
683-
return nil_exprt();
684-
685-
auto left_upper = operands.left_interval().get_upper();
686-
auto right_lower = operands.right_interval().get_lower();
687-
688-
auto reduced_gt_expr = binary_relation_exprt(left_upper, ID_gt, right_lower);
689-
return env.eval(reduced_gt_expr, ns)->to_constant();
690-
}

src/analyses/variable-sensitivity/abstract_environment.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class abstract_environmentt
103103
/// The better the implementation the more precise the results
104104
/// will be.
105105
virtual bool assume(const exprt &expr, const namespacet &ns);
106-
exprt do_assume(exprt e, const namespacet &ns);
106+
exprt do_assume(const exprt &e, const namespacet &ns);
107107

108108
/// Used within assign to do the actual dispatch
109109
///

unit/analyses/variable-sensitivity/value_expression_evaluation/assume.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ std::vector<std::string>
4343
split(std::string const &s, std::string const &delimiter);
4444
std::vector<exprt> numbersToExprs(std::vector<std::string> const &numbers);
4545

46-
class assume_tester
46+
class assume_testert
4747
{
4848
public:
4949
void operator()(bool is_true, std::vector<std::string> const &tests)
@@ -95,7 +95,7 @@ class assume_tester
9595
}
9696
}
9797

98-
assume_tester(abstract_environmentt &env, namespacet &n)
98+
assume_testert(abstract_environmentt &env, namespacet &n)
9999
: environment(env), ns(n)
100100
{
101101
}
@@ -163,7 +163,7 @@ SCENARIO(
163163
symbol_tablet symbol_table;
164164
namespacet ns(symbol_table);
165165

166-
assume_tester assumeTester(environment, ns);
166+
assume_testert assumeTester(environment, ns);
167167

168168
GIVEN("true or false")
169169
{
@@ -189,7 +189,7 @@ SCENARIO(
189189
auto val2 = from_integer(2, type);
190190
auto val3 = from_integer(3, type);
191191
auto val4 = from_integer(4, type);
192-
auto val5 = from_integer(4, type);
192+
auto val5 = from_integer(5, type);
193193
auto constant1 = make_constant(val1, environment, ns);
194194
auto constant3 = make_constant(val3, environment, ns);
195195
auto interval12 = make_interval(val1, val2, environment, ns);

0 commit comments

Comments
 (0)