Skip to content

Commit 8425bf4

Browse files
author
Daniel Kroening
authored
Merge pull request #970 from diffblue/pointers-with-width
Pointers get a width
2 parents 0423be7 + d3c0b57 commit 8425bf4

22 files changed

+71
-95
lines changed

regression/invariants/driver.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ Author: Chris Smowton, [email protected]
1111

1212
#include <string>
1313
#include <sstream>
14+
1415
#include <util/invariant.h>
1516
#include <util/invariant_utils.h>
1617
#include <util/std_types.h>
18+
#include <util/c_types.h>
1719

1820
/// An example of structured invariants-- this contains fields to
1921
/// describe the error to a catcher, and also produces a human-readable
@@ -86,7 +88,7 @@ int main(int argc, char** argv)
8688
else if(arg=="data-invariant-string")
8789
DATA_INVARIANT(false, "Test invariant failure");
8890
else if(arg=="irep")
89-
INVARIANT_WITH_IREP(false, "error with irep", pointer_typet(void_typet()));
91+
INVARIANT_WITH_IREP(false, "error with irep", pointer_type(void_typet()));
9092
else
9193
return 1;
9294
}

src/ansi-c/ansi_c_convert_type.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,13 @@ void ansi_c_convert_typet::read_rec(const typet &type)
216216
{
217217
c_storage_spec.alias=type.subtype().get(ID_value);
218218
}
219+
else if(type.id()==ID_pointer)
220+
{
221+
// pointers have a width, much like integers
222+
pointer_typet tmp=to_pointer_type(type);
223+
tmp.set_width(config.ansi_c.pointer_width);
224+
other.push_back(tmp);
225+
}
219226
else
220227
other.push_back(type);
221228
}

src/ansi-c/c_typecheck_type.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ void c_typecheck_baset::typecheck_type(typet &type)
7676
else if(type.id()==ID_array)
7777
typecheck_array_type(to_array_type(type));
7878
else if(type.id()==ID_pointer)
79+
{
7980
typecheck_type(type.subtype());
81+
INVARIANT(!type.get(ID_width).empty(), "pointers must have width");
82+
}
8083
else if(type.id()==ID_struct ||
8184
type.id()==ID_union)
8285
typecheck_compound_type(to_struct_union_type(type));

