package goblint
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=b729c94adb383a39aea32eb005c988dfd44b92af22ee6a4eedf4239542ac6c26
sha512=643b98770e5fe5644324c95c9ae3a9f698f25c8b11b298f0751d524e0b20af368b2a465fc8200b75a73d48fc9a053fd90f5e8920d4db070927f93188bb8687e0
doc/goblint.lib/Goblint_lib/Base/MainFunctor/index.html
Module Base.MainFunctor
Parameters
module Priv : BasePriv.Smodule RVEval : BaseDomain.ExpEvaluator with type t = BaseComponents(Priv.D).tSignature
include module type of struct include Analyses.DefaultSpec end
module P = Analyses.UnitPval asm : ('a, 'b, 'c, 'd) Analyses.ctx -> 'aval skip : ('a, 'b, 'c, 'd) Analyses.ctx -> 'aval paths_as_set : ('a, 'b, 'c, 'd) Analyses.ctx -> 'a listmodule A = Analyses.UnitAmodule Dom : sig ... endtype t = Dom.tmodule D = Dommodule C = Dommodule V : sig ... endmodule G : sig ... endtype extra = (GoblintCil.varinfo * Offs.t * bool) listtype store = D.ttype value = VD.ttype address = AD.tval startstate : 'a -> storeval exitstate : 'a -> storemodule VarH : sig ... endmodule VarMap : sig ... endval add_to_array_map :
GoblintCil.fundec ->
(GoblintCil.varinfo * VD.t) list ->
unitval attributes_varinfo :
VarMap.key ->
GoblintCil.fundec ->
(GoblintCil.attributes * GoblintCil.attribute list) optionval project_val :
ValueDomainQueries.t ->
(GoblintCil.attributes * GoblintCil.attributes) option ->
PrecisionUtil.int_precision option ->
VD.t ->
bool ->
VD.tval project :
ValueDomainQueries.t ->
PrecisionUtil.int_precision option ->
CPA.t ->
GoblintCil.fundec ->
CPA.tval return_varstore : GoblintCil.varinfo refval return_var : unit -> AD.tval longjmp_return : GoblintCil.varinfo refval heap_var : bool -> ('a, 'b, 'c, 'd) Analyses.ctx -> Basetype.Variables.tval char_array : (GoblintCil.lval, Batteries.bytes) Batteries.Hashtbl.tval int_returning_binop_FD :
GoblintCil.binop ->
FD.t ->
FD.t ->
IntDomain.IntDomTuple.tval add_offset_varinfo : Addr.Offs.t -> Addr.t -> Addr.tval sync' :
[ `Init | `Join | `Normal | `Return | `Thread ] ->
(BaseDomain.BaseComponents(Priv.D).t,
[> `Bot | `Lifted1 of Priv.G.t ],
'a,
[> `Left of Priv.V.t ])
Analyses.ctx ->
D.tval sync :
(BaseDomain.BaseComponents(Priv.D).t,
[> `Bot | `Lifted1 of Priv.G.t ],
'a,
[> `Left of Priv.V.t ])
Analyses.ctx ->
[< `Init | `Join | `Normal | `Return | `Thread ] ->
D.tval publish_all :
(BaseDomain.BaseComponents(Priv.D).t,
[> `Bot | `Lifted1 of Priv.G.t ],
'a,
[> `Left of Priv.V.t ])
Analyses.ctx ->
[ `Init | `Join | `Normal | `Return | `Thread ] ->
unitval get :
?top:VD.t ->
?full:bool ->
Q.ask ->
glob_fun ->
store ->
address ->
GoblintCil.exp option ->
valueget st addr returns the value corresponding to addr in st * adding proper dependencies. * For the exp argument it is always ok to put None. This means not using precise information about * which part of an array is involved.
val reachable_top_pointers_types :
(store, G.t, 'a, V.t) Analyses.ctx ->
AD.t ->
Queries.TS.tEvaluate expression using EvalInt query. Base itself also answers EvalInt, so recursion goes indirectly through queries. This allows every subexpression to also meet more precise value from other analyses. Non-integer expression just delegate to next eval_rv function.
Evaluate expression without EvalInt query on outermost expression. This is used by base responding to EvalInt to immediately directly avoid EvalInt query cycle, which would return top. Recursive eval_rv calls on subexpressions still go through eval_rv_ask_evalint.
Evaluate expression structurally by base. This handles constants directly and variables using CPA. Subexpressions delegate to eval_rv, which may use queries on them.
val evalbinop_mustbeequal :
Q.ask ->
glob_fun ->
store ->
GoblintCil.binop ->
e1:GoblintCil.exp ->
?t1:GoblintCil.typ ->
e2:GoblintCil.exp ->
?t2:GoblintCil.typ ->
GoblintCil.typ ->
valueEvaluate BinOp using MustBeEqual query as fallback.
val eval_int :
Q.ask ->
glob_fun ->
store ->
GoblintCil.exp ->
IntDomain.IntDomTuple.tval query_evalint :
Q.ask ->
glob_fun ->
store ->
GoblintCil.exp ->
[> `Bot | `Lifted of IntDomain.IntDomTuple.t | `Top ]val eval_exp : store -> GoblintCil.exp -> IntDomain.IntDomTuple.int_t optionval eval_funvar :
(store, G.t, 'a, V.t) Analyses.ctx ->
GoblintCil.exp ->
ValueDomainQueries.AD.tEvaluate expression as address. Avoids expensive Apron EvalInt if the Int result would be useless to us anyway.
val is_not_alloc_var :
('a, 'b, 'c, 'd) Analyses.ctx ->
GoblintCil.varinfo ->
boolval is_not_heap_alloc_var :
('a, 'b, 'c, 'd) Analyses.ctx ->
GoblintCil.varinfo ->
boolval query_invariant :
(Priv.D.t BaseDomain.basecomponents_t, G.t, 'a, V.t) Analyses.ctx ->
Invariant.context ->
Invariant.tval query_invariant_global :
('a, [> `Bot | `Lifted1 of Priv.G.t ], 'b, [> `Left of Priv.V.t ])
Analyses.ctx ->
[< `Left of Priv.V.t | `Right of 'c ] ->
Invariant.tAdd dependencies between a value and the expression it (or any of its contents) are partitioned by
val set :
Q.ask ->
ctx:(store, G.t, 'a, V.t) Analyses.ctx ->
?invariant:bool ->
?lval_raw:GoblintCil.lval ->
?rval_raw:GoblintCil.exp ->
?t_override:GoblintCil.Cil.typ ->
glob_fun ->
store ->
AD.t ->
GoblintCil.Cil.typ ->
value ->
storeset st addr val returns a state where addr is set to val * it is always ok to put None for lval_raw and rval_raw, this amounts to not using/maintaining * precise information about arrays.
val rem_many_partitioning :
ValueDomainQueries.t ->
store ->
GoblintCil.varinfo list ->
storeval is_some_bot : value -> boolmodule InvariantEval : sig ... endmodule Invariant : sig ... endval invariant :
(InvariantEval.D.t, InvariantEval.G.t, 'a, InvariantEval.V.t) Analyses.ctx ->
Queries.ask ->
(InvariantEval.V.t -> InvariantEval.G.t) ->
InvariantEval.D.t ->
GoblintCil.exp ->
bool ->
InvariantEval.D.tval assign :
(store, G.t, 'a, V.t) Analyses.ctx ->
GoblintCil.lval ->
GoblintCil.exp ->
storeval branch :
(store, G.t, 'a, V.t) Analyses.ctx ->
GoblintCil.exp ->
bool ->
storeval body : (store, G.t, 'a, V.t) Analyses.ctx -> GoblintCil.fundec -> storeval return :
(store, G.t, 'a, V.t) Analyses.ctx ->
GoblintCil.exp option ->
GoblintCil.fundec ->
storeval vdecl : (store, G.t, 'a, V.t) Analyses.ctx -> GoblintCil.varinfo -> storeval collect_funargs :
Q.ask ->
?warn:bool ->
glob_fun ->
store ->
GoblintCil.exp list ->
address listFrom a list of expressions, collect a list of addresses that they might point to, or contain pointers to.
val forkfun :
(D.t, G.t, C.t, V.t) Analyses.ctx ->
GoblintCil.lval option ->
GoblintCil.varinfo ->
GoblintCil.exp list ->
(GoblintCil.lval option * GoblintCil.varinfo * GoblintCil.exp list) list
* boolval assert_fn :
(InvariantEval.D.t, InvariantEval.G.t, 'a, InvariantEval.V.t) Analyses.ctx ->
GoblintCil.exp ->
bool ->
InvariantEval.D.tval special_unknown_invalidate :
(store, G.t, 'a, V.t) Analyses.ctx ->
'b ->
glob_fun ->
store ->
CilType.Varinfo.t ->
Goblint_lib__LibraryDesc.Cil.Cil.exp list ->
storeval check_invalid_mem_dealloc :
(store, G.t, 'a, V.t) Analyses.ctx ->
GoblintCil.varinfo ->
GoblintCil.exp ->
unitval points_to_heap_only :
('a, 'b, 'c, 'd) Analyses.ctx ->
GoblintCil.exp ->
boolval get_size_of_ptr_target :
('a, 'b, 'c, 'd) Analyses.ctx ->
GoblintCil.exp ->
ValueDomainQueries.ID.t Queries.resultval combine_env :
(store, G.t, 'a, V.t) Analyses.ctx ->
'b ->
'c ->
GoblintCil.fundec ->
'd ->
'e ->
D.t ->
Queries.ask ->
Priv.D.t Goblint_lib__BaseDomain.basecomponents_tval threadspawn :
(BaseDomain.BaseComponents(Priv.D).t,
[> `Bot | `Lifted1 of Priv.G.t ],
'a,
[> `Left of Priv.V.t ])
Analyses.ctx ->
multiple:'b ->
GoblintCil.lval option ->
GoblintCil.varinfo ->
GoblintCil.exp list ->
('c, 'd, 'e, 'f) Analyses.ctx ->
D.tval unassume :
(D.t, G.t, 'a, V.t) Analyses.ctx ->
GoblintCil.exp ->
WideningTokens.TS.elt list ->
D.tval event :
(store, G.t, 'a, V.t) Analyses.ctx ->
Events.t ->
'b ->
BaseDomain.BaseComponents(Priv.D).t