-
Notifications
You must be signed in to change notification settings - Fork 278
Open
Labels
Code ContractsFunction and loop contractsFunction and loop contractsKaniBugs or features of importance to Kani Rust VerifierBugs or features of importance to Kani Rust VerifierawsBugs or features of importance to AWS CBMC usersBugs or features of importance to AWS CBMC users
Description
The __CPROVER_old
primitive is not recognized when called from a spec function, whereas inlining the same code into the contract makes it work.
Concretely this example works
void modify(int *i)
__CPROVER_requires(*i < 10)
__CPROVER_ensures(*i == __CPROVER_old(*i) + 1)
__CPROVER_assigns(*i)
{
*i += 1;
}
int main() {
int i = 0;
modify(&i);
}
but this refactor of the same code does not.
int check(int *i) {
return *i == __CPROVER_old(*i) + 1;
}
void modify(int *i)
__CPROVER_requires(*i < 10)
__CPROVER_ensures(check(i))
__CPROVER_assigns(*i)
{
*i += 1;
}
int main() {
int i = 0;
modify(&i);
}
It fails not quite silently but emits a warning before failing the verification
warning: ignoring old
* type: signedbv
* width: 32
* #c_type: signed_int
* #source_location:
* file: test.c
* line: 2
* function: check
* working_directory: /Users/justbldr/research/kani/tests/kani/FunctionContract
0: constant
* type: signedbv
* width: 32
* #c_type: signed_int
* value: 1
CBMC version: 5.84.0
Operating system: OSX
Exact command line resulting in the issue: goto-instrument --enforce-contract modify test.out test.out2 && cbmc test.out2
What behaviour did you expect: Verification success
What happened instead: Verification failure and warning
This is currently blocking model-checking/kani#2545
Metadata
Metadata
Assignees
Labels
Code ContractsFunction and loop contractsFunction and loop contractsKaniBugs or features of importance to Kani Rust VerifierBugs or features of importance to Kani Rust VerifierawsBugs or features of importance to AWS CBMC usersBugs or features of importance to AWS CBMC users