Skip to content

Commit 1b2e321

Browse files
committed
Don't reference CPROVER_memory from Java code. Fixes #197.
goto-symex's value-set analysis can reach the conclusion that an integer may be cast to a pointer, and so generate a reference to the __CPROVER_memory symbol. This is invalid in Java however, since the symbol is not defined and of course Java cannot express dereferencing a non-pointer type. This change disables generation of __CPROVER_memory references when a Java-typed entry point is found. I couldn't provide a test case against master at this time however because the examples in both of the above bugs now succeed against master, presumably because value-set analysis has been improved and is harder to confuse into introducing a pointer-to-int cast.
1 parent 251a1c1 commit 1b2e321

File tree

5 files changed

+25
-5
lines changed

5 files changed

+25
-5
lines changed

src/cbmc/bmc.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Author: Daniel Kroening, [email protected]
1616
#include <util/time_stopping.h>
1717
#include <util/message.h>
1818
#include <util/json.h>
19+
#include <util/cprover_prefix.h>
1920

2021
#include <langapi/mode.h>
2122
#include <langapi/languages.h>
@@ -428,6 +429,12 @@ safety_checkert::resultt bmct::run(
428429
symex.set_message_handler(get_message_handler());
429430
symex.options=options;
430431

432+
{
433+
const symbolt *init_symbol;
434+
if(!ns.lookup(CPROVER_PREFIX "initialize", init_symbol))
435+
symex.mode=init_symbol->mode;
436+
}
437+
431438
status() << "Starting Bounded Model Checking" << eom;
432439

433440
symex.last_source_location.make_nil();

src/goto-symex/goto_symex.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class goto_symext
4949
remaining_vccs(0),
5050
constant_propagation(true),
5151
new_symbol_table(_new_symbol_table),
52+
mode(),
5253
ns(_ns),
5354
target(_target),
5455
atomic_section_counter(0),
@@ -95,6 +96,8 @@ class goto_symext
9596
optionst options;
9697
symbol_tablet &new_symbol_table;
9798

99+
irep_idt mode;
100+
98101
protected:
99102
const namespacet &ns;
100103
symex_targett &target;

src/goto-symex/symex_dereference.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,9 @@ void goto_symext::dereference_rec(
295295
ns,
296296
new_symbol_table,
297297
options,
298-
symex_dereference_state);
299-
298+
symex_dereference_state,
299+
mode);
300+
300301
// std::cout << "**** " << from_expr(ns, "", tmp1) << std::endl;
301302
exprt tmp2=dereference.dereference(
302303
tmp1, guard, write?value_set_dereferencet::WRITE:value_set_dereferencet::READ);

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,13 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
454454
// This is stuff like *((char *)5).
455455
// This is turned into an access to __CPROVER_memory[...].
456456

457-
const symbolt &memory_symbol=ns.lookup(CPROVER_PREFIX "memory");
457+
if(language_mode==ID_java)
458+
{
459+
result.value=nil_exprt();
460+
return result;
461+
}
462+
463+
const symbolt &memory_symbol=ns.lookup(CPROVER_PREFIX "memory");
458464
exprt symbol_expr=symbol_exprt(memory_symbol.name, memory_symbol.type);
459465

460466
exprt pointer_offset=unary_exprt(

src/pointer-analysis/value_set_dereference.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@ class value_set_dereferencet
3939
const namespacet &_ns,
4040
symbol_tablet &_new_symbol_table,
4141
const optionst &_options,
42-
dereference_callbackt &_dereference_callback):
42+
dereference_callbackt &_dereference_callback,
43+
const irep_idt _language_mode = irep_idt()):
4344
ns(_ns),
4445
new_symbol_table(_new_symbol_table),
4546
options(_options),
46-
dereference_callback(_dereference_callback)
47+
dereference_callback(_dereference_callback),
48+
language_mode(_language_mode)
4749
{ }
4850

4951
virtual ~value_set_dereferencet() { }
@@ -80,6 +82,7 @@ class value_set_dereferencet
8082
symbol_tablet &new_symbol_table;
8183
const optionst &options;
8284
dereference_callbackt &dereference_callback;
85+
const irep_idt language_mode;
8386
static unsigned invalid_counter;
8487

8588
bool dereference_type_compare(

0 commit comments

Comments
 (0)