Skip to content

Commit 28beb6e

Browse files
committed
Cleanup use of dfcc_wrapper_programt::addr_of_*
We don't need to take local copies of expressions that are declared const at class level.
1 parent 8468683 commit 28beb6e

File tree

1 file changed

+55
-58
lines changed

1 file changed

+55
-58
lines changed

src/goto-instrument/contracts/dynamic-frames/dfcc_wrapper_program.cpp

Lines changed: 55 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -291,17 +291,18 @@ void dfcc_wrapper_programt::encode_requires_write_set()
291291
// assume_ensures_ctx = false,
292292
// assert_ensures_ctx = false,
293293
// )
294-
const auto write_set = requires_write_set;
295-
preamble.add(goto_programt::make_decl(write_set, wrapper_sl));
294+
preamble.add(goto_programt::make_decl(requires_write_set, wrapper_sl));
296295

297-
const auto address_of_write_set = addr_of_requires_write_set;
298-
preamble.add(goto_programt::make_decl(address_of_write_set, wrapper_sl));
296+
preamble.add(
297+
goto_programt::make_decl(addr_of_requires_write_set, wrapper_sl));
299298
preamble.add(goto_programt::make_assignment(
300-
address_of_write_set, address_of_exprt(write_set), wrapper_sl));
299+
addr_of_requires_write_set,
300+
address_of_exprt(requires_write_set),
301+
wrapper_sl));
301302

302303
bool check_mode = contract_mode == dfcc_contract_modet::CHECK;
303304
code_function_callt call = library.write_set_create_call(
304-
address_of_write_set,
305+
addr_of_requires_write_set,
305306
from_integer(0, size_type()),
306307
from_integer(0, size_type()),
307308
make_boolean_expr(check_mode),
@@ -317,7 +318,7 @@ void dfcc_wrapper_programt::encode_requires_write_set()
317318
// check for absence of allocation/deallocation in requires clauses
318319
// ```c
319320
// DECL __check_no_alloc: bool;
320-
// CALL __check_no_alloc = check_empty_alloc_dealloc(write_set);
321+
// CALL __check_no_alloc = check_empty_alloc_dealloc(requilres_write_set);
321322
// ASSERT __check_no_alloc;
322323
// DEAD __check_no_alloc: bool;
323324
// ```
@@ -334,7 +335,7 @@ void dfcc_wrapper_programt::encode_requires_write_set()
334335

335336
postamble.add(goto_programt::make_function_call(
336337
library.write_set_check_allocated_deallocated_is_empty_call(
337-
check_var, address_of_write_set, wrapper_sl),
338+
check_var, addr_of_requires_write_set, wrapper_sl),
338339
wrapper_sl));
339340

340341
source_locationt check_sl(wrapper_sl);
@@ -347,9 +348,9 @@ void dfcc_wrapper_programt::encode_requires_write_set()
347348

348349
// generate write set release and DEAD instructions
349350
postamble.add(goto_programt::make_function_call(
350-
library.write_set_release_call(address_of_write_set, wrapper_sl),
351+
library.write_set_release_call(addr_of_requires_write_set, wrapper_sl),
351352
wrapper_sl));
352-
postamble.add(goto_programt::make_dead(write_set, wrapper_sl));
353+
postamble.add(goto_programt::make_dead(requires_write_set, wrapper_sl));
353354
}
354355

355356
void dfcc_wrapper_programt::encode_ensures_write_set()
@@ -363,18 +364,18 @@ void dfcc_wrapper_programt::encode_ensures_write_set()
363364
// assume_ensures_ctx = contract_mode != check,
364365
// assert_ensures_ctx = contract_mode == check,
365366
// )
366-
const auto write_set = ensures_write_set;
367-
preamble.add(goto_programt::make_decl(write_set, wrapper_sl));
367+
preamble.add(goto_programt::make_decl(ensures_write_set, wrapper_sl));
368368

369-
const auto address_of_write_set = addr_of_ensures_write_set;
370-
preamble.add(goto_programt::make_decl(address_of_write_set, wrapper_sl));
369+
preamble.add(goto_programt::make_decl(addr_of_ensures_write_set, wrapper_sl));
371370
preamble.add(goto_programt::make_assignment(
372-
address_of_write_set, address_of_exprt(write_set), wrapper_sl));
371+
addr_of_ensures_write_set,
372+
address_of_exprt(ensures_write_set),
373+
wrapper_sl));
373374

