@@ -22,6 +22,7 @@ Date: February 2013
22
22
#include < util/make_unique.h>
23
23
24
24
#include < pointer-analysis/value_set_analysis_fi.h>
25
+ #include < pointer-analysis/value_set_dereference.h>
25
26
26
27
#include " is_threaded.h"
27
28
#include " dirty.h"
@@ -309,21 +310,25 @@ void rd_range_domaint::transform_assign(
309
310
forall_rw_range_set_w_objects (it, rw_set)
310
311
{
311
312
const irep_idt &identifier=it->first ;
312
- // ignore symex::invalid_object
313
+ bool do_kill=is_must_alias;
313
314
const symbolt *symbol_ptr;
314
315
if (ns.lookup (identifier, symbol_ptr))
315
- continue ;
316
- INVARIANT_STRUCTURED (
317
- symbol_ptr!=nullptr ,
318
- nullptr_exceptiont,
319
- " Symbol is in symbol table" );
316
+ {
317
+ if (as_string (identifier).find (get_vsderef_dynamic_object_prefix ())!=0UL )
318
+ // ignore symex::invalid_object
319
+ continue ;
320
+ }
321
+ else
322
+ {
323
+ do_kill=do_kill &&
324
+ (!rd.get_is_threaded ()(from) ||
325
+ (!symbol_ptr->is_shared () &&
326
+ !rd.get_is_dirty ()(identifier)));
327
+ }
320
328
321
329
const range_domaint &ranges=rw_set.get_ranges (it);
322
330
323
- if (is_must_alias &&
324
- (!rd.get_is_threaded ()(from) ||
325
- (!symbol_ptr->is_shared () &&
326
- !rd.get_is_dirty ()(identifier))))
331
+ if (do_kill)
327
332
for (const auto &range : ranges)
328
333
kill (identifier, range.first , range.second );
329
334
0 commit comments