Skip to content

Commit 00d25a2

Browse files
author
Daniel Kroening
committed
Pointers now come with a width
1 parent 0e0b501 commit 00d25a2

11 files changed

+52
-52
lines changed

src/ansi-c/ansi_c_convert_type.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ Author: Daniel Kroening, [email protected]
1414
#include <cassert>
1515

1616
#include <util/c_types.h>
17+
#include <util/config.h>
1718
#include <util/namespace.h>
1819
#include <util/simplify_expr.h>
19-
#include <util/config.h>
2020
#include <util/arith_tools.h>
2121
#include <util/std_types.h>
2222

@@ -221,9 +221,11 @@ void ansi_c_convert_typet::read_rec(const typet &type)
221221
// We turn ID_frontend_pointer to ID_pointer
222222
// Pointers have a width, much like integers,
223223
// which is added here.
224-
typet tmp(type);
225-
tmp.id(ID_pointer);
226-
tmp.set(ID_width, config.ansi_c.pointer_width);
224+
pointer_typet tmp(type.subtype(), config.ansi_c.pointer_width);
225+
tmp.add_source_location()=type.source_location();
226+
const irep_idt typedef_identifier=type.get(ID_C_typedef);
227+
if(!typedef_identifier.empty())
228+
tmp.set(ID_C_typedef, typedef_identifier);
227229
other.push_back(tmp);
228230
}
229231
else if(type.id()==ID_pointer)

src/ansi-c/c_preprocess.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Author: Daniel Kroening, [email protected]
2525

2626
#include <util/c_types.h>
2727
#include <util/config.h>
28+
#include <util/invariant.h>
2829
#include <util/message.h>
2930
#include <util/tempfile.h>
3031
#include <util/unicode.h>
@@ -430,14 +431,17 @@ bool c_preprocess_visual_studio(
430431
command_file << "/D__CPROVER__" << "\n";
431432
command_file << "/D__WORDSIZE=" << config.ansi_c.pointer_width << "\n";
432433

433-
if(config.ansi_c.pointer_width==64)
434+
if(pointer_diff_type()==signed_long_long_int_type())
434435
{
435436
command_file << "\"/D__PTRDIFF_TYPE__=long long int\"" << "\n";
436437
// yes, both _WIN32 and _WIN64 get defined
437438
command_file << "/D_WIN64" << "\n";
438439
}
439440
else
440441
{
442+
DATA_INVARIANT(
443+
pointer_diff_type()==signed_int_type(),
444+
"Pointer difference expected to be int typed");
441445
command_file << "/D__PTRDIFF_TYPE__=int" << "\n";
442446
command_file << "/U_WIN64" << "\n";
443447
}

src/ansi-c/padding.cpp

+3-8
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,15 @@ mp_integer alignment(const typet &type, const namespacet &ns)
7373
type.id()==ID_signedbv ||
7474
type.id()==ID_fixedbv ||
7575
type.id()==ID_floatbv ||
76-
type.id()==ID_c_bool)
76+
type.id()==ID_c_bool ||
77+
type.id()==ID_pointer)
7778
{
78-
std::size_t width=to_bitvector_type(type).get_width();
79-
result=width%8?width/8+1:width/8;
79+
result=pointer_offset_size(type, ns);
8080
}
8181
else if(type.id()==ID_c_enum)
8282
result=alignment(type.subtype(), ns);
8383
else if(type.id()==ID_c_enum_tag)
8484
result=alignment(ns.follow_tag(to_c_enum_tag_type(type)), ns);
85-
else if(type.id()==ID_pointer)
86-
{
87-
std::size_t width=config.ansi_c.pointer_width;
88-
result=width%8?width/8+1:width/8;
89-
}
9085
else if(type.id()==ID_symbol)
9186
result=alignment(ns.follow(type), ns);
9287
else if(type.id()==ID_c_bit_field)

src/cpp/cpp_convert_type.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,12 @@ void cpp_convert_typet::read_rec(const typet &type)
162162
else if(type.id()==ID_frontend_pointer)
163163
{
164164
// add width and turn into ID_pointer
165-
typet tmp=type;
166-
tmp.id(ID_pointer);
167-
tmp.set(ID_width, config.ansi_c.pointer_width);
165+
pointer_typet tmp(type.subtype(), config.ansi_c.pointer_width);
166+
tmp.add_source_location()=type.source_location();
167+
if(type.get_bool(ID_C_reference))
168+
tmp.set(ID_C_reference, true);
169+
if(type.get_bool(ID_C_rvalue_reference))
170+
tmp.set(ID_C_rvalue_reference, true);
168171
other.push_back(tmp);
169172
}
170173
else if(type.id()==ID_pointer)