src/cpp/cpp_typecheck_constructor.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,7 @@ void cpp_typecheckt::default_cpctor(
223223
cpp_declaratort parameter_tor;
224224
parameter_tor.add(ID_value).make_nil();
225225
parameter_tor.set(ID_name, cpp_parameter);
226-
parameter_tor.type()=reference_typet();
227-
parameter_tor.type().subtype().make_nil();
226+
parameter_tor.type()=reference_type(nil_typet());
228227
parameter_tor.add_source_location()=source_location;
229228

230229
// Parameter declaration
@@ -388,9 +387,8 @@ void cpp_typecheckt::default_assignop(
388387
declarator_name.get_sub().push_back(irept("="));
389388

390389
declarator_type.id(ID_function_type);
391-
declarator_type.subtype()=reference_typet();
390+
declarator_type.subtype()=reference_type(nil_typet());
392391
declarator_type.subtype().add("#qualifier").make_nil();
393-
declarator_type.subtype().subtype().make_nil();
394392

395393
exprt &args=static_cast<exprt&>(declarator.type().add(ID_parameters));
396394
args.add_source_location()=source_location;

src/cpp/cpp_typecheck_conversions.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -1280,11 +1280,8 @@ bool cpp_typecheckt::reference_binding(
12801280
if(reference_compatible(expr, type, rank))
12811281
{
12821282
{
1283-
address_of_exprt tmp;
1283+
address_of_exprt tmp(expr, reference_type(expr.type()));
12841284
tmp.add_source_location()=expr.source_location();
1285-
tmp.object()=expr;
1286-
tmp.type()=pointer_type(tmp.op0().type());
1287-
tmp.type().set(ID_C_reference, true);
12881285
new_expr.swap(tmp);
12891286
}
12901287

@@ -1411,10 +1408,7 @@ bool cpp_typecheckt::reference_binding(
14111408

14121409
if(user_defined_conversion_sequence(arg_expr, type.subtype(), new_expr, rank))
14131410
{
1414-
address_of_exprt tmp;
1415-
tmp.type()=pointer_type(new_expr.type());
1416-
tmp.object()=new_expr;
1417-
tmp.type().set(ID_C_reference, true);
1411+
address_of_exprt tmp(new_expr, reference_type(new_expr.type()));
14181412
tmp.add_source_location()=new_expr.source_location();
14191413
new_expr.swap(tmp);
14201414
return true;

src/cpp/cpp_typecheck_type.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ 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>
1718

1819
#include <ansi-c/c_qualifiers.h>
1920

@@ -81,6 +82,9 @@ void cpp_typecheckt::typecheck_type(typet &type)
8182
// the pointer might have a qualifier, but do subtype first
8283
typecheck_type(type.subtype());
8384

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

src/cpp/parse.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -3015,7 +3015,7 @@ bool Parser::optPtrOperator(typet &ptrs)
30153015

30163016
if(t=='*')
30173017
{
3018-
pointer_typet op;
3018+
typet op(ID_pointer);
30193019
cpp_tokent tk;
30203020
lex.get_token(tk);
30213021
set_location(op, tk);

src/goto-symex/symex_builtin_functions.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -165,20 +165,20 @@ void goto_symext::symex_malloc(
165165

166166
new_symbol_table.add(value_symbol);
167167

168-
address_of_exprt rhs;
168+
exprt rhs;
169169

170170
if(object_type.id()==ID_array)
171171
{
172-
rhs.type()=pointer_type(value_symbol.type.subtype());
173172
index_exprt index_expr(value_symbol.type.subtype());
174173
index_expr.array()=value_symbol.symbol_expr();
175174
index_expr.index()=from_integer(0, index_type());
176-
rhs.op0()=index_expr;
175+
rhs=address_of_exprt(
176+
index_expr, pointer_type(value_symbol.type.subtype()));
177177
}
178178
else
179179
{
180-
rhs.op0()=value_symbol.symbol_expr();
181-
rhs.type()=pointer_type(value_symbol.type);
180+
rhs=address_of_exprt(
181+
value_symbol.symbol_expr(), pointer_type(value_symbol.type));
182182
}
183183

184184
if(rhs.type()!=lhs.type())

src/goto-symex/symex_dead.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,7 @@ void goto_symext::symex_dead(statet &state)
4545
exprt rhs;
4646

4747
if(failed.is_not_nil())
48-
{
49-
address_of_exprt address_of_expr;
50-
address_of_expr.object()=failed;
51-
address_of_expr.type()=code.op0().type();
52-
rhs=address_of_expr;
53-
}
48+
rhs=address_of_exprt(failed, to_pointer_type(code.op0().type()));
5449
else
5550
rhs=exprt(ID_invalid);
5651

src/goto-symex/symex_decl.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
6060
exprt rhs;
6161

6262
if(failed.is_not_nil())
63-
{
64-
address_of_exprt address_of_expr;
65-
address_of_expr.object()=failed;
66-
address_of_expr.type()=expr.type();
67-
rhs=address_of_expr;
68-
}
63+
rhs=address_of_exprt(failed, to_pointer_type(expr.type()));
6964
else
7065
rhs=exprt(ID_invalid);
7166

src/java_bytecode/java_bytecode_instrument.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ codet java_bytecode_instrumentt::throw_exception(
103103
get_message_handler());
104104
}
105105

106-
pointer_typet exc_ptr_type;
107-
exc_ptr_type.subtype()=symbol_typet(exc_class_name);
106+
pointer_typet exc_ptr_type=
107+
pointer_type(symbol_typet(exc_class_name));
108108

109109
// Allocate and throw an instance of the exception class:
110110

src/java_bytecode/java_string_library_preprocess.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1304,8 +1304,7 @@ exprt java_string_library_preprocesst::get_object_at_index(
13041304
{
13051305
dereference_exprt deref_objs(argv, argv.type().subtype());
13061306
pointer_typet empty_pointer=pointer_type(empty_typet());
1307-
pointer_typet pointer_of_pointer;
1308-
pointer_of_pointer.copy_to_subtypes(empty_pointer);
1307+
pointer_typet pointer_of_pointer=pointer_type(empty_pointer);
13091308
member_exprt data_member(deref_objs, "data", pointer_of_pointer);
13101309
plus_exprt data_pointer_plus_index(
13111310
data_member, from_integer(index, java_int_type()), data_member.type());

src/java_bytecode/java_types.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ typet java_boolean_type()
6767

6868
reference_typet java_reference_type(const typet &subtype)
6969
{
70-
return to_reference_type(reference_type(subtype));
70+
return reference_type(subtype);
7171
}
7272

7373
reference_typet java_lang_object_type()
@@ -246,11 +246,10 @@ typet java_type_from_string(const std::string &src)
246246
class_name[i]='.';
247247

248248
std::string identifier="java::"+class_name;
249+
symbol_typet symbol_type(identifier);
250+
symbol_type.set(ID_C_base_name, class_name);
249251

250-
reference_typet result;
251-
result.subtype()=symbol_typet(identifier);
252-
result.subtype().set(ID_C_base_name, class_name);
253-
return result;
252+
return java_reference_type(symbol_type);
254253
}
255254

256255
default:

src/path-symex/path_symex.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -245,20 +245,20 @@ void path_symext::symex_malloc(
245245
value_symbol.type.set("#dynamic", true);
246246
value_symbol.mode=ID_C;
247247

248-
address_of_exprt rhs;
248+
exprt rhs;
249249

250250
if(object_type.id()==ID_array)
251251
{
252-
rhs.type()=pointer_type(value_symbol.type.subtype());
253252
index_exprt index_expr(value_symbol.type.subtype());
254253
index_expr.array()=value_symbol.symbol_expr();
255254
index_expr.index()=from_integer(0, index_type());
256-
rhs.op0()=index_expr;
255+
rhs=address_of_exprt(
256+
index_expr, pointer_type(value_symbol.type.subtype()));
257257
}
258258
else
259259
{
260-
rhs.op0()=value_symbol.symbol_expr();
261-
rhs.type()=pointer_type(value_symbol.type);
260+
rhs=address_of_exprt(
261+
value_symbol.symbol_expr(), pointer_type(value_symbol.type));
262262
}
263263

264264
if(rhs.type()!=lhs.type())

src/pointer-analysis/value_set.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1523,9 +1523,8 @@ void value_sett::apply_code(
15231523

15241524
if(failed.is_not_nil())
15251525
{
1526-
address_of_exprt address_of_expr;
1527-
address_of_expr.object()=failed;
1528-
address_of_expr.type()=lhs.type();
1526+
address_of_exprt address_of_expr(
1527+
failed, to_pointer_type(lhs.type()));
15291528
assign(lhs, address_of_expr, ns, false, false);
15301529
}
15311530
else

src/util/c_types.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -296,12 +296,12 @@ signedbv_typet pointer_diff_type()
296296

297297
pointer_typet pointer_type(const typet &subtype)
298298
{
299-
return pointer_typet(subtype);
299+
return pointer_typet(subtype, config.ansi_c.pointer_width);
300300
}
301301

302302
reference_typet reference_type(const typet &subtype)
303303
{
304-
return reference_typet(subtype);
304+
return reference_typet(subtype, config.ansi_c.pointer_width);
305305
}
306306

307307
typet void_type()

src/util/simplify_expr_pointer.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ bool simplify_exprt::simplify_address_of_arg(exprt &expr)
7878
if(!to_integer(expr.op1(), index) &&
7979
step_size!=-1)
8080
{
81-
pointer_typet pointer_type;
81+
pointer_typet pointer_type=
82+
to_pointer_type(to_dereference_expr(expr.op0()).pointer().type());
8283
pointer_type.subtype()=expr.type();
8384
typecast_exprt typecast_expr(
8485
from_integer(step_size*index+address, index_type()), pointer_type);
@@ -114,7 +115,8 @@ bool simplify_exprt::simplify_address_of_arg(exprt &expr)
114115
mp_integer offset=member_offset(struct_type, member, ns);
115116
if(offset!=-1)
116117
{
117-
pointer_typet pointer_type;
118+
pointer_typet pointer_type=
119+
to_pointer_type(to_dereference_expr(expr.op0()).pointer().type());
118120
pointer_type.subtype()=expr.type();
119121
typecast_exprt typecast_expr(
120122
from_integer(address+offset, index_type()), pointer_type);

src/util/std_expr.h

-5
Original file line numberDiff line numberDiff line change
@@ -2599,11 +2599,6 @@ class address_of_exprt:public unary_exprt
25992599
{
26002600
}
26012601

2602-
address_of_exprt():
2603-
unary_exprt(ID_address_of, pointer_typet())
2604-
{
2605-
}
2606-
26072602
exprt &object()
26082603
{
26092604
return op0();

src/util/std_types.h

-22
Original file line numberDiff line numberDiff line change
@@ -1367,16 +1367,6 @@ inline c_bit_field_typet &to_c_bit_field_type(typet &type)
13671367
class pointer_typet:public bitvector_typet
13681368
{
13691369
public:
1370-
pointer_typet():bitvector_typet(ID_pointer)
1371-
{
1372-
}
1373-
1374-
// this one will go away; use the one with width
1375-
explicit pointer_typet(const typet &_subtype):
1376-
bitvector_typet(ID_pointer, _subtype)
1377-
{
1378-
}
1379-
13801370
pointer_typet(const typet &_subtype, std::size_t width):
13811371
bitvector_typet(ID_pointer, _subtype, width)
13821372
{
@@ -1418,18 +1408,6 @@ inline pointer_typet &to_pointer_type(typet &type)
14181408
class reference_typet:public pointer_typet
14191409
{
14201410
public:
1421-
reference_typet()
1422-
{
1423-
set(ID_C_reference, true);
1424-
}
1425-
1426-
// this one will go away; use the one with width
1427-
explicit reference_typet(const typet &_subtype):
1428-
pointer_typet(_subtype)
1429-
{
1430-
set(ID_C_reference, true);
1431-
}
1432-
14331411
reference_typet(const typet &_subtype, std::size_t _width):
14341412
pointer_typet(_subtype, _width)
14351413
{

unit/analyses/does_remove_const/does_expr_lose_const.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@
1010
/// Does Remove Const Unit Tests
1111

1212
#include <catch.hpp>
13-
#include <analyses/does_remove_const.h>
13+
1414
#include <util/std_expr.h>
1515
#include <util/std_code.h>
1616
#include <util/std_types.h>
17+
#include <util/c_types.h>
18+
1719
#include <ansi-c/c_qualifiers.h>
1820
#include <goto-programs/goto_program.h>
21+
#include <analyses/does_remove_const.h>
1922
#include <analyses/does_remove_const/does_remove_const_util.h>
2023

21-
2224
SCENARIO("does_expr_lose_const",
2325
"[core][analyses][does_remove_const][does_expr_remove_const]")
2426
{
@@ -43,23 +45,23 @@ SCENARIO("does_expr_lose_const",
4345
// pointer (can be reassigned)
4446
// to int (value can be changed)
4547
// int *
46-
typet pointer_to_int_type=pointer_typet(non_const_primitive_type);
48+
typet pointer_to_int_type=pointer_type(non_const_primitive_type);
4749

4850
// const pointer (can't be reassigned)
4951
// to int (value can be changed)
5052
// int * const
51-
typet const_pointer_to_int_type=pointer_typet(non_const_primitive_type);
53+
typet const_pointer_to_int_type=pointer_type(non_const_primitive_type);
5254
const_qualifier.write(const_pointer_to_int_type);
5355

5456
// pointer (can be reassigned)
5557
// to const int (value can't be changed)
5658
// const int *
57-
typet pointer_to_const_int_type=pointer_typet(const_primitive_type);
59+
typet pointer_to_const_int_type=pointer_type(const_primitive_type);
5860

5961
// constant pointer (can't be reassigned)
6062
// to const int (value can't be changed)
6163
// const int * const
62-
typet const_pointer_to_const_int_type=pointer_typet(const_primitive_type);
64+
typet const_pointer_to_const_int_type=pointer_type(const_primitive_type);
6365
const_qualifier.write(const_pointer_to_const_int_type);
6466

6567
symbol_exprt const_primitive_symbol(

0 commit comments

Comments
 (0)