11
11
12
12
#include " pointer_offset_size.h"
13
13
14
- #include < cassert>
15
-
16
14
#include " c_types.h"
17
15
#include " expr.h"
16
+ #include " invariant.h"
18
17
#include " arith_tools.h"
19
18
#include " std_types.h"
20
19
#include " std_expr.h"
21
20
#include " expr_util.h"
22
- #include " config.h"
23
21
#include " simplify_expr.h"
24
22
#include " namespace.h"
25
23
#include " symbol.h"
@@ -103,14 +101,15 @@ mp_integer member_offset_bits(
103
101
return offset;
104
102
}
105
103
104
+ // / Compute the size of a type in bytes, rounding up to full bytes
106
105
mp_integer pointer_offset_size (
107
106
const typet &type,
108
107
const namespacet &ns)
109
108
{
110
109
mp_integer bits=pointer_offset_bits (type, ns);
111
110
if (bits==-1 )
112
111
return -1 ;
113
- return bits/ 8 +((( bits% 8 )== 0 )? 0 : 1 ) ;
112
+ return ( bits+ 7 )/ 8 ;
114
113
}
115
114
116
115
mp_integer pointer_offset_bits (
@@ -234,7 +233,7 @@ mp_integer pointer_offset_bits(
234
233
if (type.get_bool (ID_C_ptr32))
235
234
return 32 ;
236
235
237
- return config. ansi_c . pointer_width ;
236
+ return to_bitvector_type (type). get_width () ;
238
237
}
239
238
else if (type.id ()==ID_symbol)
240
239
{
@@ -495,7 +494,7 @@ exprt size_of_expr(
495
494
if (type.get_bool (ID_C_ptr32))
496
495
return from_integer (4 , size_type ());
497
496
498
- std::size_t width=config. ansi_c . pointer_width ;
497
+ std::size_t width=to_bitvector_type (type). get_width () ;
499
498
std::size_t bytes=width/8 ;
500
499
if (bytes*8 !=width)
501
500
bytes++;
@@ -531,12 +530,13 @@ mp_integer compute_pointer_offset(
531
530
}
532
531
else if (expr.id ()==ID_index)
533
532
{
534
- assert (expr.operands ().size ()==2 );
533
+ const index_exprt &index_expr=to_index_expr (expr);
534
+ const typet &array_type=ns.follow (index_expr.array ().type ());
535
+ DATA_INVARIANT (
536
+ array_type.id ()==ID_array,
537
+ " index into array expected, found " +array_type.id_string ());
535
538
536
- const typet &array_type=ns.follow (expr.op0 ().type ());
537
- assert (array_type.id ()==ID_array);
538
-
539
- mp_integer o=compute_pointer_offset (expr.op0 (), ns);
539
+ mp_integer o=compute_pointer_offset (index_expr.array (), ns);
540
540
541
541
if (o!=-1 )
542
542
{
@@ -545,29 +545,27 @@ mp_integer compute_pointer_offset(
545
545
546
546
mp_integer i;
547
547
548
- if (sub_size>0 && !to_integer (expr. op1 (), i))
548
+ if (sub_size>0 && !to_integer (index_expr. index (), i))
549
549
return o+i*sub_size;
550
550
}
551
551
552
552
// don't know
553
553
}
554
554
else if (expr.id ()==ID_member)
555
555
{
556
- assert (expr.operands ().size ()==1 );
557
- const typet &type=ns.follow (expr.op0 ().type ());
558
-
559
- assert (type.id ()==ID_struct ||
560
- type.id ()==ID_union);
556
+ const member_exprt &member_expr=to_member_expr (expr);
557
+ const exprt &op=member_expr.struct_op ();
558
+ const struct_union_typet &type=to_struct_union_type (ns.follow (op.type ()));
561
559
562
- mp_integer o=compute_pointer_offset (expr. op0 () , ns);
560
+ mp_integer o=compute_pointer_offset (op , ns);
563
561
564
562
if (o!=-1 )
565
563
{
566
564
if (type.id ()==ID_union)
567
565
return o;
568
566
569
567
return o+member_offset (
570
- to_struct_type (type), expr. get (ID_component_name ), ns);
568
+ to_struct_type (type), member_expr. get_component_name ( ), ns);
571
569
}
572
570
}
573
571
else if (expr.id ()==ID_string_constant)
@@ -594,8 +592,10 @@ exprt build_sizeof_expr(
594
592
(type_size==0 && val>0 ))
595
593
return nil_exprt ();
596
594
597
- assert (address_bits (val+1 )<=config.ansi_c .pointer_width );
598
595
const typet t (size_type ());
596
+ DATA_INVARIANT (
597
+ address_bits (val+1 )<=pointer_offset_bits (t, ns),
598
+ " sizeof value does not fit size_type" );
599
599
600
600
mp_integer remainder =0 ;
601
601
if (type_size!=0 )
0 commit comments