File tree 6 files changed +68
-1
lines changed
goto-instrument/contracts 6 files changed +68
-1
lines changed Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+
3
+ int main ()
4
+ {
5
+ int i , n , x [10 ];
6
+ __CPROVER_assume (x [0 ] == x [9 ]);
7
+ while (i < n )
8
+ __CPROVER_loop_invariant (x [0 ] == __CPROVER_loop_entry (x [0 ]))
9
+ {
10
+ x [0 ] = x [9 ] - 1 ;
11
+ x [0 ]++ ;
12
+ }
13
+ assert (x [0 ] == x [9 ]);
14
+ }
Original file line number Diff line number Diff line change
1
+ CORE
2
+ main.c
3
+ --apply-loop-contracts
4
+ ^EXIT=0$
5
+ ^SIGNAL=0$
6
+ ^VERIFICATION SUCCESSFUL$
7
+ --
8
+ ^Tracking history of index expressions is not supported yet\.
9
+ --
10
+ This test checks that `ID_index` expressions are allowed within history variables.
Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+
3
+ int foo (int x )
4
+ {
5
+ return x ;
6
+ }
7
+
8
+ int main ()
9
+ {
10
+ int i , n , x [10 ];
11
+ __CPROVER_assume (x [0 ] == x [9 ]);
12
+ while (i < n )
13
+ __CPROVER_loop_invariant (x [0 ] == __CPROVER_loop_entry (foo (x [0 ])))
14
+ {
15
+ x [0 ] = x [9 ] - 1 ;
16
+ x [0 ]++ ;
17
+ }
18
+ assert (x [0 ] == x [9 ]);
19
+ }
Original file line number Diff line number Diff line change
1
+ CORE
2
+ main.c
3
+ --apply-loop-contracts
4
+ ^main.c.* error: Tracking history of side_effect expressions is not supported yet.$
5
+ ^CONVERSION ERROR$
6
+ ^EXIT=(1|64)$
7
+ ^SIGNAL=0$
8
+ --
9
+ --
10
+ This test ensures that expressions with side effect, such as function calls,
11
+ may not be used in history variables.
Original file line number Diff line number Diff line change @@ -2732,6 +2732,18 @@ exprt c_typecheck_baset::do_special_functions(
2732
2732
throw 0 ;
2733
2733
}
2734
2734
2735
+ const auto ¶m_id = expr.arguments ().front ().id ();
2736
+ if (!(param_id == ID_dereference || param_id == ID_member ||
2737
+ param_id == ID_symbol || param_id == ID_ptrmember ||
2738
+ param_id == ID_constant || param_id == ID_typecast ||
2739
+ param_id == ID_index))
2740
+ {
2741
+ error ().source_location = f_op.source_location ();
2742
+ error () << " Tracking history of " << param_id
2743
+ << " expressions is not supported yet." << eom;
2744
+ throw 0 ;
2745
+ }
2746
+
2735
2747
irep_idt id = identifier == CPROVER_PREFIX " old" ? ID_old : ID_loop_entry;
2736
2748
2737
2749
history_exprt old_expr (expr.arguments ()[0 ], id);
Original file line number Diff line number Diff line change @@ -664,7 +664,8 @@ void code_contractst::replace_history_parameter(
664
664
const auto &id = parameter.id ();
665
665
if (
666
666
id == ID_dereference || id == ID_member || id == ID_symbol ||
667
- id == ID_ptrmember || id == ID_constant || id == ID_typecast)
667
+ id == ID_ptrmember || id == ID_constant || id == ID_typecast ||
668
+ id == ID_index)
668
669
{
669
670
auto it = parameter2history.find (parameter);
670
671
You can’t perform that action at this time.
0 commit comments