Skip to content

Commit 365871d

Browse files
authored
Merge pull request #6986 from tautschnig/bugfixes/crangler-assigns-clauses
Crangler: support semicolon in post-declarator expressions
2 parents 6d5ddf5 + 150a826 commit 365871d

File tree

4 files changed

+58
-0
lines changed

4 files changed

+58
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
int foo(int *arr, int size);
2+
3+
int foo(int *arr, int size)
4+
// clang-format off
5+
__CPROVER_requires(size > 0 && __CPROVER_is_fresh(arr, size))
6+
__CPROVER_assigns(
7+
arr[0], arr[size-1];
8+
size >= 10: arr[5];
9+
)
10+
__CPROVER_ensures(arr[0] == 0 && arr[size-1] == 0)
11+
__CPROVER_ensures(size >= 10 ==> arr[5] == __CPROVER_return_value)
12+
// clang-format on
13+
;
14+
15+
int foo(int *arr, int size)
16+
{
17+
arr[0] = 0;
18+
arr[size - 1] = 0;
19+
return size < 10 ? 0 : arr[5];
20+
}
21+
22+
int main()
23+
{
24+
int arr[10];
25+
int retval = foo(arr, 10);
26+
__CPROVER_assert(retval == arr[5], "should succeed");
27+
return 0;
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
test.json
3+
4+
__CPROVER_assigns
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
--
9+
Make sure the semicolon in assigns clauses does not trip up parsing.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"sources": [
3+
"main-contract-after-declaration.c"
4+
],
5+
"output": "stdout"
6+
}

src/crangler/mini_c_parser.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -282,12 +282,27 @@ mini_c_parsert::tokenst mini_c_parsert::parse_post_declarator()
282282
// 3) '=' (initializer)
283283

284284
tokenst result;
285+
std::size_t open_parentheses = 0;
285286

286287
while(true)
287288
{
288289
if(eof())
289290
return result;
290291

292+
if(peek() == '(')
293+
{
294+
++open_parentheses;
295+
result.push_back(consume_token());
296+
continue;
297+
}
298+
else if(open_parentheses > 0)
299+
{
300+
if(peek() == ')')
301+
--open_parentheses;
302+
result.push_back(consume_token());
303+
continue;
304+
}
305+
291306
if(peek() == ';' || peek() == '{' || peek() == '=')
292307
return result;
293308

0 commit comments

Comments
 (0)