From 7cd4e4691b3015b5a0742cb4fe86c688231b4fdb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Wed, 9 Feb 2022 15:59:44 +0100
Subject: [PATCH] [Eva] Removes spaces in empty lines when generating Eva.mli.

---
 src/plugins/value/Eva.mli    | 153 +++++++++++++++++------------------
 src/plugins/value/gen-api.sh |   8 +-
 2 files changed, 80 insertions(+), 81 deletions(-)

diff --git a/src/plugins/value/Eva.mli b/src/plugins/value/Eva.mli
index 8cde78579fa..8eb8fafc6ff 100644
--- a/src/plugins/value/Eva.mli
+++ b/src/plugins/value/Eva.mli
@@ -10,10 +10,10 @@ module Analysis: sig
       specified for the entry point using {!Db.Value.fun_set_args}, and
       an incorrect number of them is given.
       @plugin development guide *)
-  
+
   val is_computed : unit -> bool
   (** Return [true] iff the value analysis has been done. *)
-  
+
   val self : State.t
   (** Internal state of Eva analysis from projects viewpoint. *)
 end
@@ -24,47 +24,47 @@ module Results: sig
       to change in the future. It aims at replacing [Db.Value] but does not
       completely covers all its usages yet. As for now, this interface as some
       advantages over Db's :
-  
+
       - evaluations uses every available domains and not only Cvalue ;
       - the caller may distinguish failure cases when a request is unsucessful ;
       - working with callstacks is easy ;
       - some common shortcuts are provided (e.g. for extracting ival directly) ;
       - overall, individual functions are simpler.
-  
+
       The idea behind this API is that requests must be decomposed in several
       steps. For instance, to evaluate an expression :
-  
+
       1. first, you have to state where you want to evaluate it,
       2. optionally, you may specify in which callstack,
       3. you choose the expression to evaluate,
       4. you require a destination type to evaluate into.
-  
+
       Usage sketch :
-  
+
       Eva.Results.(
         before stmt |> in_callstack cs |>
         eval_var vi |> as_int |> default 0)
-  
+
       or equivalently, if you prefer
-  
+
       Eva.Results.(
         default O (as_int (eval_var vi (in_callstack cs (before stmt))))
   *)
-  
-  
+
+
   type callstack = (Cil_types.kernel_function * Cil_types.kinstr) list
-  
+
   type request
-  
+
   type value
   type address
   type 'a evaluation
-  
+
   type error = Bottom | Top | DisabledDomain
   type 'a result = ('a,error) Result.t
-  
+
   (** Results handling *)
-  
+
   (** Translates an error to a human readable string. *)
   val string_of_error : error -> string
   (** Pretty printer for errors. *)
