Skip to content

Commit 8863b9c

Browse files
author
Matthias Güdemann
authored
Merge pull request #2917 from mgudemann/fix/interpreter/null_pointer_no_operand
Support null-pointer without operand in interpreter
2 parents 9bc995f + f7e9715 commit 8863b9c

File tree

7 files changed

+90
-6
lines changed

7 files changed

+90
-6
lines changed

src/goto-programs/interpreter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ exprt interpretert::get_value(
600600
{
601601
return from_integer(rhs[integer2size_t(offset)]!=0?1:0, type);
602602
}
603-
else if((real_type.id()==ID_pointer) || (real_type.id()==ID_address_of))
603+
else if(real_type.id() == ID_pointer)
604604
{
605605
if(rhs[integer2size_t(offset)]==0)
606606
{
@@ -1090,4 +1090,3 @@ void interpreter(
10901090
message_handler);
10911091
interpreter();
10921092
}
1093-

src/goto-programs/interpreter_class.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,8 @@ class interpretert:public messaget
306306

307307
void initialize(bool init);
308308
void show_state();
309+
310+
friend class interpreter_testt;
309311
};
310312

311313
#endif // CPROVER_GOTO_PROGRAMS_INTERPRETER_CLASS_H

src/goto-programs/interpreter_evaluate.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,16 +330,23 @@ void interpretert::evaluate(
330330

331331
dest.clear();
332332
}
333-
else if((expr.type().id()==ID_pointer)
334-
|| (expr.type().id()==ID_address_of))
333+
else if(expr.type().id() == ID_pointer)
335334
{
336335
mp_integer i=0;
337336
if(expr.has_operands() && expr.op0().id()==ID_address_of)
338337
{
339338
evaluate(expr.op0(), dest);
340339
return;
341340
}
342-
if(expr.has_operands() && !to_integer(expr.op0(), i))
341+
else if(expr.has_operands() && !to_integer(expr.op0(), i))
342+
{
343+
dest.push_back(i);
344+
return;
345+
}
346+
// check if expression is constant null pointer without operands
347+
else if(
348+
!expr.has_operands() && !to_integer(to_constant_expr(expr), i) &&
349+
i.is_zero())
343350
{
344351
dest.push_back(i);
345352
return;

src/solvers/refinement/string_builtin_function.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class string_transformation_builtin_functiont : public string_builtin_functiont
8383
array_string_exprt input)
8484
: string_builtin_functiont(std::move(return_code)),
8585
result(std::move(result)),
86-
input(std::move(result))
86+
input(std::move(input))
8787
{
8888
}
8989

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ SRC += unit_tests.cpp \
4545
util/symbol_table.cpp \
4646
util/unicode.cpp \
4747
catch_example.cpp \
48+
interpreter/interpreter.cpp \
4849
# Empty last line
4950

5051
INCLUDES= -I ../src/ -I.

unit/interpreter/interpreter.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*******************************************************************\
2+
3+
Module: Interpreter unit tests.
4+
5+
Author: Diffblue Ltd.
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/catch.hpp>
10+
11+
#include <goto-programs/goto_functions.h>
12+
#include <goto-programs/interpreter_class.h>
13+
#include <util/message.h>
14+
#include <util/mp_arith.h>
15+
#include <util/namespace.h>
16+
17+
typedef interpretert::mp_vectort mp_vectort;
18+
19+
class interpreter_testt
20+
{
21+
symbol_tablet symbol_table;
22+
goto_functionst goto_functions;
23+
null_message_handlert null_message_handler;
24+
interpretert interpreter;
25+
26+
public:
27+
explicit interpreter_testt()
28+
: interpreter(symbol_table, goto_functions, null_message_handler)
29+
{
30+
}
31+
32+
mp_vectort evaluate(const exprt &expression)
33+
{
34+
mp_vectort result;
35+
interpreter.evaluate(expression, result);
36+
return result;
37+
}
38+
};
39+
40+
SCENARIO("interpreter evaluation null pointer expressions")
41+
{
42+
interpreter_testt interpreter_test;
43+
mp_vectort null_vector = {0};
44+
45+
THEN("null pointer without operands")
46+
{
47+
unsignedbv_typet java_char(16);
48+
pointer_typet pointer_type(java_char, 64);
49+
50+
constant_exprt constant_expr(ID_NULL, pointer_type);
51+
52+
mp_vectort mp_vector = interpreter_test.evaluate(constant_expr);
53+
54+
REQUIRE_THAT(mp_vector, Catch::Equals(null_vector));
55+
}
56+
THEN("null pointer with operands")
57+
{
58+
pointer_typet outer_pointer_type(empty_typet(), 64);
59+
constant_exprt outer_expression(
60+
"0000000000000000000000000000000000000000000000000000000000000000",
61+
outer_pointer_type);
62+
63+
pointer_typet inner_pointer_type(empty_typet(), 64);
64+
constant_exprt inner_expression(ID_NULL, inner_pointer_type);
65+
66+
outer_expression.move_to_operands(inner_expression);
67+
68+
mp_vectort mp_vector = interpreter_test.evaluate(outer_expression);
69+
70+
REQUIRE_THAT(mp_vector, Catch::Equals(null_vector));
71+
}
72+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
goto-programs
2+
testing-utils
3+
util

0 commit comments

Comments
 (0)