src/cpp/cpp_typecheck_type.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ Author: Daniel Kroening, [email protected]
1414
#include <util/source_location.h>
1515
#include <util/simplify_expr.h>
1616
#include <util/c_types.h>
17-
#include <util/config.h>
1817

1918
#include <ansi-c/c_qualifiers.h>
2019

@@ -79,12 +78,10 @@ void cpp_typecheckt::typecheck_type(typet &type)
7978
}
8079
else if(type.id()==ID_pointer)
8180
{
82-
// the pointer might have a qualifier, but do subtype first
81+
// the pointer/reference might have a qualifier,
82+
// but do subtype first
8383
typecheck_type(type.subtype());
8484

85-
// we add a width, much like with integers
86-
to_pointer_type(type).set_width(config.ansi_c.pointer_width);
87-
8885
// Check if it is a pointer-to-member
8986
if(type.find("to-member").is_not_nil())
9087
{

src/goto-instrument/accelerate/polynomial_accelerator.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ Author: Matt Lewis
3737
#include <util/simplify_expr.h>
3838
#include <util/replace_expr.h>
3939
#include <util/arith_tools.h>
40-
#include <util/config.h>
4140

4241
#include "accelerator.h"
4342
#include "util.h"
@@ -345,9 +344,7 @@ bool polynomial_acceleratort::fit_polynomial_sliced(
345344
return false;
346345
}
347346

348-
unsigned width=to_bitvector_type(var.type()).get_width();
349-
if(var.type().id()==ID_pointer)
350-
width=config.ansi_c.pointer_width;
347+
std::size_t width=to_bitvector_type(var.type()).get_width();
351348
assert(width>0);
352349

353350
for(std::vector<expr_listt>::iterator it=parameters.begin();

src/solvers/flattening/boolbv_update.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ Author: Daniel Kroening, [email protected]
1212
#include <util/std_expr.h>
1313
#include <util/arith_tools.h>
1414
#include <util/base_type.h>
15-
#include <util/config.h>
1615
#include <util/pointer_offset_size.h>
1716

1817
#include <util/c_types.h>

src/solvers/flattening/boolbv_width.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Author: Daniel Kroening, [email protected]
1111
#include <algorithm>
1212

1313
#include <util/arith_tools.h>
14-
#include <util/config.h>
14+
#include <util/invariant.h>
1515
#include <util/std_types.h>
1616

1717
boolbv_widtht::boolbv_widtht(const namespacet &_ns):ns(_ns)
@@ -195,7 +195,8 @@ const boolbv_widtht::entryt &boolbv_widtht::get_entry(const typet &type) const
195195
}
196196
else if(type_id==ID_pointer)
197197
{
198-
entry.total_width=config.ansi_c.pointer_width;
198+
entry.total_width=to_pointer_type(type).get_width();
199+
DATA_INVARIANT(entry.total_width!=0, "pointer must have width");
199200
}
200201
else if(type_id==ID_symbol)
201202
entry=get_entry(ns.follow(type));

src/solvers/flattening/bv_pointers.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ bv_pointerst::bv_pointerst(
9696
pointer_logic(_ns)
9797
{
9898
object_bits=config.bv_encoding.object_bits;
99-
offset_bits=config.ansi_c.pointer_width-object_bits;
100-
bits=config.ansi_c.pointer_width;
99+
std::size_t pointer_width=boolbv_width(pointer_type(void_type()));
100+
offset_bits=pointer_width-object_bits;
101+
bits=pointer_width;
101102
}
102103

103104
bool bv_pointerst::convert_address_of_rec(
@@ -220,7 +221,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
220221
throw "convert_pointer_type got non-pointer type";
221222

222223
// make sure the config hasn't been changed
223-
assert(bits==config.ansi_c.pointer_width);
224+
PRECONDITION(bits==boolbv_width(expr.type()));
224225

225226
if(expr.id()==ID_symbol)
226227
{

src/util/pointer_offset_size.cpp

+20-20
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@ Author: Daniel Kroening, [email protected]
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
106105
mp_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

116115
mp_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)

src/util/simplify_expr.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,8 @@ bool simplify_exprt::simplify_typecast(exprt &expr)
204204
expr.op0().id()==ID_typecast &&
205205
expr.op0().operands().size()==1 &&
206206
(op_type.id()==ID_signedbv || op_type.id()==ID_unsignedbv) &&
207-
to_bitvector_type(op_type).get_width()>=config.ansi_c.pointer_width)
207+
to_bitvector_type(op_type).get_width()>=
208+
to_bitvector_type(expr_type).get_width())
208209
{
209210
exprt tmp=expr.op0().op0();
210211
expr.op0().swap(tmp);

0 commit comments

Comments
 (0)