Skip to content

Commit 2a7f009

Browse files
author
Daniel Kroening
committed
use optional for unknown pointer offset sizes
1 parent e8aaf09 commit 2a7f009

28 files changed

+545
-387
lines changed

src/analyses/goto_rw.cpp

Lines changed: 72 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,12 @@ void rw_range_sett::get_objects_complex(
9292
const exprt &op=expr.op0();
9393
assert(op.type().id()==ID_complex);
9494

95-
range_spect sub_size=
96-
to_range_spect(pointer_offset_bits(op.type().subtype(), ns));
97-
assert(sub_size>0);
95+
auto subtype_bits=pointer_offset_bits(op.type().subtype(), ns);
96+
CHECK_RETURN(subtype_bits.has_value());
97+
98+
range_spect sub_size=to_range_spect(*subtype_bits);
99+
CHECK_RETURN(sub_size>0);
100+
98101
range_spect offset=
99102
(range_start==-1 || expr.id()==ID_complex_real) ? 0 : sub_size;
100103

@@ -167,8 +170,10 @@ void rw_range_sett::get_objects_shift(
167170
{
168171
const exprt simp_distance=simplify_expr(shift.distance(), ns);
169172

173+
auto op_bits=pointer_offset_bits(shift.op().type(), ns);
174+
170175
range_spect src_size=
171-
to_range_spect(pointer_offset_bits(shift.op().type(), ns));
176+
op_bits.has_value()?to_range_spect(*op_bits):-1;
172177

173178
mp_integer dist;
174179
if(range_start==-1 ||
@@ -224,12 +229,17 @@ void rw_range_sett::get_objects_member(
224229

225230
const struct_typet &struct_type=to_struct_type(type);
226231

227-
range_spect offset=
228-
to_range_spect(
229-
member_offset_bits(
230-
struct_type,
231-
expr.get_component_name(),
232-
ns));
232+
auto offset_bits=member_offset_bits(
233+
struct_type,
234+
expr.get_component_name(),
235+
ns);
236+
237+
range_spect offset;
238+
239+
if(offset_bits.has_value())
240+
offset=to_range_spect(*offset_bits);
241+
else
242+
offset=-1;
233243

234244
if(offset!=-1)
235245
offset+=range_start;
@@ -253,15 +263,23 @@ void rw_range_sett::get_objects_index(
253263
{
254264
const vector_typet &vector_type=to_vector_type(type);
255265

256-
sub_size=
257-
to_range_spect(pointer_offset_bits(vector_type.subtype(), ns));
266+
auto subtype_bits=pointer_offset_bits(vector_type.subtype(), ns);
267+
268+
if(subtype_bits.has_value())
269+
sub_size=to_range_spect(*subtype_bits);
270+
else
271+
sub_size=-1;
258272
}
259273
else if(type.id()==ID_array)
260274
{
261275
const array_typet &array_type=to_array_type(type);
262276

263-
sub_size=
264-
to_range_spect(pointer_offset_bits(array_type.subtype(), ns));
277+
auto subtype_bits=pointer_offset_bits(array_type.subtype(), ns);
278+
279+
if(subtype_bits.has_value())
280+
sub_size=to_range_spect(*subtype_bits);
281+
else
282+
sub_size=-1;
265283
}
266284
else
267285
return;
@@ -296,8 +314,14 @@ void rw_range_sett::get_objects_array(
296314
const array_typet &array_type=
297315
to_array_type(ns.follow(expr.type()));
298316

299-
range_spect sub_size=
300-
to_range_spect(pointer_offset_bits(array_type.subtype(), ns));
317+
auto subtype_bits=pointer_offset_bits(array_type.subtype(), ns);
318+
319+
range_spect sub_size;
320+
321+
if(subtype_bits.has_value())
322+
sub_size=to_range_spect(*subtype_bits);
323+
else
324+
sub_size=-1;
301325

302326
if(sub_size==-1)
303327
{
@@ -336,17 +360,21 @@ void rw_range_sett::get_objects_struct(
336360
const struct_typet &struct_type=
337361
to_struct_type(ns.follow(expr.type()));
338362

363+
auto struct_bits=pointer_offset_bits(struct_type, ns);
364+
339365
range_spect full_size=
340-
to_range_spect(pointer_offset_bits(struct_type, ns));
366+
struct_bits.has_value()?to_range_spect(*struct_bits):-1;
341367

342368
range_spect offset=0;
343369
range_spect full_r_s=range_start==-1 ? 0 : range_start;
344370
range_spect full_r_e=size==-1 || full_size==-1 ? -1 : full_r_s+size;
345371

346372
forall_operands(it, expr)
347373
{
374+
auto it_bits=pointer_offset_bits(it->type(), ns);
375+
348376
range_spect sub_size=
349-
to_range_spect(pointer_offset_bits(it->type(), ns));
377+
it_bits.has_value()?to_range_spect(*it_bits):-1;
350378

351379
if(offset==-1)
352380
{
@@ -395,8 +423,10 @@ void rw_range_sett::get_objects_typecast(
395423
{
396424
const exprt &op=tc.op();
397425

426+
auto op_bits=pointer_offset_bits(op.type(), ns);
427+
398428
range_spect new_size=
399-
to_range_spect(pointer_offset_bits(op.type(), ns));
429+
op_bits.has_value()?to_range_spect(*op_bits):-1;
400430

401431
if(range_start==-1)
402432
new_size=-1;
@@ -528,8 +558,11 @@ void rw_range_sett::get_objects_rec(
528558
{
529559
const symbol_exprt &symbol=to_symbol_expr(expr);
530560
const irep_idt identifier=symbol.get_identifier();
561+
562+
auto symbol_bits=pointer_offset_bits(symbol.type(), ns);
563+
531564
range_spect full_size=
532-
to_range_spect(pointer_offset_bits(symbol.type(), ns));
565+
symbol_bits.has_value()?to_range_spect(*symbol_bits):-1;
533566

534567
if(full_size==0 ||
535568
(full_size>0 && range_start>=full_size))
@@ -575,8 +608,11 @@ void rw_range_sett::get_objects_rec(
575608

576609
void rw_range_sett::get_objects_rec(get_modet mode, const exprt &expr)
577610
{
611+
auto expr_bits=pointer_offset_bits(expr.type(), ns);
612+
578613
range_spect size=
579-
to_range_spect(pointer_offset_bits(expr.type(), ns));
614+
expr_bits.has_value()?to_range_spect(*expr_bits):-1;
615+
580616
get_objects_rec(mode, expr, 0, size);
581617
}
582618

@@ -605,16 +641,24 @@ void rw_range_set_value_sett::get_objects_dereference(
605641
exprt object=deref;
606642
dereference(target, object, ns, value_sets);
607643

608-
range_spect new_size=
609-
to_range_spect(pointer_offset_bits(object.type(), ns));
644+
auto type_bits=pointer_offset_bits(object.type(), ns);
610645

611-
if(range_start==-1 || new_size<=range_start)
612-
new_size=-1;
613-
else
646+
range_spect new_size;
647+
648+
if(type_bits.has_value())
614649
{
615-
new_size-=range_start;
616-
new_size=std::min(size, new_size);
650+
new_size=to_range_spect(*type_bits);
651+
652+
if(range_start==-1 || new_size<=range_start)
653+
new_size=-1;
654+
else
655+
{
656+
new_size-=range_start;
657+
new_size=std::min(size, new_size);
658+
}
617659
}
660+
else
661+
new_size=-1;
618662

619663
// value_set_dereferencet::build_reference_to will turn *p into
620664
// DYNAMIC_OBJECT(p) ? *p : invalid_objectN

src/analyses/reaching_definitions.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,12 @@ void rd_range_domaint::transform_function_call(
210210
if(identifier.empty())
211211
continue;
212212

213-
range_spect size=
214-
to_range_spect(pointer_offset_bits(param.type(), ns));
215-
gen(from, identifier, 0, size);
213+
auto param_bits=pointer_offset_bits(param.type(), ns);
214+
if(param_bits.has_value())
215+
{
216+
range_spect size=to_range_spect(*param_bits);
217+
gen(from, identifier, 0, size);
218+
}
216219
}
217220
}
218221
else

src/ansi-c/expr2c.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3623,7 +3623,7 @@ std::string expr2ct::convert_with_precedence(
36233623
return convert_function(
36243624
src,
36253625
"__builtin_bswap"+
3626-
integer2string(pointer_offset_bits(src.op0().type(), ns)),
3626+
integer2string(*pointer_offset_bits(src.op0().type(), ns)),
36273627
precedence=16);
36283628

36293629
else if(src.id()==ID_isnormal)

src/ansi-c/padding.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ mp_integer alignment(const typet &type, const namespacet &ns)
7676
type.id()==ID_c_bool ||
7777
type.id()==ID_pointer)
7878
{
79-
result=pointer_offset_size(type, ns);
79+
result=*pointer_offset_size(type, ns);
8080
}
8181
else if(type.id()==ID_c_enum)
8282
result=alignment(type.subtype(), ns);
@@ -243,10 +243,10 @@ void add_padding(struct_typet &type, const namespacet &ns)
243243
}
244244
}
245245

246-
mp_integer size=pointer_offset_size(it_type, ns);
246+
auto size=pointer_offset_size(it_type, ns);
247247

248-
if(size!=-1)
249-
offset+=size;
248+
if(size.has_value())
249+
offset+=*size;
250250
}
251251

252252
// any explicit alignment for the struct?
@@ -301,9 +301,9 @@ void add_padding(union_typet &type, const namespacet &ns)
301301
// check per component, and ignore those without fixed size
302302
for(const auto &c : type.components())
303303
{
304-
mp_integer s=pointer_offset_bits(c.type(), ns);
305-
if(s>0)
306-
size_bits=std::max(size_bits, s);
304+
auto s=pointer_offset_bits(c.type(), ns);
305+
if(s.has_value())
306+
size_bits=std::max(size_bits, *s);
307307
}
308308

309309
// Is the union packed?

src/ansi-c/type2name.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ static std::string pointer_offset_bits_as_string(
8585
const typet &type,
8686
const namespacet &ns)
8787
{
88-
mp_integer bits = pointer_offset_bits(type, ns);
89-
CHECK_RETURN(bits != -1);
90-
return integer2string(bits);
88+
auto bits = pointer_offset_bits(type, ns);
89+
CHECK_RETURN(bits.has_value());
90+
return integer2string(*bits);
9191
}
9292

9393
static bool parent_is_sym_check=false;

src/goto-instrument/alignment_checks.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ void print_struct_alignment_problems(
4747
{
4848
const typet &it_type = it_next->type();
4949
const namespacet ns(symbol_table);
50-
mp_integer size = pointer_offset_size(it_type, ns);
50+
auto size = pointer_offset_size(it_type, ns);
5151

52-
if(size < 0)
52+
if(!size.has_value())
5353
throw "type of unknown size:\n" + it_type.pretty();
5454

55-
cumulated_length += size;
55+
cumulated_length += *size;
5656
// [it_mem;it_next] cannot be covered by an instruction
5757
if(cumulated_length > config.ansi_c.memory_operand_size)
5858
{
@@ -88,13 +88,13 @@ void print_struct_alignment_problems(
8888
#if 0
8989
const namespacet ns(symbol_table);
9090
const array_typet array=to_array_type(symbol_pair.second.type);
91-
const mp_integer size=
91+
const auto size=
9292
pointer_offset_size(array.subtype(), ns);
9393

94-
if(size<0)
94+
if(!size.has_value())
9595
throw "type of unknown size:\n"+it_type.pretty();
9696

97-
if(2*integer2long(size)<=config.ansi_c.memory_operand_size)
97+
if(2*integer2long(*size)<=config.ansi_c.memory_operand_size)
9898
{
9999
out << "\nWARNING: "
100100
<< "declaration of an array at "

0 commit comments

Comments
 (0)