From 2e36924ca27d4ccf928e710b1c2262621f65ff02 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Mon, 3 Feb 2020 11:01:08 +0100 Subject: [PATCH] [Doc] Update developer guide for ACSL extensions --- doc/developer/Makefile | 3 +- doc/developer/advance.tex | 226 +++++++++++------- .../examples/acsl_extension_ext_types.ml | 41 ++++ .../examples/acsl_extension_ext_types.png | Bin 0 -> 31170 bytes ...csl_extension.ml => acsl_extension_foo.ml} | 4 +- 5 files changed, 187 insertions(+), 87 deletions(-) create mode 100644 doc/developer/examples/acsl_extension_ext_types.ml create mode 100644 doc/developer/examples/acsl_extension_ext_types.png rename doc/developer/examples/{acsl_extension.ml => acsl_extension_foo.ml} (78%) diff --git a/doc/developer/Makefile b/doc/developer/Makefile index 4ce9e948e29..12024d9005f 100644 --- a/doc/developer/Makefile +++ b/doc/developer/Makefile @@ -46,7 +46,8 @@ else -load-script ./examples/syntactic_check \ -load-script ./examples/callstack \ -load-script ./examples/use_callstack \ - -load-script ./examples/acsl_extension \ + -load-script ./examples/acsl_extension_foo \ + -load-script ./examples/acsl_extension_ext_types \ -load-script ./hello_world/hello_world.ml \ | tee check.log if grep -e "User Error" check.log; then \ diff --git a/doc/developer/advance.tex b/doc/developer/advance.tex index 0a09948afd5..8c4e99d5be2 100644 --- a/doc/developer/advance.tex +++ b/doc/developer/advance.tex @@ -3917,6 +3917,30 @@ An extension is characterized by its introducing keyword \texttt{kw}, or \texttt extension. It is not possible to have the same keyword for two distinct extensions, especially if they belong to different categories, as this would lead to ambiguities in the parser. +Once an extension is registered a clause of the form \verb|kw e1,...,en;|, where each \verb|ei| can be +any syntactically valid ACSL term or predicate, will be treated by the parser as belonging to the +extension \verb|kw|. + +Contract extension clauses must occur after \verb|assumes| and \verb|requires| clauses if any, but +can be freely mixed with other behavior clauses (post-conditions, \verb|assigns|, \verb|frees| and +\verb|allocates|). + +Similarly, in a loop annotation, \verb|loop kw e1, ..., en;| will be treated as belonging to the +\verb|kw| extension. In case the loop annotation has a \verb|loop variant|, the extension must +occur before. Otherwise, there is no ordering constraint with other loop annotations clauses. + +Global extensions can appear either alone in a global annotation, or as part of an axiomatic with +a set of other global annotations. + +Finally, a code annotation extension must appear as a single code annotation, like any code annotation. + +Code (and loop) extensions can be made specific to a +set of existing behaviors using the standard ACSL \verb|for| construction. +Namely, \verb|for bhv: loop kw e1, ..., en;| will indicate that the +(loop) extension is supposed to be considered only when behavior \verb|bhv| is +active (although it is ultimately up to the plugin to decide what to do with +this information). + An \texttt{acsl\_extension}\scodeidx{Cil\_types}{acsl\_extension} is a triple \texttt{(id, kw, ext)} where \texttt{id} is its unique ID, used in annotation tables and generated by \scodeidx{Logic\_const}{new\_acsl\_extension}\texttt{Logic\_const.new\_acsl\_extension}, @@ -3940,75 +3964,48 @@ the corresponding list is traversed normally by the visitor In order for the extension to be recognized by the parser, it must be registered by one of the following functions, depending on its category. \begin{itemize} -\item \texttt{Logic\_typing.register\_behavior\_extension}% -\scodeidx{Logic\_typing}{register\_behavior\_extension} -\item \texttt{Logic\_typing.register\_global\_extension}% -\scodeidx{Logic\_typing}{register\_global\_extension} -\item \texttt{Logic\_typing.register\_code\_annot\_extension}% -\scodeidx{Logic\_typing}{register\_code\_annot\_extension} -\item \texttt{Logic\_typing.register\_code\_annot\_next\_stmt\_extension}% -\scodeidx{Logic\_typing}{register\_code\_annot\_next\_stmt\_extension} -\item \texttt{Logic\_typing.register\_code\_annot\_next\_loop\_extension}% -\scodeidx{Logic\_typing}{register\_code\_annot\_next\_both\_extension} -\item \texttt{Logic\_typing.register\_code\_annot\_next\_both\_extension}% -\scodeidx{Logic\_typing}{register\_code\_annot\_next\_loop\_extension} +\item \texttt{Acsl\_extension.register\_behavior}% +\scodeidx{Acsl\_extension}{register\_behavior} +\item \texttt{Acsl\_extension.register\_global}% +\scodeidx{Acsl\_extension}{register\_global} +\item \texttt{Acsl\_extension.register\_code\_annot}% +\scodeidx{Acsl\_extension}{register\_code\_annot} +\item \texttt{Acsl\_extension.register\_code\_annot\_next\_stmt}% +\scodeidx{Acsl\_extension}{register\_code\_annot\_next\_stmt} +\item \texttt{Acsl\_extension.register\_code\_annot\_next\_loop}% +\scodeidx{Acsl\_extension}{register\_code\_annot\_next\_both} +\item \texttt{Acsl\_extension.register\_code\_annot\_next\_both}% +\scodeidx{Acsl\_extension}{register\_code\_annot\_next\_loop} \end{itemize} -Each function takes three arguments: +Each function takes the following mandatory arguments: \begin{itemize} \item \texttt{kw} the name of the extension, -\item \texttt{status}, a boolean flag indicating whether the extended annotation - may have a validity status, and -\item \texttt{f} the type-checking function itself. -\end{itemize} - -After a call to the appropriate registration function, -a clause of the form \verb|kw e1,...,en;|, where each \verb|ei| can be -any syntactically valid ACSL term or predicate, -will be treated by the parser -as belonging to the extension \verb|kw|. Contract extension clauses must occur after -\verb|assumes| and \verb|requires| clauses if any, but can be freely -mixed with other behavior clauses (post-conditions, \verb|assigns|, -\verb|frees| and \verb|allocates|). - -Similarly, in a loop annotation, -\verb|loop kw e1, ..., en;| will be treated as belonging to the \verb|kw| -extension. In case the loop annotation has a \verb|loop variant|, the -extension must occur before. Otherwise, there is no ordering constraint with -other loop annotations clauses. - -Global extensions can appear either alone in a global annotation, or as part of an axiomatic with -a set of other global annotations. - -Finally, a code annotation extension must appear as a single code annotation, like any code annotation. +\item \texttt{typer} the type-checking function itself. +\item \texttt{status}, a boolean flag indicating whether the extended + annotation may have a validity status, and -Code (and loop) extensions can be made specific to a -set of existing behaviors using the standard ACSL \verb|for| construction. -Namely, \verb|for bhv: loop kw e1, ..., en;| will indicate that the -(loop) extension is supposed to be considered only when behavior \verb|bhv| is -active (although it is ultimately up to the plugin to decide what to do with -this information). +\end{itemize} -During type-checking, -the list \verb|[e1;...;en]| will be given to \verb|f|, together -with the current typing environment (which allows discriminating +During type-checking, the list \verb|[e1;...;en]| will be given to \verb|typer|, +together with the current typing environment (which allows discriminating between contract and loop extensions and will have the appropriate logic labels -set in the local environment). \verb|f| must return the corresponding +set in the local environment). \verb|typer| must return the corresponding \verb|acsl_extension_kind| (possibly adding an entry for key \verb|id| in an internal table if it chooses to return \verb|Ext_id id|). -The first argument of \verb|f| is a \verb|Logic_typing.typing_context|% -\scodeidx{Logic\_typing}{typing\_context} -which provides lookup functions for the various kinds of identifiers that are -present in the environment, as well as extensible type-checking functions for -predicates, terms, and assigns clauses. Indeed, these functions take themselves -as argument a \verb|typing_context| \verb|ctxt| and will use the functions -of \verb|ctxt| to type-check the children of the current node. Extensions -can take advantage of this open recursion to recognize only subtrees of an -otherwise normal ACSL predicate or term. For instance, the following code will -let extension \verb|foo| replace all occurrences of \verb|\foo| by \verb|42|. +The first argument of \verb|typer| is a \verb|Logic_typing.typing_context|% +\scodeidx{Logic\_typing}{typing\_context} which provides lookup functions for the +various kinds of identifiers that are present in the environment, as well as +extensible type-checking functions for predicates, terms, and assigns clauses. +Indeed, these functions take themselves as argument a \verb|typing_context| +\verb|ctxt| and will use the functions of \verb|ctxt| to type-check the children +of the current node. Extensions can take advantage of this open recursion to +recognize only subtrees of an otherwise normal ACSL predicate or term. For +instance, the following code will let extension \verb|foo| replace all +occurrences of \verb|\foo| by \verb|42|. -\ocamlinput{./examples/acsl_extension.ml} +\ocamlinput{./examples/acsl_extension_foo.ml} With this extension enabled, \framac will interpret the following clause in a given source file: @@ -4020,32 +4017,93 @@ as the following type-checked AST fragment: /*@ foo 84 == 42 + 42; */ \end{lstlisting} -If all the information of the extended clause is contained in -the predicate list \verb|preds|, no other registration is needed beyond -the parsing and type-checking: the pretty-printer will output \verb|preds| -as a comma-separated list preceded by \verb|kw| (or \verb|loop kw| if -the extension is a loop annotation), and the visitor will traverse -each \verb|preds| as well as any predicate present in the AST. However, if -some information is present in the internal state of the plugin, two more -functions may be required for pretty-printing and visiting the extending -clause respectively. - -First, -\texttt{Cil\_printer.register\_behavior\_extension}% -\scodeidx{Cil\_printer}{register\_behavior\_extension} -registers a new pretty-printer \verb|pp| for a given extension \verb|kw|. -Together with the \verb|acsl_extension_kind| of the extended clause, -\verb|pp| is given the current pretty-printer and the formatter where to -output the result. - -Second, -\texttt{Cil.register\_behavior\_extension}% -\scodeidx{Cil}{register\_behavior\_extension} -registers a custom visitor \verb|vext| for a given extension \verb|kw|. -\verb|vext| is given the content of the extended clause and the current -visitor, and must return a \texttt{Cil.visitAction} -(if all the information is in the plugin's own table, it can -return \texttt{SkipChildren}). +If the extended clause is of kind \verb|Ext_preds l| or \verb|Ext_terms l|, +and all the information of the extension is contained in the list \verb|l|, +no other function than the typing function needs to be registered. The parsing +will use the standard way to parse untyped predicates and terms, and after +typing, the visitor will traverse each element of \verb|l| as well as any +predicate or term present in the AST, and the pretty-printer will output these +elements as a comma-separated list preceded by \verb|kw| (or \verb|loop kw| if +the extension is a loop annotation). + +However, depending on the situation, the following optional functions can be +provided to the registration function in order to modify how ACSL extensions +are handled by Frama-C: + +\begin{itemize} +\item \texttt{preprocessor} a transformer to apply on the untyped term or + predicate read during the parsing phase, +\item \texttt{visitor} the visitor function to be applied when visiting + the extension, +\item \texttt{printer} the pretty-printing function associated to the + extension, +\item \texttt{short\_printer} a function used to provide a brief textual + representation of an extension. +\end{itemize} + +The \verb|preprocessor| function is applied just after parsing the extension +terms. It takes the list of untyped terms or predicates and can either return +the same list (but reading it to do some stuff) or return a new list. By +default, this function is the identity. + +The \verb|visitor| function is used by the Frama-C visitors. It takes the +current visitor, together with the \verb|acsl_extension_kind| of the extended +clause and must returns a \verb|Cil.visitAction|. By default, this function +just returns \verb|Cil.DoChildren|. + +The \verb|printer| function is used by the \verb|Cil_printer.pp_extended| +function. It takes the current pretty-printer, the formatter, together with +the \verb|acsl_extension_kind| of the extended clause. By default, it prints +the list of terms or predicates if the kind is \verb|Ext_preds l| or +\verb|Ext_terms l|. If the kind is \verb|Ext_id i|, it only prints the +integer \verb|i|. + +The \verb|short_printer| function is a function that can be useful for +debugging or user-feedback. As an alternative to \verb|Cil_printer.pp_extended|, +the \verb|Cil_printer.pp_short_extended| can be used to get brief description +of the content of the extension. It is for example used by the GUI to get +a more informative name for the extension in the file tree. By default, it +does not print anything about the content of the extension, so that the +result is \verb|"kwd"| or \verb|"loop kwd"|. + +When the extension kind is \verb|Ext_id|, it is common that the plugin +defining the extension contains a table that associates some data to this +identifier. In such a case, a \verb|printer| might be needed to reconstruct +the source code from the data so that a pretty printed code can be parsed +again. For the same reason, an extension that registers a \verb|preprocessor| +that modifies the AST should probably register a \verb|printer| to recover +the original content. + +It is also common, when the kind is \verb|Ext_id|, to define a particular +visitor for the extension, either to ignore the content of the extension as +it is in an internal table of the plugin (thus returning a \verb|SkipChildren| +action) or, on the opposite, to give the possibility to a user defined visitor +to get an access to this content. + +The following code provide a more complete extension example. It provides the +user a way to load some types (assumed to be external to Frama-C) so that they +can be used in ACSL specification. + +\ocamlinput{./examples/acsl_extension_ext_types.ml} + +Namely, specification: + +\begin{lstlisting}[language=C,alsolanguage=ACSL] +/*@ ext_type load: foo ; */ +/*@ + axiomatic Pred { + predicate P(foo f) reads \nothing ; + } +*/ +/*@ lemma X: \forall foo f ; P(f) ; */ +\end{lstlisting} + +is correctly parsed and typed by Frama-C and leads to the following displayed +version in the interface: + +\includegraphics[width=\textwidth]{examples/acsl_extension_ext_types} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/doc/developer/examples/acsl_extension_ext_types.ml b/doc/developer/examples/acsl_extension_ext_types.ml new file mode 100644 index 00000000000..504b903633e --- /dev/null +++ b/doc/developer/examples/acsl_extension_ext_types.ml @@ -0,0 +1,41 @@ +open Logic_ptree +open Logic_typing +open Cil_types + +let preprocessor = + List.map (fun e -> begin match e with + | { lexpr_node = PLnamed ("load", { lexpr_node = PLvar s}) } -> + if not (Logic_env.is_logic_type s) then Logic_env.add_typename s + else Kernel.error "Type already exists %s" s + | _ -> () + end ; e) + +module Ts = struct + let id = ref 0 + let types = Hashtbl.create 5 + + let add t = let i = !id in Hashtbl.add types i t ; id := i + 1 ; i + let find = Hashtbl.find types +end + +let typer ctxt loc = function + | [ { lexpr_node = PLnamed ("load", { lexpr_node = PLvar s}) } ] -> + let ti = { lt_name = s ; lt_params = [] ; lt_def = None ; lt_attr = []} in + ctxt.add_logic_type s ti ; + Ext_id (Ts.add ti) + | _ -> + ctxt.error loc "Expected type loader" + +let visitor _ _ = Cil.SkipChildren + +let gen_printer s _pp fmt = function + | Ext_id i -> + Format.fprintf fmt "%s%s" (if s then "" else "load: ") (Ts.find i).lt_name + | _ -> assert false + +let printer = gen_printer false +let short_printer = gen_printer true + +let () = + Acsl_extension.register_global + "ext_type" ~preprocessor typer ~visitor ~printer ~short_printer false \ No newline at end of file diff --git a/doc/developer/examples/acsl_extension_ext_types.png b/doc/developer/examples/acsl_extension_ext_types.png new file mode 100644 index 0000000000000000000000000000000000000000..10943fd6b17151f8c5cc60cc9557a0b4d8c6b31c GIT binary patch literal 31170 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 literal 0 HcmV?d00001 diff --git a/doc/developer/examples/acsl_extension.ml b/doc/developer/examples/acsl_extension_foo.ml similarity index 78% rename from doc/developer/examples/acsl_extension.ml rename to doc/developer/examples/acsl_extension_foo.ml index 9c677e00200..239ccd00b7a 100644 --- a/doc/developer/examples/acsl_extension.ml +++ b/doc/developer/examples/acsl_extension_foo.ml @@ -2,7 +2,7 @@ open Logic_ptree open Cil_types open Logic_typing -let type_foo ~typing_context ~loc:_loc l = +let type_foo typing_context _loc l = let type_term ctxt env expr = match expr.lexpr_node with | PLvar "\\foo" -> Logic_const.tinteger ~loc:expr.lexpr_loc 42 @@ -14,4 +14,4 @@ let type_foo ~typing_context ~loc:_loc l = in Ext_terms res -let () = Logic_typing.register_behavior_extension "foo" false type_foo +let () = Acsl_extension.register_behavior "foo" type_foo false -- GitLab