Skip to content

Commit 5f2f7e9

Browse files
committed
New flag for only processing loop contracts
1 parent abd4412 commit 5f2f7e9

File tree

32 files changed

+59
-52
lines changed

32 files changed

+59
-52
lines changed

regression/contracts/invar_check_break_fail/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_break_pass/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_continue/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_large/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_multiple_loops/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_nested_loops/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_pointer_modifies-01/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts --pointer-check
3+
--use-loop-contracts --pointer-check
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_pointer_modifies-02/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts --pointer-check
3+
--use-loop-contracts --pointer-check
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_check_sufficiency/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_dynamic_struct_member/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_dynamic_array/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_dynamic_array_const_idx/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_dynamic_multi-dim_array/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
KNOWNBUG
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_dynamic_multi-dim_array_all_const_idx/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
KNOWNBUG
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_dynamic_multi-dim_array_partial_const_idx/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
KNOWNBUG
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_static_array/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_static_array_const_idx/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_static_multi-dim_array/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_static_multi-dim_array_all_const_idx/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_havoc_static_multi-dim_array_partial_const_idx/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_loop_constant_fail/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_loop_constant_no_modify/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_loop_constant_pass/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invar_struct_member/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=10$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/invariant_side_effects/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] .* Check loop invariant before entry: SUCCESS$

regression/contracts/quantifiers-loop-01/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] line .* Check loop invariant before entry: SUCCESS

regression/contracts/quantifiers-loop-02/test.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
CORE
1+
CORE smt-backend
22
main.c
3-
--enforce-all-contracts _ --z3
3+
--use-loop-contracts _ --z3
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.\d+\] line .* Check loop invariant before entry: SUCCESS

regression/contracts/quantifiers-loop-03/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE
22
main.c
3-
--enforce-all-contracts
3+
--use-loop-contracts
44
^EXIT=0$
55
^SIGNAL=0$
66
^\[main.1\] line .* Check loop invariant before entry: SUCCESS

src/goto-instrument/code_contracts.cpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -549,22 +549,23 @@ bool code_contractst::apply_function_contract(
549549
return false;
550550
}
551551

552-
void code_contractst::apply_loop_contract(
553-
const irep_idt &function_name,
554-
goto_functionst::goto_functiont &goto_function)
552+
void code_contractst::apply_loop_contracts()
555553
{
556-
local_may_aliast local_may_alias(goto_function);
557-
natural_loops_mutablet natural_loops(goto_function.body);
554+
for(auto &goto_function : goto_functions.function_map)
555+
{
556+
local_may_aliast local_may_alias(goto_function.second);
557+
natural_loops_mutablet natural_loops(goto_function.second.body);
558558

559-
// Iterate over the (natural) loops in the function,
560-
// and apply any invariant annotations that we find.
561-
for(const auto &loop : natural_loops.loop_map)
562-
check_apply_invariants(
563-
goto_function,
564-
local_may_alias,
565-
loop.first,
566-
loop.second,
567-
symbol_table.lookup_ref(function_name).mode);
559+
// Iterate over the (natural) loops in the function,
560+
// and apply any invariant annotations that we find.
561+
for(const auto &loop : natural_loops.loop_map)
562+
check_apply_invariants(
563+
goto_function.second,
564+
local_may_alias,
565+
loop.first,
566+
loop.second,
567+
symbol_table.lookup_ref(goto_function.first).mode);
568+
}
568569
}
569570

570571
const symbolt &code_contractst::new_tmp_symbol(
@@ -1204,8 +1205,6 @@ bool code_contractst::enforce_contracts()
12041205
{
12051206
if(has_contract(goto_function.first))
12061207
funs_to_enforce.insert(id2string(goto_function.first));
1207-
else
1208-
apply_loop_contract(goto_function.first, goto_function.second);
12091208
}
12101209
return enforce_contracts(funs_to_enforce);
12111210
}
@@ -1225,7 +1224,6 @@ bool code_contractst::enforce_contracts(
12251224
<< messaget::eom;
12261225
continue;
12271226
}
1228-
apply_loop_contract(goto_function->first, goto_function->second);
12291227

