@@ -944,23 +944,32 @@ void goto_checkt::pointer_validity_check(
944
944
expr,
945
945
guard);
946
946
947
- if (flags.is_unknown () || flags.is_dynamic_heap ())
948
- add_guarded_claim (
949
- not_exprt (deallocated (pointer, ns)),
950
- " dereference failure: deallocated dynamic object" ,
951
- " pointer dereference" ,
952
- expr.find_source_location (),
953
- expr,
954
- guard);
947
+ symbol_tablet symbol_table = ns.get_symbol_table ();
955
948
956
- if (flags.is_unknown () || flags.is_dynamic_local ())
957
- add_guarded_claim (
958
- not_exprt (dead_object (pointer, ns)),
959
- " dereference failure: dead object" ,
960
- " pointer dereference" ,
961
- expr.find_source_location (),
962
- expr,
963
- guard);
949
+ symbol_tablet::symbolst::iterator s_it =
950
+ symbol_table.symbols .find (CPROVER_PREFIX " initialize" );
951
+
952
+ // For Java don't check dereference of a deallocated or dead object
953
+ if (s_it == symbol_table.symbols .end () || (s_it->second ).mode != ID_java)
954
+ {
955
+ if (flags.is_unknown () || flags.is_dynamic_heap ())
956
+ add_guarded_claim (
957
+ not_exprt (deallocated (pointer, ns)),
958
+ " dereference failure: deallocated dynamic object" ,
959
+ " pointer dereference" ,
960
+ expr.find_source_location (),
961
+ expr,
962
+ guard);
963
+
964
+ if (flags.is_unknown () || flags.is_dynamic_local ())
965
+ add_guarded_claim (
966
+ not_exprt (dead_object (pointer, ns)),
967
+ " dereference failure: dead object" ,
968
+ " pointer dereference" ,
969
+ expr.find_source_location (),
970
+ expr,
971
+ guard);
972
+ }
964
973
965
974
if (enable_bounds_check)
966
975
{
0 commit comments