Skip to content

Commit 60a1fb2

Browse files
smowtonDaniel Kroening
authored and
Daniel Kroening
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 017d854 commit 60a1fb2

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>
@@ -431,6 +432,12 @@ safety_checkert::resultt bmct::run(
431432
symex.set_message_handler(get_message_handler());
432433
symex.options=options;
433434

435+
{
436+
const symbolt *init_symbol;
437+
if(!ns.lookup(CPROVER_PREFIX "initialize", init_symbol))
438+
symex.mode=init_symbol->mode;
439+
}
440+
434441
status() << "Starting Bounded Model Checking" << eom;
435442

436443
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
@@ -452,7 +452,13 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
452452
// This is stuff like *((char *)5).
453453
// This is turned into an access to __CPROVER_memory[...].
454454

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

458464
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
@@ -37,11 +37,13 @@ class value_set_dereferencet
3737
const namespacet &_ns,
3838
symbol_tablet &_new_symbol_table,
3939
const optionst &_options,
40-
dereference_callbackt &_dereference_callback):
40+
dereference_callbackt &_dereference_callback,
41+
const irep_idt _language_mode = irep_idt()):
4142
ns(_ns),
4243
new_symbol_table(_new_symbol_table),
4344
options(_options),
44-
dereference_callback(_dereference_callback)
45+
dereference_callback(_dereference_callback),
46+
language_mode(_language_mode)
4547
{ }
4648

4749
virtual ~value_set_dereferencet() { }
@@ -78,6 +80,7 @@ class value_set_dereferencet
7880
symbol_tablet &new_symbol_table;
7981
const optionst &options;
8082
dereference_callbackt &dereference_callback;
83+
const irep_idt language_mode;
8184
static unsigned invalid_counter;
8285

8386
bool dereference_type_compare(

0 commit comments

Comments
 (0)