I have an ACSL predicate that is ~37 lines long (the predicate returns whether the passed struct is in a valid state).
It is a series of conditions &&
'd together.
When I assert the predicate:
//@ assert MyPredicate(myArg);
and the verification fails, I do not know which of the &&
'd conditions is failing.
How can I know which part(s) of the predicate are failing?
When there is a verification failure, I open the C file with frama-c-gui -wp -wp-rte myfile.c
. I more often run frama-c
with the same args, but I use the GUI to help investigate failures.
$ frama-c-gui --version
24.0 (Chromium)
If the predicate was never going to change, I might be fine manually breaking it out into separate /*@ assert ... */
sections, but I am regularly updating the predicate as I work on the program, and would prefer not to keep the predicate and the block of asserts in sync.
If the prover versions are relevant:
$ why3 config detect
Found prover Alt-Ergo version 2.4.1, OK.
Found prover Z3 version 4.8.9 (alternative: counterexamples)
Found prover Z3 version 4.8.9, OK.
Found prover Z3 version 4.8.9 (alternative: noBV)
4 prover(s) added