@@ -72,14 +72,14 @@ module Results: sig
   (** Pretty printer for API's results. *)
   val pretty_result : (Format.formatter -> 'a -> unit) ->
     Format.formatter -> 'a result -> unit
-  
+
   (** [default d r] extracts the value of r if r is Ok or use the default value d
       otherwise.
       Equivalent to [Result.value ~default:d r] *)
   val default : 'a -> 'a result -> 'a
-  
+
   (** Control point selection *)
-  
+
   (** At the begining of the analysis, but after the initialization of globals. *)
   val at_start : request
   (** At the end of the analysis, after the main function has returned. *)
@@ -96,10 +96,10 @@ module Results: sig
   val before_kinstr : Cil_types.kinstr -> request
   (** Just after a statement or at the end of analysis. *)
   val after_kinstr : Cil_types.kinstr -> request
-  
-  
+
+
   (** Callstack selection *)
-  
+
   (** Only consider the given callstack. Replaces previous calls to [in_callstack]
       or [in_callstacks]. *)
   val in_callstack : callstack -> request -> request
@@ -110,10 +110,10 @@ module Results: sig
       can be added. If callstacks are also selected with [in_callstack] or
       [in_callstacks], only the selected callstacks will be filtered. *)
   val filter_callstack : (callstack -> bool) -> request -> request
-  
-  
+
+
   (** Working with callstacks *)
-  
+
   (** Retrieves the list of reachable callstacks from the given request. *)
   val callstacks : request -> callstack list
   (** Retrieves, a list of subrequest for each reachable callstack from
@@ -123,19 +123,19 @@ module Results: sig
   val iter_callstacks : (callstack -> request -> unit) -> request -> unit
   (** Fold on the reachable callstacks from the request. *)
   val fold_callstacks : (callstack -> request -> 'a -> 'a) -> 'a -> request -> 'a
-  
-  
+
+
   (** State requests *)
-  
+
   (** Returns the list of expressions which have been infered to be equal to
       the given expression by the Equality domain. *)
   val equality_class : Cil_types.exp -> request -> Cil_types.exp list result
   (** Returns the Cvalue model. *)
   val as_cvalue_model : request -> Cvalue.Model.t result
-  
-  
+
+
   (** Dependencies *)
-  
+
   (** Computes (an overapproximation of) the zone of each bit that must be read to
       evaluate the given expression, including all adresses computations. *)
   val expr_deps : Cil_types.exp -> request -> Locations.Zone.t
@@ -145,20 +145,20 @@ module Results: sig
   (** Computes (an overapproximation of) the zone of each bit that must be read to
       evaluate the given lvalue, excluding the lvalue zone itself. *)
   val address_deps : Cil_types.lval -> request -> Locations.Zone.t
-  
-  
+
+
   (** Evaluation *)
-  
+
   (** Returns the variable's values infered by the analysis. *)
   val eval_var : Cil_types.varinfo -> request -> value evaluation
   (** Returns the lvalue's values infered by the analysis. *)
   val eval_lval : Cil_types.lval -> request -> value evaluation
   (** Returns the expression's values infered by the analysis. *)
   val eval_exp : Cil_types.exp -> request -> value evaluation
-  
+
   (** Returns the lvalue's addresses infered by the analysis. *)
   val eval_address : Cil_types.lval -> request -> address evaluation
-  
+
   (** Returns the kernel functions into which the given expression may evaluate.
       If the callee expression doesn't always evaluate to a function, those
       spurious values are ignored. If it always evaluate to a non-function value
@@ -168,14 +168,14 @@ module Results: sig
       Also see [callee] for a function which applies directly on Call
       statements. *)
   val eval_callee : Cil_types.exp -> request -> Kernel_function.t list result
-  
-  
+
+
   (** Evaluated values conversion *)
-  
+
   (** In all the functions below, if Eva's infered value does not fit in the
       required type, [Error Top] is returned, as Top is the only possible
       over-approximation of the request. *)
-  
+
   (** Convert into a singleton ocaml int *)
   val as_int : value evaluation -> int result
   (** Convert into a singleton unbounded integer *)
@@ -188,26 +188,26 @@ module Results: sig
   val as_fval : value evaluation -> Fval.t result
   (** Convert into a C value abstraction *)
   val as_cvalue : value evaluation -> Cvalue.V.t result
-  
+
   (** Convert into a C location abstraction *)
   val as_location : address evaluation -> Locations.location result
   (** Convert into a Zone *)
   val as_zone : ?access:Locations.access -> address evaluation ->
     Locations.Zone.t result
-  
-  
+
+
   (** Evaluation properties *)
-  
+
   (** Returns whether the evaluated value is initialized or not. If the value have
       been evaluated from a Cil expression, it is always considered initialized.
   *)
   val is_initialized : value evaluation -> bool
   (** Returns the set of alarms emitted during the evaluation. *)
   val alarms : 'a evaluation -> Alarms.t list
-  
-  
+
+
   (** Reachability *)
-  
+
   (** Returns true if there are no reachable states for the given request. *)
   val is_empty : request -> bool
   (** Returns true if an evaluation ended to bottom, i.e. if the given expression
@@ -220,17 +220,17 @@ module Results: sig
   (** Returns true if a statement have been reached by the analysis, or if
       the main function have been analyzed for [Kglobal]. *)
   val is_reachable_kinstr : Cil_types.kinstr -> bool
-  
-  
+
+
   (*** Callers / Callees / Callsites *)
-  
+
   (** Returns the list of infered callers of the given function. *)
   val callers : Cil_types.kernel_function -> Cil_types.kernel_function list
   (** Returns the list of infered callers, and for each of them, the list
       of callsites (the call statements) inside. *)
   val callsites : Cil_types.kernel_function ->
     (Cil_types.kernel_function * Cil_types.stmt list) list
-  
+
   (** Returns the kernel functions called in the given statement.
       If the callee expression doesn't always evaluate to a function, those
       spurious values are ignored. If it always evaluate to a non-function value
@@ -238,12 +238,12 @@ module Results: sig
       Raises [Stdlib.Invalid_argument] if the statement is not a [Call]
       instruction or a [Local_init] with [ConsInit] initializer. *)
   val callee : Cil_types.stmt -> Kernel_function.t list
-  
+
 end
 
 module Value_results: sig
   type results
-  
+
   val get_results: unit -> results
   val set_results: results -> unit
   val merge: results -> results -> results
@@ -257,12 +257,12 @@ end
 module Value_parameters: sig
   (** Returns the list (name, descr) of currently enabled abstract domains. *)
   val enabled_domains: unit -> (string * string) list
-  
+
   (** [use_builtin kf name] instructs the analysis to use the builtin [name]
       to interpret calls to function [kf].
       Raises [Not_found] if there is no builtin of name [name]. *)
   val use_builtin: Cil_types.kernel_function -> string -> unit
-  
+
   (** [use_global_value_partitioning vi] instructs the analysis to use
       value partitioning on the global variable [vi]. *)
   val use_global_value_partitioning: Cil_types.varinfo -> unit
@@ -270,7 +270,7 @@ end
 
 module Eval_terms: sig
   type labels_states = Cvalue.Model.t Cil_datatype.Logic_label.Map.t
-  
+
   (** Evaluation environment. Currently available are function Pre and Post, or
       the environment to evaluate an annotation *)
   type eval_env
@@ -288,7 +288,7 @@ end
 module Unit_tests: sig
   (** Currently tested by this module:
       - semantics of sign values. *)
-  
+
   (** Runs some programmatic tests on Eva. *)
   val run: unit -> unit
 end
@@ -296,47 +296,47 @@ end
 module Eva_annotations: sig
   (** Register special annotations to locally guide the partitioning of states
       performed by an Eva analysis:
-  
+
       - slevel annotations: "slevel default", "slevel merge" and "slevel i"
       - loop unroll annotations: "loop unroll term"
       - value partitioning annotations: "split term" and "merge term"
       - subdivision annotations: "subdivide i"
-  
+
       Widen hints annotations are still registered in !{widen_hints_ext.ml}. *)
-  
+
   (** Annotations tweaking the behavior of the -eva-slevel paramter. *)
   type slevel_annotation =
     | SlevelMerge        (** Join all states separated by slevel. *)
     | SlevelDefault      (** Use the limit defined by -eva-slevel. *)
     | SlevelLocal of int (** Use the given limit instead of -eva-slevel. *)
     | SlevelFull         (** Remove the limit of number of separated states. *)
-  
+
   (** Loop unroll annotations. *)
   type unroll_annotation =
     | UnrollAmount of Cil_types.term (** Unroll the n first iterations. *)
     | UnrollFull (** Unroll amount defined by -eva-default-loop-unroll. *)
-  
+
   type split_kind = Static | Dynamic
-  
+
   type split_term =
     | Expression of Cil_types.exp
     | Predicate of Cil_types.predicate
-  
+
   (** Split/merge annotations for value partitioning.  *)
   type flow_annotation =
     | FlowSplit of split_term * split_kind
     (** Split states according to a term. *)
     | FlowMerge of split_term
     (** Merge states separated by a previous split. *)
-  
+
   type allocation_kind = By_stack | Fresh | Fresh_weak | Imprecise
-  
+
   val get_slevel_annot : Cil_types.stmt -> slevel_annotation option
   val get_unroll_annot : Cil_types.stmt -> unroll_annotation list
   val get_flow_annot : Cil_types.stmt -> flow_annotation list
   val get_subdivision_annot : Cil_types.stmt -> int list
   val get_allocation: Cil_types.stmt -> allocation_kind
-  
+
   val add_slevel_annot : emitter:Emitter.t ->
     Cil_types.stmt -> slevel_annotation -> unit
   val add_unroll_annot : emitter:Emitter.t ->
@@ -361,18 +361,18 @@ end
 module Builtins: sig
   (** Eva analysis builtins for the cvalue domain, more efficient than their
       equivalent in C. *)
-  
+
   open Cil_types
-  
+
   exception Invalid_nb_of_args of int
   exception Outside_builtin_possibilities
-  
+
   (* Signature of a builtin: type of the result, and type of the arguments. *)
   type builtin_type = unit -> typ * typ list
-  
+
   (** Can the results of a builtin be cached? See {eval.mli} for more details.*)
   type cacheable = Eval.cacheable = Cacheable | NoCache | NoCacheCallers
-  
+
   type full_result = {
     c_values: (Cvalue.V.t option * Cvalue.Model.t) list;
     (** A list of results, consisting of:
@@ -385,7 +385,7 @@ module Builtins: sig
     (** If not None, the froms of the function, and its sure outputs;
         i.e. the dependencies of the result and of each zone written to. *)
   }
-  
+
   (** The result of a builtin can be given in different forms. *)
   type call_result =
     | States of Cvalue.Model.t list
@@ -399,12 +399,12 @@ module Builtins: sig
         computed by the builtin. *)
     | Full of full_result
     (** See [full_result] type. *)
-  
+
   (** Type of a cvalue builtin, whose arguments are:
       - the memory state at the beginning of the function call;
       - the list of arguments of the function call. *)
   type builtin = Cvalue.Model.t -> (exp * Cvalue.V.t) list -> call_result
-  
+
   (** [register_builtin name ?replace ?typ cacheable f] registers the function [f]
       as a builtin to be used instead of the C function of name [name].
       If [replace] is provided, the builtin is also used instead of the C function
@@ -414,8 +414,7 @@ module Builtins: sig
       The results of the builtin are cached according to [cacheable]. *)
   val register_builtin:
     string -> ?replace:string -> ?typ:builtin_type -> cacheable -> builtin -> unit
-  
+
   (** Has a builtin been registered with the given name? *)
   val is_builtin: string -> bool
 end
-
diff --git a/src/plugins/value/gen-api.sh b/src/plugins/value/gen-api.sh
index 865406c581f..2bfcce11bc8 100755
--- a/src/plugins/value/gen-api.sh
+++ b/src/plugins/value/gen-api.sh
@@ -1,12 +1,12 @@
 #!/bin/bash -eu
 
-printf '(* This file is generated. Do not edit. *)\n\n'
+printf '(* This file is generated. Do not edit. *)\n'
 
 for i in "$@"
 do
     file=$(basename $i)
     module=${file%.*}
-    printf 'module %s: sig\n' ${module^}
-    awk '/\[@@@ api_start\]/{flag=1;next} /\[@@@ api_end\]/{flag=0} flag{ print  " ", $0 }' $i
-    printf 'end\n\n'
+    printf '\nmodule %s: sig\n' ${module^}
+    awk '/\[@@@ api_start\]/{flag=1;next} /\[@@@ api_end\]/{flag=0} flag{ print (NF ? "  ":"") $0 }' $i
+    printf 'end\n'
 done
-- 
GitLab