12301228
if(!has_contract(fun))
12311229
{

src/goto-instrument/code_contracts.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ class code_contractst
9090
/// \return `true` on failure, `false` otherwise
9191
bool replace_calls();
9292

93+
void apply_loop_contracts();
94+
9395
const symbolt &new_tmp_symbol(
9496
const typet &type,
9597
const source_locationt &source_location,
@@ -172,10 +174,6 @@ class code_contractst
172174
const exprt &lhs,
173175
std::vector<exprt> &aliasable_references);
174176

175-
void apply_loop_contract(
176-
const irep_idt &function_name,
177-
goto_functionst::goto_functiont &goto_function);
178-
179177
/// \brief Does the named function have a contract?
180178
bool has_contract(const irep_idt);
181179

@@ -216,6 +214,11 @@ class code_contractst
216214
const irep_idt &mode);
217215
};
218216

217+
#define FLAG_LOOP_CONTRACTS "use-loop-contracts"
218+
#define HELP_LOOP_CONTRACTS \
219+
" --use-loop-contracts\n" \
220+
" simplify loops using loop contracts\n"
221+
219222
#define FLAG_REPLACE_CALL "replace-call-with-contract"
220223
#define HELP_REPLACE_CALL \
221224
" --replace-call-with-contract <fun>\n" \

src/goto-instrument/goto_instrument_parse_options.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,8 @@ void goto_instrument_parse_optionst::instrument_goto_program()
11491149
}
11501150

11511151
if(
1152-
cmdline.isset(FLAG_REPLACE_CALL) || cmdline.isset(FLAG_REPLACE_ALL_CALLS) ||
1152+
cmdline.isset(FLAG_LOOP_CONTRACTS) || cmdline.isset(FLAG_REPLACE_CALL) ||
1153+
cmdline.isset(FLAG_REPLACE_ALL_CALLS) ||
11531154
cmdline.isset(FLAG_ENFORCE_CONTRACT) ||
11541155
cmdline.isset(FLAG_ENFORCE_ALL_CONTRACTS))
11551156
{
@@ -1180,6 +1181,9 @@ void goto_instrument_parse_optionst::instrument_goto_program()
11801181
if(cmdline.isset(FLAG_ENFORCE_ALL_CONTRACTS))
11811182
if(cont.enforce_contracts())
11821183
exit(CPROVER_EXIT_USAGE_ERROR);
1184+
1185+
if(cmdline.isset(FLAG_LOOP_CONTRACTS))
1186+
cont.apply_loop_contracts();
11831187
}
11841188

11851189
if(cmdline.isset("value-set-fi-fp-removal"))
@@ -1868,7 +1872,8 @@ void goto_instrument_parse_optionst::help()
18681872
" --remove-function-body <f> remove the implementation of function <f> (may be repeated)\n"
18691873
HELP_REPLACE_CALLS
18701874
"\n"
1871-
"Function contracts and invariants:\n"
1875+
"Code contracts:\n"
1876+
HELP_LOOP_CONTRACTS
18721877
HELP_REPLACE_CALL
18731878
HELP_REPLACE_ALL_CALLS
18741879
HELP_ENFORCE_CONTRACT

src/goto-instrument/goto_instrument_parse_options.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ Author: Daniel Kroening, [email protected]
9999
"(list-symbols)(list-undefined-functions)" \
100100
"(z3)(add-library)(show-dependence-graph)" \
101101
"(horn)(skip-loops):(model-argc-argv):" \
102+
"(" FLAG_LOOP_CONTRACTS ")" \
102103
"(" FLAG_REPLACE_CALL "):" \
103104
"(" FLAG_REPLACE_ALL_CALLS ")" \
104105
"(" FLAG_ENFORCE_CONTRACT "):" \

0 commit comments

Comments
 (0)