374375
bool check_mode = contract_mode == dfcc_contract_modet::CHECK;
375376

376377
code_function_callt call = library.write_set_create_call(
377-
address_of_write_set,
378+
addr_of_ensures_write_set,
378379
from_integer(0, size_type()),
379380
from_integer(0, size_type()),
380381
false_exprt(),
@@ -392,14 +393,14 @@ void dfcc_wrapper_programt::encode_ensures_write_set()
392393
{
393394
link_allocated_caller.add(goto_programt::make_function_call(
394395
library.link_allocated_call(
395-
address_of_write_set, caller_write_set, wrapper_sl),
396+
addr_of_ensures_write_set, caller_write_set, wrapper_sl),
396397
wrapper_sl));
397398
}
398399

399400
// check for absence of allocation/deallocation in contract clauses
400401
// ```c
401402
// DECL __check_no_alloc: bool;
402-
// CALL __check_no_alloc = check_empty_alloc_dealloc(write_set);
403+
// CALL __check_no_alloc = check_empty_alloc_dealloc(ensures_write_set);
403404
// ASSERT __check_no_alloc;
404405
// DEAD __check_no_alloc: bool;
405406
// ```
@@ -416,7 +417,7 @@ void dfcc_wrapper_programt::encode_ensures_write_set()
416417

417418
postamble.add(goto_programt::make_function_call(
418419
library.write_set_check_allocated_deallocated_is_empty_call(
419-
check_var, address_of_write_set, wrapper_sl),
420+
check_var, addr_of_ensures_write_set, wrapper_sl),
420421
wrapper_sl));
421422

422423
source_locationt check_sl(wrapper_sl);
@@ -430,32 +431,33 @@ void dfcc_wrapper_programt::encode_ensures_write_set()
430431

431432
// generate write set release
432433
postamble.add(goto_programt::make_function_call(
433-
library.write_set_release_call(address_of_write_set, wrapper_sl),
434+
library.write_set_release_call(addr_of_ensures_write_set, wrapper_sl),
434435
wrapper_sl));
435436

436437
// declare write set DEAD
437-
postamble.add(goto_programt::make_dead(write_set, wrapper_sl));
438+
postamble.add(goto_programt::make_dead(ensures_write_set, wrapper_sl));
438439
}
439440

440441
void dfcc_wrapper_programt::encode_contract_write_set()
441442
{
442-
const auto write_set = contract_write_set;
443-
preamble.add(goto_programt::make_decl(write_set, wrapper_sl));
443+
preamble.add(goto_programt::make_decl(contract_write_set, wrapper_sl));
444444

445-
const auto address_of_contract_write_set = addr_of_contract_write_set;
446445
preamble.add(
447-
goto_programt::make_decl(address_of_contract_write_set, wrapper_sl));
446+
goto_programt::make_decl(addr_of_contract_write_set, wrapper_sl));
448447
preamble.add(goto_programt::make_assignment(
449-
address_of_contract_write_set, address_of_exprt(write_set), wrapper_sl));
448+
addr_of_contract_write_set,
449+
address_of_exprt(contract_write_set),
450+
wrapper_sl));
450451

451452
// We use the empty write set used to check ensures for side effects
452453
// to check for side effects in the assigns and frees functions as well
453-
const auto address_of_requires_write_set = addr_of_requires_write_set;
454+
// TODO: I don't know what the above comment means, why was there an empty
455+
// write set here?
454456

455457
// call write_set_create
456458
{
457459
code_function_callt call = library.write_set_create_call(
458-
address_of_contract_write_set,
460+
addr_of_contract_write_set,
459461
from_integer(contract_functions.get_nof_assigns_targets(), size_type()),
460462
from_integer(contract_functions.get_nof_frees_targets(), size_type()),
461463
false_exprt(),
@@ -489,10 +491,10 @@ void dfcc_wrapper_programt::encode_contract_write_set()
489491
arguments.push_back(arg);
490492

491493
// pass write set to populate
492-
arguments.emplace_back(address_of_contract_write_set);
494+
arguments.emplace_back(addr_of_contract_write_set);
493495

494496
// pass the empty write set to check side effects against
495-
arguments.emplace_back(address_of_requires_write_set);
497+
arguments.emplace_back(addr_of_requires_write_set);
496498

497499
write_set_checks.add(goto_programt::make_function_call(call, wrapper_sl));
498500
}
@@ -508,56 +510,55 @@ void dfcc_wrapper_programt::encode_contract_write_set()
508510
arguments.push_back(arg);
509511

510512
// pass write set to populate
511-
arguments.emplace_back(address_of_contract_write_set);
513+
arguments.emplace_back(addr_of_contract_write_set);
512514

513515
// pass the empty write set to check side effects against
514-
arguments.emplace_back(address_of_requires_write_set);
516+
arguments.emplace_back(addr_of_requires_write_set);
515517

516518
write_set_checks.add(goto_programt::make_function_call(call, wrapper_sl));
517519
}
518520

