Given such an automaton, Aoraï’s instrumentation works by adding code at each function’s entry and return statements that checks that we are in an admissible state, and updates this state according to the fireable transition(s).
The Typestates plug-in is much more recent than Aoraï, being currently developed by Sébastien Patte as part of his PhD. it has been presented at the FormaliSE conference this spring. Typestates specifications also take the form of automata, but while Aoraï describes the behavior of the program as a whole, Typestates focuses on the current state of each object of a particular datatype (hence the name). The automaton above could also serve as a typestate specification (maybe replacing login/logout with open and close respectively), where the system can grant access to each file individually instead of having a single authorization step at the beginning of the program, as is the case with Aoraï.
The Relational Property Prover (RPP) plug-in was mainly developed by Lionel Blatter during his PhD. By contrast to function contracts, that specify what a single call to a single function is supposed to do, Relational Properties describe a relation between several calls of the same function or of several functions. Security-wise, non-interference represents an important class of relational properties: to establish non-interference, one has to split memory into a public and a private part, and to show that if two calls to the function f are done in two memory states where the public locations have the same content (but the private part might be different), then the public part of the memory will also be the same when the calls return, so that an attacker could not gain information about the private content by inspecting the public result.
The current implementation of Rpp uses a technique called self-composition, generating a wrapper function that simulates the calls to the function(s) involved in the relational property, and a plain ACSL contract for this wrapper whose validity implies the validity of the relational property in the first place. A more flexible method has been proposed, but remains to be implemented.
Finally, the MetAcsl plug-in was mainly developed by Virgile Robles during his PhD. The goal of this plug-in is to provide a compact way to write pervasive properties that need to be checked at many program points. In MetAcsl, such properties are called HILAREs (High-Level ACSL Requirements) and are defined by three ingredients: their target, that is the set of functions where the property must hold, their context, defining the exact points where a verification must occur, and the actual property, expressed as an ACSL predicate that, depending on the context, may use one or more meta-variables. The two most important contexts are writing, denoting all write accesses and allowing to state integrity properties, and reading, denoting all read accesses and allowing to state confidentiality properties. An HILARE with writing (resp. reading) context can use the meta-variable written (resp. read) to denote the corresponding location. A typical integrity-related HILARE would state that for any write access in any function other than write_confidential_data, the written location is not within the confidential_data array. More patterns of HILARE for common kinds of properties have been proposed, and MetAcsl has played an important role in the certification of Thales’ JavaCard Virtual Machine at the highest Evaluation Assurance Level (EAL7) of the Common Criteria. The instrumentation performed by MetAcsl simply amounts to instantiating the HILAREs at each program point designated by the target and the context, and substituting the meta-variables by the relevant terms.
There are thus many ways of specifying your properties of interest and have them verified by Frama-C without resorting to a cumbersome and error-prone manual encoding in plain ACSL. However, this does not completely settle the question of whether what you specified is what you meant: what if there’s a bug in one of the plug-ins? While there’s no definitive answer yet, several works have made good progress in this direction.