@@ -91,9 +91,12 @@ void rw_range_sett::get_objects_complex(
91
91
const exprt &op=expr.op0 ();
92
92
assert (op.type ().id ()==ID_complex);
93
93
94
- range_spect sub_size=
95
- to_range_spect (pointer_offset_bits (op.type ().subtype (), ns));
96
- assert (sub_size>0 );
94
+ auto subtype_bits = pointer_offset_bits (op.type ().subtype (), ns);
95
+ CHECK_RETURN (subtype_bits.has_value ());
96
+
97
+ range_spect sub_size = to_range_spect (*subtype_bits);
98
+ CHECK_RETURN (sub_size > 0 );
99
+
97
100
range_spect offset=
98
101
(range_start==-1 || expr.id ()==ID_complex_real) ? 0 : sub_size;
99
102
@@ -166,8 +169,9 @@ void rw_range_sett::get_objects_shift(
166
169
{
167
170
const exprt simp_distance=simplify_expr (shift.distance (), ns);
168
171
169
- range_spect src_size=
170
- to_range_spect (pointer_offset_bits (shift.op ().type (), ns));
172
+ auto op_bits = pointer_offset_bits (shift.op ().type (), ns);
173
+
174
+ range_spect src_size = op_bits.has_value () ? to_range_spect (*op_bits) : -1 ;
171
175
172
176
mp_integer dist;
173
177
if (range_start==-1 ||
@@ -223,15 +227,18 @@ void rw_range_sett::get_objects_member(
223
227
224
228
const struct_typet &struct_type=to_struct_type (type);
225
229
226
- range_spect offset=
227
- to_range_spect (
228
- member_offset_bits (
229
- struct_type,
230
- expr.get_component_name (),
231
- ns));
230
+ auto offset_bits =
231
+ member_offset_bits (struct_type, expr.get_component_name (), ns);
232
232
233
- if (offset!=-1 )
234
- offset+=range_start;
233
+ range_spect offset;
234
+
235
+ if (offset_bits.has_value ())
236
+ {
237
+ offset = to_range_spect (*offset_bits);
238
+ offset += range_start;
239
+ }
240
+ else
241
+ offset = -1 ;
235
242
236
243
get_objects_rec (mode, expr.struct_op (), offset, size);
237
244
}
@@ -252,15 +259,17 @@ void rw_range_sett::get_objects_index(
252
259
{
253
260
const vector_typet &vector_type=to_vector_type (type);
254
261
255
- sub_size=
256
- to_range_spect (pointer_offset_bits (vector_type.subtype (), ns));
262
+ auto subtype_bits = pointer_offset_bits (vector_type.subtype (), ns);
263
+
264
+ sub_size = subtype_bits.has_value () ? to_range_spect (*subtype_bits) : -1 ;
257
265
}
258
266
else if (type.id ()==ID_array)
259
267
{
260
268
const array_typet &array_type=to_array_type (type);
261
269
262
- sub_size=
263
- to_range_spect (pointer_offset_bits (array_type.subtype (), ns));
270
+ auto subtype_bits = pointer_offset_bits (array_type.subtype (), ns);
271
+
272
+ sub_size = subtype_bits.has_value () ? to_range_spect (*subtype_bits) : -1 ;
264
273
}
265
274
else
266
275
return ;
@@ -295,10 +304,13 @@ void rw_range_sett::get_objects_array(
295
304
const array_typet &array_type=
296
305
to_array_type (ns.follow (expr.type ()));
297
306
298
- range_spect sub_size=
299
- to_range_spect (pointer_offset_bits (array_type.subtype (), ns));
307
+ auto subtype_bits = pointer_offset_bits (array_type.subtype (), ns);
300
308
301
- if (sub_size==-1 )
309
+ range_spect sub_size;
310
+
311
+ if (subtype_bits.has_value ())
312
+ sub_size = to_range_spect (*subtype_bits);
313
+ else
302
314
{
303
315
forall_operands (it, expr)
304
316
get_objects_rec (mode, *it, 0 , -1 );
@@ -335,17 +347,20 @@ void rw_range_sett::get_objects_struct(
335
347
const struct_typet &struct_type=
336
348
to_struct_type (ns.follow (expr.type ()));
337
349
338
- range_spect full_size=
339
- to_range_spect (pointer_offset_bits (struct_type, ns));
350
+ auto struct_bits = pointer_offset_bits (struct_type, ns);
351
+
352
+ range_spect full_size =
353
+ struct_bits.has_value () ? to_range_spect (*struct_bits) : -1 ;
340
354
341
355
range_spect offset=0 ;
342
356
range_spect full_r_s=range_start==-1 ? 0 : range_start;
343
357
range_spect full_r_e=size==-1 || full_size==-1 ? -1 : full_r_s+size;
344
358
345
359
forall_operands (it, expr)
346
360
{
347
- range_spect sub_size=
348
- to_range_spect (pointer_offset_bits (it->type (), ns));
361
+ auto it_bits = pointer_offset_bits (it->type (), ns);
362
+
363
+ range_spect sub_size = it_bits.has_value () ? to_range_spect (*it_bits) : -1 ;
349
364
350
365
if (offset==-1 )
351
366
{
@@ -394,8 +409,9 @@ void rw_range_sett::get_objects_typecast(
394
409
{
395
410
const exprt &op=tc.op ();
396
411
397
- range_spect new_size=
398
- to_range_spect (pointer_offset_bits (op.type (), ns));
412
+ auto op_bits = pointer_offset_bits (op.type (), ns);
413
+
414
+ range_spect new_size = op_bits.has_value () ? to_range_spect (*op_bits) : -1 ;
399
415
400
416
if (range_start==-1 )
401
417
new_size=-1 ;
@@ -527,8 +543,11 @@ void rw_range_sett::get_objects_rec(
527
543
{
528
544
const symbol_exprt &symbol=to_symbol_expr (expr);
529
545
const irep_idt identifier=symbol.get_identifier ();
530
- range_spect full_size=
531
- to_range_spect (pointer_offset_bits (symbol.type (), ns));
546
+
547
+ auto symbol_bits = pointer_offset_bits (symbol.type (), ns);
548
+
549
+ range_spect full_size =
550
+ symbol_bits.has_value () ? to_range_spect (*symbol_bits) : -1 ;
532
551
533
552
if (full_size==0 ||
534
553
(full_size>0 && range_start>=full_size))
@@ -574,8 +593,10 @@ void rw_range_sett::get_objects_rec(
574
593
575
594
void rw_range_sett::get_objects_rec (get_modet mode, const exprt &expr)
576
595
{
577
- range_spect size=
578
- to_range_spect (pointer_offset_bits (expr.type (), ns));
596
+ auto expr_bits = pointer_offset_bits (expr.type (), ns);
597
+
598
+ range_spect size = expr_bits.has_value () ? to_range_spect (*expr_bits) : -1 ;
599
+
579
600
get_objects_rec (mode, expr, 0 , size);
580
601
}
581
602
@@ -604,16 +625,24 @@ void rw_range_set_value_sett::get_objects_dereference(
604
625
exprt object=deref;
605
626
dereference (target, object, ns, value_sets);
606
627
607
- range_spect new_size=
608
- to_range_spect (pointer_offset_bits (object.type (), ns));
628
+ auto type_bits = pointer_offset_bits (object.type (), ns);
609
629
610
- if (range_start==- 1 || new_size<=range_start)
611
- new_size=- 1 ;
612
- else
630
+ range_spect new_size;
631
+
632
+ if (type_bits. has_value ())
613
633
{
614
- new_size-=range_start;
615
- new_size=std::min (size, new_size);
634
+ new_size = to_range_spect (*type_bits);
635
+
636
+ if (range_start == -1 || new_size <= range_start)
637
+ new_size = -1 ;
638
+ else
639
+ {
640
+ new_size -= range_start;
641
+ new_size = std::min (size, new_size);
642
+ }
616
643
}
644
+ else
645
+ new_size = -1 ;
617
646
618
647
// value_set_dereferencet::build_reference_to will turn *p into
619
648
// DYNAMIC_OBJECT(p) ? *p : invalid_objectN
0 commit comments