Skip to content

Commit 4d35274

Browse files
committed
Simplify pointer_offset(constant)
1 parent 52d1e04 commit 4d35274

File tree

3 files changed

+91
-9
lines changed

3 files changed

+91
-9
lines changed

src/util/simplify_expr_pointer.cpp

+32-5
Original file line numberDiff line numberDiff line change
@@ -375,14 +375,41 @@ bool simplify_exprt::simplify_pointer_offset(exprt &expr)
375375

376376
return false;
377377
}
378-
else if(ptr.id()==ID_constant &&
379-
ptr.get(ID_value)==ID_NULL)
378+
else if(ptr.id()==ID_constant)
380379
{
381-
expr=from_integer(0, expr.type());
380+
constant_exprt &c_ptr=to_constant_expr(ptr);
382381

383-
simplify_node(expr);
382+
if(c_ptr.get_value()==ID_NULL ||
383+
c_ptr.value_is_zero_string())
384+
{
385+
expr=from_integer(0, expr.type());
384386

385-
return false;
387+
simplify_node(expr);
388+
389+
return false;
390+
}
391+
else
392+
{
393+
// this is a pointer, we can't use to_integer
394+
mp_integer number=binary2integer(id2string(c_ptr.get_value()), false);
395+
// a null pointer would have been caught above, return value 0
396+
// will indicate that conversion failed
397+
if(number==0)
398+
return true;
399+
400+
// The constant address consists of OBJECT-ID || OFFSET.
401+
mp_integer offset_bits=
402+
pointer_offset_bits(ptr.type(), ns)-config.bv_encoding.object_bits;
403+
number%=power(2, offset_bits);
404+
405+
expr=from_integer(number, expr.type());
406+
407+
simplify_node(expr);
408+
409+
return false;
410+
}
411+
412+
return true;
386413
}
387414

388415
return true;

unit/Makefile

+3-4
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ SRC = src/expr/require_expr.cpp \
55
src/ansi-c/c_to_expr.cpp \
66
unit_tests.cpp \
77
catch_example.cpp \
8-
util/expr_iterator.cpp \
9-
analyses/call_graph.cpp \
10-
java_bytecode/java_bytecode_convert_class/convert_abstract_class.cpp \
118
# Empty last line
129

1310
# Test source files
@@ -23,8 +20,10 @@ SRC += unit_tests.cpp \
2320
solvers/refinement/string_constraint_generator_valueof/get_numeric_value_from_character.cpp \
2421
solvers/refinement/string_constraint_generator_valueof/is_digit_with_radix.cpp \
2522
solvers/refinement/string_constraint_instantiation/instantiate_not_contains.cpp \
26-
solvers/refinement/string_refinement/substitute_array_list.cpp \
2723
solvers/refinement/string_refinement/concretize_array.cpp \
24+
solvers/refinement/string_refinement/substitute_array_list.cpp \
25+
util/expr_iterator.cpp \
26+
util/simplify_expr.cpp \
2827
catch_example.cpp \
2928
# Empty last line
3029

unit/util/simplify_expr.cpp

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests of the expression simplifier
4+
5+
Author: Michael Tautschnig
6+
7+
\*******************************************************************/
8+
9+
#include <catch.hpp>
10+
11+
#include <util/arith_tools.h>
12+
#include <util/c_types.h>
13+
#include <util/namespace.h>
14+
#include <util/pointer_predicates.h>
15+
#include <util/simplify_expr.h>
16+
#include <util/std_expr.h>
17+
#include <util/symbol_table.h>
18+
19+
TEST_CASE("Simplify pointer_offset(address of array index)")
20+
{
21+
symbol_tablet symbol_table;
22+
namespacet ns(symbol_table);
23+
24+
array_typet array_type(char_type(), from_integer(2, size_type()));
25+
symbol_exprt array("A", array_type);
26+
index_exprt index(array, from_integer(1, index_type()));
27+
address_of_exprt address_of(index);
28+
29+
exprt p_o=pointer_offset(address_of);
30+
31+
exprt simp=simplify_expr(p_o, ns);
32+
33+
REQUIRE(simp.id()==ID_constant);
34+
mp_integer offset_value;
35+
REQUIRE(!to_integer(simp, offset_value));
36+
REQUIRE(offset_value==1);
37+
}
38+
39+
TEST_CASE("Simplify const pointer offset")
40+
{
41+
symbol_tablet symbol_table;
42+
namespacet ns(symbol_table);
43+
44+
// build a numeric constant of some pointer type
45+
constant_exprt number=from_integer(1234, size_type());
46+
number.type()=pointer_type(char_type());
47+
48+
exprt p_o=pointer_offset(number);
49+
50+
exprt simp=simplify_expr(p_o, ns);
51+
52+
REQUIRE(simp.id()==ID_constant);
53+
mp_integer offset_value;
54+
REQUIRE(!to_integer(simp, offset_value));
55+
REQUIRE(offset_value==1234);
56+
}

0 commit comments

Comments
 (0)