1111
1212#include " pointer_offset_size.h"
1313
14- #include < cassert>
15-
1614#include " c_types.h"
1715#include " expr.h"
16+ #include " invariant.h"
1817#include " arith_tools.h"
1918#include " std_types.h"
2019#include " std_expr.h"
2120#include " expr_util.h"
22- #include " config.h"
2321#include " simplify_expr.h"
2422#include " namespace.h"
2523#include " symbol.h"
@@ -103,14 +101,15 @@ mp_integer member_offset_bits(
103101 return offset;
104102}
105103
104+ // / Compute the size of a type in bytes, rounding up to full bytes
106105mp_integer pointer_offset_size (
107106 const typet &type,
108107 const namespacet &ns)
109108{
110109 mp_integer bits=pointer_offset_bits (type, ns);
111110 if (bits==-1 )
112111 return -1 ;
113- return bits/ 8 +(((bits% 8 )== 0 )? 0 : 1 ) ;
112+ return bits+ 7 / 8 ;
114113}
115114
116115mp_integer pointer_offset_bits (
@@ -234,7 +233,7 @@ mp_integer pointer_offset_bits(
234233 if (type.get_bool (ID_C_ptr32))
235234 return 32 ;
236235
237- return config. ansi_c . pointer_width ;
236+ return to_bitvector_type (type). get_width () ;
238237 }
239238 else if (type.id ()==ID_symbol)
240239 {
@@ -495,7 +494,7 @@ exprt size_of_expr(
495494 if (type.get_bool (ID_C_ptr32))
496495 return from_integer (4 , size_type ());
497496
498- std::size_t width=config. ansi_c . pointer_width ;
497+ std::size_t width=to_bitvector_type (type). get_width () ;
499498 std::size_t bytes=width/8 ;
500499 if (bytes*8 !=width)
501500 bytes++;
@@ -531,12 +530,13 @@ mp_integer compute_pointer_offset(
531530 }
532531 else if (expr.id ()==ID_index)
533532 {
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 ());
535538
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);
540540
541541 if (o!=-1 )
542542 {
@@ -545,29 +545,27 @@ mp_integer compute_pointer_offset(
545545
546546 mp_integer i;
547547
548- if (sub_size>0 && !to_integer (expr. op1 (), i))
548+ if (sub_size>0 && !to_integer (index_expr. index (), i))
549549 return o+i*sub_size;
550550 }
551551
552552 // don't know
553553 }
554554 else if (expr.id ()==ID_member)
555555 {
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 ()));
561559
562- mp_integer o=compute_pointer_offset (expr. op0 () , ns);
560+ mp_integer o=compute_pointer_offset (op , ns);
563561
564562 if (o!=-1 )
565563 {
566564 if (type.id ()==ID_union)
567565 return o;
568566
569567 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);
571569 }
572570 }
573571 else if (expr.id ()==ID_string_constant)
@@ -594,8 +592,10 @@ exprt build_sizeof_expr(
594592 (type_size==0 && val>0 ))
595593 return nil_exprt ();
596594
597- assert (address_bits (val+1 )<=config.ansi_c .pointer_width );
598595 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" );
599599
600600 mp_integer remainder=0 ;
601601 if (type_size!=0 )
0 commit comments