Frama-C-discuss mailing list archives
This page gathers the archives of the old Frama-C-discuss archives, that was hosted by Inria's gforge before its demise at the end of 2020. To search for mails newer than September 2020, please visit the page of the new mailing list on Renater.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Frama-c-discuss] Function-local static variables and preprocessor variables
- Subject: [Frama-c-discuss] Function-local static variables and preprocessor variables
- From: virgile.prevosto at m4x.org (Virgile Prevosto)
- Date: Mon, 21 Jan 2019 18:58:45 +0100
- In-reply-to: <CAHnaJbvwMbZWLiJ=gdm4Bmi-xELx4MY6qUMGigXRyv29KdAYJg@mail.gmail.com>
- References: <CAHnaJbvwMbZWLiJ=gdm4Bmi-xELx4MY6qUMGigXRyv29KdAYJg@mail.gmail.com>
Hello, First of all, thanks for your very valuable feedback on Frama-C. Le lun. 21 janv. 2019 à 17:20, Rafael Bachmann <rafael.bachmann.93 at gmail.com> a écrit : > Hello, > I had mostly good experiences applying Frama-C(WP). But I found 2 issues > which (in my opinion) may encourage/enforce commonly discouraged > programming style: > > 1. When declaring array size, static const is not const enough. > Instead, literals or preprocessor defines must be used. This is how gcc > also handles the situation ( > https://stackoverflow.com/questions/13645936/variably-modified-array-at-file-scope-in-c > ). > However, clang/LLVM however accept the following snippet: > static const size_t BUFFER_SIZE = 10; > int arr[BUFFER_SIZE]; > I gather that this has to do with VLAs? Understandably hard to support > (especially as it is not mandatory as per C standard), but I personally > would like to at least have the option to use static const's instead of > preprocessor literals. > > This has indeed mainly to do with the fact that C11 does not recognize a const (be it static or not) variable as an integer constant expression even though 6.6§10 leaves open the possibility to have other kinds of constant expression, than the one mandated by the paragraphs before. Note that, on the other hand, an enumeration constant is an integer constant expression, so that enum { BUFFER_SIZE=10U }; int arr[BUFFER_SIZE]; is a perfectly valid C11 program, and is accepted by Frama-C. > > 1. Function-local static variables are supported, but they are not > bound in the function contract. Effectively, I cannot use them for the > function specification: > #include <limits.h> > #include <stdint.h> > /*@ requires *counter* < UINT64_MAX; > ensures \result > \old(*counter*); > */ > uint64_t millis() { > // works fine if counter is global, not local > * static* uint64_t *counter* = 0; > return counter++; > } > I see that CIL transforms the local statics to > $functionname_variablename, but renaming my logic variable accordingly did > not work either. > This forces me to raise the scope of function-local statics to global > statics, unless I am overlooking something here. Regardless, I think this > case should be documented (or is it?). > > This is indeed an issue (I'm afraid it is not really documented except on the archives of this mailing list). ACSL currently does not have any construction to deal with that It might be possible to open up the possibility of type-checking contracts in an environment where the static variables of the function are known, but this not technically that easy and it would not solve all issues with static variables. In particular, this change will not help when you're writing a function contract in a .h for a function whose implementation is using a static variable that only exists in the .c. For that, as explained in this stackoverflow question: https://stackoverflow.com/questions/50386182/frama-c-function-calls-and-static-variables, you might be able to have some results by using a (global) ghost variable to store the address of your static variable, and use it in the contracts, but I fear that it can quickly become awkard. > Apart from these (I may be wrong, usually am), I had difficulties finding > good documentation regarding floating point numbers. > This habilitation: https://hal.inria.fr/tel-01089643/document contains > many very good examples, none of which I can reproduce (the author uses Coq > sometimes, but in other cases gappa suffices). On my machine, the > verification simply fails. Might something be wrong with my Frama-C > installation? > > I don't think there's anything wrong with your installation. The habilitation is 4 years old, and mentions that the given examples have been developed over several years. Sadly, it's quite probable that they are simply not compatible anymore with the newest Frama-C versions Best regards, -- E tutto per oggi, a la prossima volta Virgile -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: <http://lists.gforge.inria.fr/pipermail/frama-c-discuss/attachments/20190121/d780b618/attachment.html>
- References:
- [Frama-c-discuss] Function-local static variables and preprocessor variables
- From: rafael.bachmann.93 at gmail.com (Rafael Bachmann)
- [Frama-c-discuss] Function-local static variables and preprocessor variables
- Prev by Date: [Frama-c-discuss] Function-local static variables and preprocessor variables
- Next by Date: [Frama-c-discuss] Function-local static variables and preprocessor variables
- Previous by thread: [Frama-c-discuss] Function-local static variables and preprocessor variables
- Next by thread: [Frama-c-discuss] Function-local static variables and preprocessor variables
- Index(es):