Skip to content

Commit 9cdca48

Browse files
committed
New flag for only processing loop contracts
Added `--apply-loop-contracts` to check and use loop contracts (invariants and variants) independent of function contracts.
1 parent f9be0eb commit 9cdca48

File tree

32 files changed

+50
-34
lines changed

32 files changed

+50
-34
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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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+
--apply-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: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,12 @@ bool code_contractst::replace_calls(
11861186
return false;
11871187
}
11881188

1189+
void code_contractst::apply_loop_contracts()
1190+
{
1191+
for(auto &goto_function : goto_functions.function_map)
1192+
apply_loop_contract(goto_function.first, goto_function.second);
1193+
}
1194+
11891195
bool code_contractst::replace_calls()
11901196
{
11911197
std::set<std::string> funs_to_replace;
@@ -1204,8 +1210,6 @@ bool code_contractst::enforce_contracts()
12041210
{
12051211
if(has_contract(goto_function.first))
12061212
funs_to_enforce.insert(id2string(goto_function.first));
1207-
else
1208-
apply_loop_contract(goto_function.first, goto_function.second);
12091213
}
12101214
return enforce_contracts(funs_to_enforce);
12111215
}
@@ -1225,7 +1229,6 @@ bool code_contractst::enforce_contracts(
12251229
<< messaget::eom;
12261230
continue;
12271231
}
1228-
apply_loop_contract(goto_function->first, goto_function->second);
12291232

12301233
if(!has_contract(fun))
12311234
{

src/goto-instrument/code_contracts.h

Lines changed: 7 additions & 0 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,
@@ -216,6 +218,11 @@ class code_contractst
216218
const irep_idt &mode);
217219
};
218220

221+
#define FLAG_LOOP_CONTRACTS "apply-loop-contracts"
222+
#define HELP_LOOP_CONTRACTS \
223+
" --apply-loop-contracts\n" \
224+
" check and use loop contracts when provided\n"
225+
219226
#define FLAG_REPLACE_CALL "replace-call-with-contract"
220227
#define HELP_REPLACE_CALL \
221228
" --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)