Jessie tutorial binary_search examples fail with Why 2.23 - loop variant must be added
ID0000365: This issue was created automatically from Mantis Issue 365. Further discussion may take place here.
Id | Project | Category | View | Due Date | Updated |
---|---|---|---|---|---|
ID0000365 | Frama-C | Documentation > manuals | public | 2010-01-04 | 2016-06-21 |
Reporter | dwheeler | Assigned To | cmarche | Resolution | fixed |
Priority | normal | Severity | minor | Reproducibility | always |
Platform | - | OS | - | OS Version | - |
Product Version | Frama-C Beryllium-20090902 | Target Version | - | Fixed in Version | Frama-C Carbon-20101201-beta1 |
Description :
The Jessie tutorial in: http://frama-c.cea.fr/jessie_tutorial_index.html sections 2.1 and 2.2 include binary_search examples. If "Why" is upgraded to Why 2.23, these no longer work, because there is no loop variant provided.
The single loop invariant must be changed to be: /*@ loop invariant 0 <= l && u <= n-1; loop variant u-l; */
In addition, explain loop variants, since they are absolutely necessary to use Why 2.23.
Also, please note in the documentation that this will NOT work: //@ loop invariant 0 <= l && u <= n-1; //@ loop variant u-l; Basically, make it clear that you're not allowed to have "//@" in succession, especially since doing this produces a mysterious and misleading error message. See bug 79.
The example of 2.2 should end up looking like this (the lemma is optional):
/@ lemma mean: \forall integer x, y; x <= y ==> x <= (x+y)/2 <= y; / //@ requires n >= 0 && \valid_range(t,0,n-1); int binary_search(int t, int n, int v) { int l = 0, u = n-1, p = -1; /@ loop invariant 0 <= l && u <= n-1; @ loop variant u-l; */ while (l <= u ) { int m = l + (u - l) / 2; // NOTE this is changed for bounded calculation if (t[m] < v) l = m + 1; else if (t[m] > v) u = m - 1; else { p = m; break; } } return p; }
Additional Information :
Fixed in Frama-C SVN (doc/jessie)