package frama-c

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

Useful functions for building pretty-printers

val mutable logic_printer_enabled : bool

Local logical annotation (function specifications and code annotations are printed only if logic_printer_enabled is set to true.

val mutable force_brace : bool

If set to true (default is false, some additional braces are printed.

val mutable verbose : bool

more info is displayed when on verbose mode. This flag is synchronized with Frama-C's kernel being on debug mode.

val mutable is_ghost : bool

are we printing ghost code?

method reset : unit -> unit
method private current_function : Frama_c_kernel.Cil_types.varinfo option
  • returns

    the varinfo corresponding to the function being printed

method private current_behavior : Frama_c_kernel.Cil_types.funbehavior option
  • returns

    the funbehavior being pretty-printed.

method private stmt_has_annot : Frama_c_kernel.Cil_types.stmt -> bool

true if the given statement has some annotations attached to it.

  • since Phosphorus-20170501-beta1
method private has_annot : bool

true if current_stmt has some annotations attached to it.

method private in_ghost_if_needed : Format.formatter -> bool -> ?break_ghost:bool -> post_fmt:((Format.formatter -> unit) -> unit, Format.formatter, unit) format -> ?block:bool -> (unit -> unit) -> unit

Open a ghost context if the the first bool is true and we are not already in a ghost context. break_ghost indicates whether we should break after the ghost keyword, defaults to true. post_fmt is a format like "%t" and is used to define the format at the end of the ghost context. block indicates whether we should open a C block or not (defaults to true). The last parameter is the function to be applied in the ghost context (generally some AST element).

  • since 20.0-Calcium
method private current_stmt : Frama_c_kernel.Cil_types.stmt option
  • returns

    the stmt being printed

method private may_be_skipped : Frama_c_kernel.Cil_types.stmt -> bool

This is called to check that a given statement may be compacted with another one. For example this is called whenever a while(1) followed by a conditional if (cond) break; may be compacted into while (cond).

  • returns

    true if the given block must be enclosed in a pair of braces, given the context in which it appears.

  • returns

    true if the given block may be inlined in a single line. has_annot indicates if the stmt corresponding to the block may have annotations (default is true).

method private get_instr_terminator : unit -> string

What terminator to print after an instruction. sometimes we want to print sequences of instructions separated by comma

method private set_instr_terminator : string -> unit
method private opt_funspec : Format.formatter -> Frama_c_kernel.Cil_types.funspec -> unit

Pretty-printing of C code

method varname : Format.formatter -> string -> unit

Invoked each time an identifier name is to be printed. Allows for various manipulation of the name, such as unmangling.

Invoked for each variable declaration. Note that variable declarations are all the GVar, GVarDecl, GFun, GFunDecl, all the varinfo in formals of function types, and the formals and locals for function definitions.

Invoked on each variable use.

Invoked on each lvalue occurrence

Invoked on each offset occurrence. The second argument is the base.

Global (vars, types, etc.). This can be slow.

A field declaration

Use of some type in some declaration. fundecl is the name of the function which is declared with the corresponding type. The second argument is used to print the declared element, or is None if we are just printing a type with no name being declared. If fundecl is not None, second argument must also have a value.

Attribute parameter

Attribute. Also return an indication whether this attribute must be printed inside the __attribute__ list or not.

Attribute lists

method line_directive : ?forcefile:bool -> Format.formatter -> Frama_c_kernel.Cil_types.location -> unit

Print a line-number. This is assumed to come always on an empty line. If the forcefile argument is present and is true then the file name will be printed always. Otherwise the file name is printed only if it is different from the last time this function is called. The last file name is stored in a private field inside the cilPrinter object.

method stmt_labels : Format.formatter -> Frama_c_kernel.Cil_types.stmt -> unit

Print only the labels of the statement. Used by annotated_stmt.

Print an annotated statement. The code to be printed is given in the last Cil_types.stmt argument. The initial Cil_types.stmt argument records the statement which follows the one being printed.

Print a statement kind. The code to be printed is given in the Cil_types.stmtkind argument. The initial Cil_types.stmt argument records the statement which follows the one being printed; defaultCilPrinterClass uses this information to prettify statement printing in certain special cases. The boolean flag indicated whether the statement has labels (which have already been printed)

Invoked on each instruction occurrence.

Control-flow statement. annot is true iff the printer prints the annotations of the stmt.

Prints a block.

Print expressions

Print initializers. This can be slow.

Pretty-printing of annotations

method logic_type : (Format.formatter -> unit) option -> Format.formatter -> Frama_c_kernel.Cil_types.logic_type -> unit
method term_binop : Format.formatter -> Frama_c_kernel.Cil_types.binop -> unit
method term_node : Format.formatter -> Frama_c_kernel.Cil_types.term -> unit
method logic_builtin_label : Format.formatter -> Frama_c_kernel.Cil_types.logic_builtin_label -> unit
method builtin_logic_info : Format.formatter -> Frama_c_kernel.Cil_types.builtin_logic_info -> unit
method identified_predicate : Format.formatter -> Frama_c_kernel.Cil_types.identified_predicate -> unit
method complete_behaviors : Format.formatter -> string list -> unit
method disjoint_behaviors : Format.formatter -> string list -> unit
method post_cond : Format.formatter -> (Frama_c_kernel.Cil_types.termination_kind * Frama_c_kernel.Cil_types.identified_predicate) -> unit

pretty prints a post condition according to the exit kind it represents

method assigns : string -> Format.formatter -> Frama_c_kernel.Cil_types.assigns -> unit

first parameter is the introducing keyword (e.g. loop_assigns or assigns).

method allocation : isloop:bool -> Format.formatter -> Frama_c_kernel.Cil_types.allocation -> unit

first parameter is the introducing keyword (e.g. loop_allocates, loop_frees, allocates or free)

  • since Oxygen-20120901.
method from : string -> Format.formatter -> Frama_c_kernel.Cil_types.from -> unit

prints an assignment with its dependencies.

method global_annotation : Format.formatter -> Frama_c_kernel.Cil_types.global_annotation -> unit

Modifying pretty-printer behavior

method pp_while_head : Format.formatter -> Frama_c_kernel.Cil_types.exp -> unit

Prints the recovered while (cond) exit condition of a loop. Note: this method will be called in a context where 'current_stmt' is tied to the original AST conditional statement that exits the loop, as expected.

method pp_keyword : Format.formatter -> string -> unit

All C99 keywords except types "char", "int", "long", "signed", "short", "unsigned", "void" and "_XXX" (like "_Bool") *

method pp_acsl_keyword : Format.formatter -> string -> unit

All ACSL keywords except logic types

method pp_open_annotation : ?block:bool -> ?pre:Frama_c_kernel.Pretty_utils.sformat -> Format.formatter -> unit
method pp_close_annotation : ?block:bool -> ?suf:Frama_c_kernel.Pretty_utils.sformat -> Format.formatter -> unit

Called before/after printing an annotation comment. Put the annotation in a block according to the optional argument. If it is not set, the annotation is put in a block. *

method without_annot : 'a. (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a -> unit

self#without_annot printer fmt x pretty prints x by using printer, without pretty-printing its function contracts and code annotations.

method force_brace : 'a. (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a -> unit

self#force_brace printer fmt x pretty prints x by using printer, but add some extra braces '{' and '}' which are hidden by default.

OCaml

Innovation. Community. Security.