519521
// generate write set release and DEAD instructions
520522
postamble.add(goto_programt::make_function_call(
521-
library.write_set_release_call(address_of_contract_write_set, wrapper_sl),
523+
library.write_set_release_call(addr_of_contract_write_set, wrapper_sl),
522524
wrapper_sl));
523-
postamble.add(goto_programt::make_dead(write_set, wrapper_sl));
525+
postamble.add(
526+
goto_programt::make_dead(addr_of_contract_write_set, wrapper_sl));
524527
}
525528

526529
void dfcc_wrapper_programt::encode_is_fresh_set()
527530
{
528-
const auto object_set = is_fresh_set;
529-
preamble.add(goto_programt::make_decl(object_set, wrapper_sl));
531+
preamble.add(goto_programt::make_decl(is_fresh_set, wrapper_sl));
530532

531-
const auto address_of_object_set = addr_of_is_fresh_set;
532-
preamble.add(goto_programt::make_decl(address_of_object_set, wrapper_sl));
533+
preamble.add(goto_programt::make_decl(addr_of_is_fresh_set, wrapper_sl));
533534
preamble.add(goto_programt::make_assignment(
534-
address_of_object_set, address_of_exprt(object_set), wrapper_sl));
535+
addr_of_is_fresh_set, address_of_exprt(is_fresh_set), wrapper_sl));
535536

536537
// CALL obj_set_create_indexed_by_object_id(is_fresh_set) in preamble
537538
preamble.add(goto_programt::make_function_call(
538539
library.obj_set_create_indexed_by_object_id_call(
539-
address_of_object_set, wrapper_sl),
540+
addr_of_is_fresh_set, wrapper_sl),
540541
wrapper_sl));
541542

542543
// link to requires write set
543544
link_is_fresh.add(goto_programt::make_function_call(
544545
library.link_is_fresh_call(
545-
addr_of_requires_write_set, address_of_object_set, wrapper_sl),
546+
addr_of_requires_write_set, addr_of_is_fresh_set, wrapper_sl),
546547
wrapper_sl));
547548

548549
// link to ensures write set
549550
link_is_fresh.add(goto_programt::make_function_call(
550551
library.link_is_fresh_call(
551-
addr_of_ensures_write_set, address_of_object_set, wrapper_sl),
552+
addr_of_ensures_write_set, addr_of_is_fresh_set, wrapper_sl),
552553
wrapper_sl));
553554

554555
// release call in postamble
555556
postamble.add(goto_programt::make_function_call(
556-
library.obj_set_release_call(address_of_object_set, wrapper_sl),
557+
library.obj_set_release_call(addr_of_is_fresh_set, wrapper_sl),
557558
wrapper_sl));
558559

559560
// DEAD instructions in postamble
560-
postamble.add(goto_programt::make_dead(object_set, wrapper_sl));
561+
postamble.add(goto_programt::make_dead(is_fresh_set, wrapper_sl));
561562
}
562563

563564
void dfcc_wrapper_programt::encode_requires_clauses()
@@ -594,7 +595,6 @@ void dfcc_wrapper_programt::encode_requires_clauses()
594595
codet requires_statement(statement_type, {std::move(requires)}, sl);
595596
converter.goto_convert(requires_statement, requires_program, language_mode);
596597
}
597-
const auto address_of_requires_write_set = addr_of_requires_write_set;
598598

599599
// fix calls to user-defined memory predicates
600600
memory_predicates.fix_calls(requires_program);
@@ -603,7 +603,7 @@ void dfcc_wrapper_programt::encode_requires_clauses()
603603
instrument.instrument_goto_program(
604604
wrapper_id,
605605
requires_program,
606-
address_of_requires_write_set,
606+
addr_of_requires_write_set,
607607
function_pointer_contracts);
608608

