@@ -129,8 +129,7 @@ literalt bv_pointerst::convert_rest(const exprt &expr)
129
129
{
130
130
const pointer_typet &type = to_pointer_type (operands[0 ].type ());
131
131
132
- bvt invalid_bv;
133
- encode (pointer_logic.get_invalid_object (), type, invalid_bv);
132
+ bvt invalid_bv = encode (pointer_logic.get_invalid_object (), type);
134
133
135
134
const std::size_t object_bits =
136
135
bv_pointers_width.get_object_width (type);
@@ -195,25 +194,20 @@ bv_pointerst::bv_pointerst(
195
194
{
196
195
}
197
196
198
- bool bv_pointerst::convert_address_of_rec (
199
- const exprt &expr,
200
- bvt &bv)
197
+ optionalt<bvt> bv_pointerst::convert_address_of_rec (const exprt &expr)
201
198
{
202
199
if (expr.id ()==ID_symbol)
203
200
{
204
- add_addr (expr, bv);
205
- return false ;
201
+ return add_addr (expr);
206
202
}
207
203
else if (expr.id ()==ID_label)
208
204
{
209
- add_addr (expr, bv);
210
- return false ;
205
+ return add_addr (expr);
211
206
}
212
207
else if (expr.id () == ID_null_object)
213
208
{
214
209
pointer_typet pt = pointer_type (expr.type ());
215
- encode (pointer_logic.get_null_object (), pt, bv);
216
- return false ;
210
+ return encode (pointer_logic.get_null_object (), pt);
217
211
}
218
212
else if (expr.id ()==ID_index)
219
213
{
@@ -225,6 +219,8 @@ bool bv_pointerst::convert_address_of_rec(
225
219
pointer_typet type = pointer_type (expr.type ());
226
220
const std::size_t bits = boolbv_width (type);
227
221
222
+ bvt bv;
223
+
228
224
// recursive call
229
225
if (array_type.id ()==ID_pointer)
230
226
{
@@ -235,8 +231,10 @@ bool bv_pointerst::convert_address_of_rec(
235
231
else if (array_type.id ()==ID_array ||
236
232
array_type.id ()==ID_string_constant)
237
233
{
238
- if (convert_address_of_rec (array, bv))
239
- return true ;
234
+ auto bv_opt = convert_address_of_rec (array);
235
+ if (!bv_opt.has_value ())
236
+ return {};
237
+ bv = std::move (*bv_opt);
240
238
CHECK_RETURN (bv.size ()==bits);
241
239
}
242
240
else
@@ -246,26 +244,28 @@ bool bv_pointerst::convert_address_of_rec(
246
244
auto size = pointer_offset_size (array_type.subtype (), ns);
247
245
CHECK_RETURN (size.has_value () && *size >= 0 );
248
246
249
- offset_arithmetic (type, bv, *size, index );
247
+ bv = offset_arithmetic (type, bv, *size, index );
250
248
CHECK_RETURN (bv.size ()==bits);
251
- return false ;
249
+
250
+ return std::move (bv);
252
251
}
253
252
else if (expr.id ()==ID_byte_extract_little_endian ||
254
253
expr.id ()==ID_byte_extract_big_endian)
255
254
{
256
255
const auto &byte_extract_expr=to_byte_extract_expr (expr);
257
256
258
257
// recursive call
259
- if (convert_address_of_rec (byte_extract_expr.op (), bv))
260
- return true ;
258
+ auto bv_opt = convert_address_of_rec (byte_extract_expr.op ());
259
+ if (!bv_opt.has_value ())
260
+ return {};
261
261
262
262
pointer_typet type = pointer_type (expr.type ());
263
263
const std::size_t bits = boolbv_width (type);
264
- CHECK_RETURN (bv. size ()== bits);
264
+ CHECK_RETURN (bv_opt-> size () == bits);
265
265
266
- offset_arithmetic (type, bv , 1 , byte_extract_expr.offset ());
266
+ bvt bv = offset_arithmetic (type, *bv_opt , 1 , byte_extract_expr.offset ());
267
267
CHECK_RETURN (bv.size ()==bits);
268
- return false ;
268
+ return std::move (bv) ;
269
269
}
270
270
else if (expr.id ()==ID_member)
271
271
{
@@ -274,9 +274,11 @@ bool bv_pointerst::convert_address_of_rec(
274
274
const typet &struct_op_type=ns.follow (struct_op.type ());
275
275
276
276
// recursive call
277
- if (convert_address_of_rec (struct_op, bv))
278
- return true ;
277
+ auto bv_opt = convert_address_of_rec (struct_op);
278
+ if (!bv_opt.has_value ())
279
+ return {};
279
280
281
+ bvt bv = std::move (*bv_opt);
280
282
if (struct_op_type.id ()==ID_struct)
281
283
{
282
284
auto offset = member_offset (
@@ -285,7 +287,7 @@ bool bv_pointerst::convert_address_of_rec(
285
287
286
288
// add offset
287
289
pointer_typet type = pointer_type (expr.type ());
288
- offset_arithmetic (type, bv, *offset);
290
+ bv = offset_arithmetic (type, bv, *offset);
289
291
}
290
292
else
291
293
{
@@ -295,14 +297,13 @@ bool bv_pointerst::convert_address_of_rec(
295
297
// nothing to do, all members have offset 0
296
298
}
297
299
298
- return false ;
300
+ return std::move (bv) ;
299
301
}
300
302
else if (expr.id ()==ID_constant ||
301
303
expr.id ()==ID_string_constant ||
302
304
expr.id ()==ID_array)
303
305
{ // constant
304
- add_addr (expr, bv);
305
- return false ;
306
+ return add_addr (expr);
306
307
}
307
308
else if (expr.id ()==ID_if)
308
309
{
@@ -312,18 +313,18 @@ bool bv_pointerst::convert_address_of_rec(
312
313
313
314
bvt bv1, bv2;
314
315
315
- if (convert_address_of_rec (ifex.true_case (), bv1))
316
- return true ;
317
-
318
- if (convert_address_of_rec (ifex.false_case (), bv2))
319
- return true ;
316
+ auto bv1_opt = convert_address_of_rec (ifex.true_case ());
317
+ if (!bv1_opt.has_value ())
318
+ return {};
320
319
321
- bv=bv_utils.select (cond, bv1, bv2);
320
+ auto bv2_opt = convert_address_of_rec (ifex.false_case ());
321
+ if (!bv2_opt.has_value ())
322
+ return {};
322
323
323
- return false ;
324
+ return bv_utils. select (cond, *bv1_opt, *bv2_opt) ;
324
325
}
325
326
326
- return true ;
327
+ return {} ;
327
328
}
328
329
329
330
bvt bv_pointerst::convert_pointer_type (const exprt &expr)
@@ -385,34 +386,29 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
385
386
{
386
387
const address_of_exprt &address_of_expr = to_address_of_expr (expr);
387
388
388
- bvt bv;
389
- bv.resize (bits);
390
-
391
- if (convert_address_of_rec (address_of_expr.op (), bv))
389
+ auto bv_opt = convert_address_of_rec (address_of_expr.op ());
390
+ if (!bv_opt.has_value ())
392
391
{
392
+ bvt bv;
393
+ bv.resize (bits);
393
394
conversion_failed (address_of_expr, bv);
394
395
return bv;
395
396
}
396
397
397
- CHECK_RETURN (bv. size ()== bits);
398
- return bv ;
398
+ CHECK_RETURN (bv_opt-> size () == bits);
399
+ return *bv_opt ;
399
400
}
400
401
else if (expr.id ()==ID_constant)
401
402
{
402
403
irep_idt value=to_constant_expr (expr).get_value ();
403
404
404
- bvt bv;
405
- bv.resize (bits);
406
-
407
405
if (value==ID_NULL)
408
- encode (pointer_logic.get_null_object (), type, bv );
406
+ return encode (pointer_logic.get_null_object (), type);
409
407
else
410
408
{
411
409
mp_integer i = bvrep2integer (value, bits, false );
412
- bv= bv_utils.build_constant (i, bits);
410
+ return bv_utils.build_constant (i, bits);
413
411
}
414
-
415
- return bv;
416
412
}
417
413
else if (expr.id ()==ID_plus)
418
414
{
@@ -486,9 +482,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
486
482
sum=bv_utils.add (sum, op);
487
483
}
488
484
489
- offset_arithmetic (type, bv, size, sum);
490
-
491
- return bv;
485
+ return offset_arithmetic (type, bv, size, sum);
492
486
}
493
487
else if (expr.id ()==ID_minus)
494
488
{
@@ -511,7 +505,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
511
505
512
506
const unary_minus_exprt neg_op1 (minus_expr.rhs ());
513
507
514
- bvt bv = convert_bv (minus_expr.lhs ());
508
+ const bvt & bv = convert_bv (minus_expr.lhs ());
515
509
516
510
typet pointer_sub_type = minus_expr.rhs ().type ().subtype ();
517
511
mp_integer element_size;
@@ -529,9 +523,7 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
529
523
element_size = *element_size_opt;
530
524
}
531
525
532
- offset_arithmetic (type, bv, element_size, neg_op1);
533
-
534
- return bv;
526
+ return offset_arithmetic (type, bv, element_size, neg_op1);
535
527
}
536
528
else if (expr.id ()==ID_byte_extract_little_endian ||
537
529
expr.id ()==ID_byte_extract_big_endian)
@@ -743,26 +735,28 @@ exprt bv_pointerst::bv_get_rec(
743
735
return std::move (result);
744
736
}
745
737
746
- void bv_pointerst::encode (std::size_t addr, const pointer_typet &type, bvt &bv)
747
- const
738
+ bvt bv_pointerst::encode (std::size_t addr, const pointer_typet &type) const
748
739
{
749
740
const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
750
741
const std::size_t object_bits = bv_pointers_width.get_object_width (type);
751
742
752
- bv.resize (boolbv_width (type));
743
+ bvt bv;
744
+ bv.reserve (boolbv_width (type));
753
745
754
746
// set offset to zero
755
747
for (std::size_t i=0 ; i<offset_bits; i++)
756
- bv[i]= const_literal (false );
748
+ bv. push_back ( const_literal (false ) );
757
749
758
750
// set variable part
759
751
for (std::size_t i=0 ; i<object_bits; i++)
760
- bv[offset_bits+i]=const_literal ((addr&(std::size_t (1 )<<i))!=0 );
752
+ bv.push_back (const_literal ((addr & (std::size_t (1 ) << i)) != 0 ));
753
+
754
+ return bv;
761
755
}
762
756
763
- void bv_pointerst::offset_arithmetic (
757
+ bvt bv_pointerst::offset_arithmetic (
764
758
const pointer_typet &type,
765
- bvt &bv,
759
+ const bvt &bv,
766
760
const mp_integer &x)
767
761
{
768
762
const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
@@ -775,13 +769,16 @@ void bv_pointerst::offset_arithmetic(
775
769
bvt tmp=bv_utils.add (bv1, bv2);
776
770
777
771
// copy offset bits
772
+ bvt result = bv;
778
773
for (std::size_t i=0 ; i<offset_bits; i++)
779
- bv[i]=tmp[i];
774
+ result[i] = tmp[i];
775
+
776
+ return result;
780
777
}
781
778
782
- void bv_pointerst::offset_arithmetic (
779
+ bvt bv_pointerst::offset_arithmetic (
783
780
const pointer_typet &type,
784
- bvt &bv,
781
+ const bvt &bv,
785
782
const mp_integer &factor,
786
783
const exprt &index)
787
784
{
@@ -794,12 +791,12 @@ void bv_pointerst::offset_arithmetic(
794
791
const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
795
792
bv_index=bv_utils.extension (bv_index, offset_bits, rep);
796
793
797
- offset_arithmetic (type, bv, factor, bv_index);
794
+ return offset_arithmetic (type, bv, factor, bv_index);
798
795
}
799
796
800
- void bv_pointerst::offset_arithmetic (
797
+ bvt bv_pointerst::offset_arithmetic (
801
798
const pointer_typet &type,
802
- bvt &bv,
799
+ const bvt &bv,
803
800
const mp_integer &factor,
804
801
const bvt &index)
805
802
{
@@ -818,12 +815,15 @@ void bv_pointerst::offset_arithmetic(
818
815
bvt bv_tmp=bv_utils.add (bv, bv_index);
819
816
820
817
// copy lower parts of result
818
+ bvt result = bv;
821
819
const std::size_t offset_bits = bv_pointers_width.get_offset_width (type);
822
820
for (std::size_t i=0 ; i<offset_bits; i++)
823
- bv[i]=bv_tmp[i];
821
+ result[i] = bv_tmp[i];
822
+
823
+ return result;
824
824
}
825
825
826
- void bv_pointerst::add_addr (const exprt &expr, bvt &bv )
826
+ bvt bv_pointerst::add_addr (const exprt &expr)
827
827
{
828
828
std::size_t a=pointer_logic.add_object (expr);
829
829
@@ -838,7 +838,7 @@ void bv_pointerst::add_addr(const exprt &expr, bvt &bv)
838
838
" ); " +
839
839
" use the `--object-bits n` option to increase the maximum number" );
840
840
841
- encode (a, type, bv );
841
+ return encode (a, type);
842
842
}
843
843
844
844
void bv_pointerst::do_postponed (
@@ -859,9 +859,8 @@ void bv_pointerst::do_postponed(
859
859
bool is_dynamic=pointer_logic.is_dynamic_object (expr);
860
860
861
861
// only compare object part
862
- bvt bv;
863
862
pointer_typet pt = pointer_type (expr.type ());
864
- encode (number, pt, bv );
863
+ bvt bv = encode (number, pt);
865
864
866
865
bv.erase (bv.begin (), bv.begin ()+offset_bits);
867
866
@@ -904,9 +903,8 @@ void bv_pointerst::do_postponed(
904
903
size_expr.value (), postponed.expr .type ());
905
904
906
905
// only compare object part
907
- bvt bv;
908
906
pointer_typet pt = pointer_type (expr.type ());
909
- encode (number, pt, bv );
907
+ bvt bv = encode (number, pt);
910
908
911
909
bv.erase (bv.begin (), bv.begin ()+offset_bits);
912
910
0 commit comments