@@ -92,9 +92,12 @@ void rw_range_sett::get_objects_complex(
92
92
const exprt &op=expr.op0 ();
93
93
assert (op.type ().id ()==ID_complex);
94
94
95
- range_spect sub_size=
96
- to_range_spect (pointer_offset_bits (op.type ().subtype (), ns));
97
- assert (sub_size>0 );
95
+ auto subtype_bits=pointer_offset_bits (op.type ().subtype (), ns);
96
+ CHECK_RETURN (subtype_bits.has_value ());
97
+
98
+ range_spect sub_size=to_range_spect (*subtype_bits);
99
+ CHECK_RETURN (sub_size>0 );
100
+
98
101
range_spect offset=
99
102
(range_start==-1 || expr.id ()==ID_complex_real) ? 0 : sub_size;
100
103
@@ -167,8 +170,10 @@ void rw_range_sett::get_objects_shift(
167
170
{
168
171
const exprt simp_distance=simplify_expr (shift.distance (), ns);
169
172
173
+ auto op_bits=pointer_offset_bits (shift.op ().type (), ns);
174
+
170
175
range_spect src_size=
171
- to_range_spect ( pointer_offset_bits (shift. op (). type (), ns)) ;
176
+ op_bits. has_value ()? to_range_spect (*op_bits):- 1 ;
172
177
173
178
mp_integer dist;
174
179
if (range_start==-1 ||
@@ -224,12 +229,17 @@ void rw_range_sett::get_objects_member(
224
229
225
230
const struct_typet &struct_type=to_struct_type (type);
226
231
227
- range_spect offset=
228
- to_range_spect (
229
- member_offset_bits (
230
- struct_type,
231
- expr.get_component_name (),
232
- ns));
232
+ auto offset_bits=member_offset_bits (
233
+ struct_type,
234
+ expr.get_component_name (),
235
+ ns);
236
+
237
+ range_spect offset;
238
+
239
+ if (offset_bits.has_value ())
240
+ offset=to_range_spect (*offset_bits);
241
+ else
242
+ offset=-1 ;
233
243
234
244
if (offset!=-1 )
235
245
offset+=range_start;
@@ -253,15 +263,23 @@ void rw_range_sett::get_objects_index(
253
263
{
254
264
const vector_typet &vector_type=to_vector_type (type);
255
265
256
- sub_size=
257
- to_range_spect (pointer_offset_bits (vector_type.subtype (), ns));
266
+ auto subtype_bits=pointer_offset_bits (vector_type.subtype (), ns);
267
+
268
+ if (subtype_bits.has_value ())
269
+ sub_size=to_range_spect (*subtype_bits);
270
+ else
271
+ sub_size=-1 ;
258
272
}
259
273
else if (type.id ()==ID_array)
260
274
{
261
275
const array_typet &array_type=to_array_type (type);
262
276
263
- sub_size=
264
- to_range_spect (pointer_offset_bits (array_type.subtype (), ns));
277
+ auto subtype_bits=pointer_offset_bits (array_type.subtype (), ns);
278
+
279
+ if (subtype_bits.has_value ())
280
+ sub_size=to_range_spect (*subtype_bits);
281
+ else
282
+ sub_size=-1 ;
265
283
}
266
284
else
267
285
return ;
@@ -296,8 +314,14 @@ void rw_range_sett::get_objects_array(
296
314
const array_typet &array_type=
297
315
to_array_type (ns.follow (expr.type ()));
298
316
299
- range_spect sub_size=
300
- to_range_spect (pointer_offset_bits (array_type.subtype (), ns));
317
+ auto subtype_bits=pointer_offset_bits (array_type.subtype (), ns);
318
+
319
+ range_spect sub_size;
320
+
321
+ if (subtype_bits.has_value ())
322
+ sub_size=to_range_spect (*subtype_bits);
323
+ else
324
+ sub_size=-1 ;
301
325
302
326
if (sub_size==-1 )
303
327
{
@@ -336,17 +360,21 @@ void rw_range_sett::get_objects_struct(
336
360
const struct_typet &struct_type=
337
361
to_struct_type (ns.follow (expr.type ()));
338
362
363
+ auto struct_bits=pointer_offset_bits (struct_type, ns);
364
+
339
365
range_spect full_size=
340
- to_range_spect (pointer_offset_bits (struct_type, ns)) ;
366
+ struct_bits. has_value ()? to_range_spect (*struct_bits):- 1 ;
341
367
342
368
range_spect offset=0 ;
343
369
range_spect full_r_s=range_start==-1 ? 0 : range_start;
344
370
range_spect full_r_e=size==-1 || full_size==-1 ? -1 : full_r_s+size;
345
371
346
372
forall_operands (it, expr)
347
373
{
374
+ auto it_bits=pointer_offset_bits (it->type (), ns);
375
+
348
376
range_spect sub_size=
349
- to_range_spect (pointer_offset_bits (it-> type (), ns)) ;
377
+ it_bits. has_value ()? to_range_spect (*it_bits):- 1 ;
350
378
351
379
if (offset==-1 )
352
380
{
@@ -395,8 +423,10 @@ void rw_range_sett::get_objects_typecast(
395
423
{
396
424
const exprt &op=tc.op ();
397
425
426
+ auto op_bits=pointer_offset_bits (op.type (), ns);
427
+
398
428
range_spect new_size=
399
- to_range_spect ( pointer_offset_bits (op. type (), ns)) ;
429
+ op_bits. has_value ()? to_range_spect (*op_bits):- 1 ;
400
430
401
431
if (range_start==-1 )
402
432
new_size=-1 ;
@@ -528,8 +558,11 @@ void rw_range_sett::get_objects_rec(
528
558
{
529
559
const symbol_exprt &symbol=to_symbol_expr (expr);
530
560
const irep_idt identifier=symbol.get_identifier ();
561
+
562
+ auto symbol_bits=pointer_offset_bits (symbol.type (), ns);
563
+
531
564
range_spect full_size=
532
- to_range_spect ( pointer_offset_bits (symbol. type (), ns)) ;
565
+ symbol_bits. has_value ()? to_range_spect (*symbol_bits):- 1 ;
533
566
534
567
if (full_size==0 ||
535
568
(full_size>0 && range_start>=full_size))
@@ -575,8 +608,11 @@ void rw_range_sett::get_objects_rec(
575
608
576
609
void rw_range_sett::get_objects_rec (get_modet mode, const exprt &expr)
577
610
{
611
+ auto expr_bits=pointer_offset_bits (expr.type (), ns);
612
+
578
613
range_spect size=
579
- to_range_spect (pointer_offset_bits (expr.type (), ns));
614
+ expr_bits.has_value ()?to_range_spect (*expr_bits):-1 ;
615
+
580
616
get_objects_rec (mode, expr, 0 , size);
581
617
}
582
618
@@ -605,16 +641,24 @@ void rw_range_set_value_sett::get_objects_dereference(
605
641
exprt object=deref;
606
642
dereference (target, object, ns, value_sets);
607
643
608
- range_spect new_size=
609
- to_range_spect (pointer_offset_bits (object.type (), ns));
644
+ auto type_bits=pointer_offset_bits (object.type (), ns);
610
645
611
- if (range_start==- 1 || new_size<=range_start)
612
- new_size=- 1 ;
613
- else
646
+ range_spect new_size;
647
+
648
+ if (type_bits. has_value ())
614
649
{
615
- new_size-=range_start;
616
- new_size=std::min (size, new_size);
650
+ new_size=to_range_spect (*type_bits);
651
+
652
+ if (range_start==-1 || new_size<=range_start)
653
+ new_size=-1 ;
654
+ else
655
+ {
656
+ new_size-=range_start;
657
+ new_size=std::min (size, new_size);
658
+ }
617
659
}
660
+ else
661
+ new_size=-1 ;
618
662
619
663
// value_set_dereferencet::build_reference_to will turn *p into
620
664
// DYNAMIC_OBJECT(p) ? *p : invalid_objectN
0 commit comments