Skip to content

do { ... } while (0) pattern causes wp to fail

ID0001281: This issue was created automatically from Mantis Issue 1281. Further discussion may take place here.


Id Project Category View Due Date Updated
ID0001281 Frama-C Plug-in > wp public 2012-10-15 2014-02-05
Reporter sjw Assigned To correnson Resolution open
Priority normal Severity minor Reproducibility always
Platform - OS - OS Version -
Product Version Frama-C Oxygen-20120901 Target Version - Fixed in Version -

Description :

The pattern do { ... } while (0) is used in a number of standard headers to allow pre-processor macros to introduce a scope and still look like a statement (you can put a semi-colon after them). This translates to something like while(1) { ...; break; } as in the following

/*@ requires \valid(x); @ ensures \result == 0; */ int foo(int *x) {

/* loop invariant 0 == 0; */
while( 1 ) {
    *x = 0;
    break;

}

return *x;

}

which fails with $ frama-c -wp do_while_test.c [kernel] preprocessing with "gcc -C -E -I. do_while_test.c" [wp] Running WP plugin... [wp] Collecting axiomatic usage [wp] warning: Missing RTE guards do_while_test.c:6:[wp] warning: calculus failed on strategy for 'foo', behavior 'default!', all properties, both assigns or not because unsupported non-natural loop without invariant property. (abort) [wp] 0 goal scheduled

It looks like the unconditional break (i.e., the results of optimising if (!0) break; from the translation of the 'do') causes the cil2cfg pass to throw out some loop edges, causing the above error.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information