609609
// append resulting program to preconditions section
@@ -626,8 +626,9 @@ void dfcc_wrapper_programt::encode_ensures_clauses()
626626
// translate each ensures clause
627627
for(const auto &e : contract_code_type.ensures())
628628
{
629-
exprt ensures = to_lambda_expr(e).application(contract_lambda_parameters);
630-
ensures.add_source_location() = e.source_location();
629+
exprt ensures = to_lambda_expr(e)
630+
.application(contract_lambda_parameters)
631+
.with_source_location<exprt>(e);
631632

632633
if(has_subexpr(ensures, ID_exists) || has_subexpr(ensures, ID_forall))
633634
add_quantified_variable(goto_model.symbol_table, ensures, language_mode);
@@ -652,14 +653,12 @@ void dfcc_wrapper_programt::encode_ensures_clauses()
652653
converter.goto_convert(ensures_statement, ensures_program, language_mode);
653654
}
654655

655-
const auto address_of_ensures_write_set = addr_of_ensures_write_set;
656-
657656
// When checking an ensures clause we link the contract write set to the
658657
// ensures write set to know what was deallocated by the function so that
659658
// the was_freed predicate can perform its checks
660659
link_deallocated_contract.add(goto_programt::make_function_call(
661660
library.link_deallocated_call(
662-
address_of_ensures_write_set, addr_of_contract_write_set, wrapper_sl),
661+
addr_of_ensures_write_set, addr_of_contract_write_set, wrapper_sl),
663662
wrapper_sl));
664663

665664
// fix calls to user-defined user-defined memory predicates
@@ -669,7 +668,7 @@ void dfcc_wrapper_programt::encode_ensures_clauses()
669668
instrument.instrument_goto_program(
670669
wrapper_id,
671670
ensures_program,
672-
address_of_ensures_write_set,
671+
addr_of_ensures_write_set,
673672
function_pointer_contracts);
674673

675674
// add the snapshot program in the history section
@@ -735,8 +734,6 @@ void dfcc_wrapper_programt::encode_havoced_function_call()
735734
write_set_arguments.push_back(parameter_symbol.symbol_expr());
736735
}
737736

738-
auto address_of_contract_write_set = addr_of_contract_write_set;
739-
740737
// check assigns clause inclusion
741738
// IF __caller_write_set==NULL GOTO skip_target;
742739
// DECL check: bool;
@@ -768,7 +765,7 @@ void dfcc_wrapper_programt::encode_havoced_function_call()
768765

769766
write_set_checks.add(goto_programt::make_function_call(
770767
library.write_set_check_assigns_clause_inclusion_call(
771-
check_var, caller_write_set, address_of_contract_write_set, wrapper_sl),
768+
check_var, caller_write_set, addr_of_contract_write_set, wrapper_sl),
772769
wrapper_sl));
773770

774771
source_locationt check_sl(wrapper_sl);
@@ -796,7 +793,7 @@ void dfcc_wrapper_programt::encode_havoced_function_call()
796793

797794
write_set_checks.add(goto_programt::make_function_call(
798795
library.write_set_check_frees_clause_inclusion_call(
799-
check_var, caller_write_set, address_of_contract_write_set, wrapper_sl),
796+
check_var, caller_write_set, addr_of_contract_write_set, wrapper_sl),
800797
wrapper_sl));
801798

802799
source_locationt check_sl(wrapper_sl);
@@ -814,7 +811,7 @@ void dfcc_wrapper_programt::encode_havoced_function_call()
814811

815812
code_function_callt havoc_call(
816813
contract_functions.get_spec_assigns_havoc_function_symbol().symbol_expr(),
817-
{address_of_contract_write_set});
814+
{addr_of_contract_write_set});
818815

819816
function_call.add(goto_programt::make_function_call(havoc_call, wrapper_sl));
820817

@@ -844,6 +841,6 @@ void dfcc_wrapper_programt::encode_havoced_function_call()
844841
// set and the caller write set
845842
function_call.add(goto_programt::make_function_call(
846843
library.write_set_deallocate_freeable_call(
847-
address_of_contract_write_set, caller_write_set, wrapper_sl),
844+
addr_of_contract_write_set, caller_write_set, wrapper_sl),
848845
wrapper_sl));
849846
}

0 commit comments

Comments
 (0)