Skip to content

Commit da4ead6

Browse files
committed
check history variable parameter when compiling
1 parent efd40b2 commit da4ead6

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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.

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2732,6 +2732,18 @@ exprt c_typecheck_baset::do_special_functions(
27322732
throw 0;
27332733
}
27342734

2735+
const auto &param_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+
27352747
irep_idt id = identifier == CPROVER_PREFIX "old" ? ID_old : ID_loop_entry;
27362748

27372749
history_exprt old_expr(expr.arguments()[0], id);

0 commit comments

Comments
 (0)