RelationAnalysis.SpecFunctormodule Priv : RelationPriv.Smodule RD : RelationDomain.RDmodule PCU : RelationPrecCompareUtil.Utilinclude module type of struct include Analyses.DefaultSpec endval vdecl : ('a, 'b, 'c, 'd) Analyses.man -> 'e -> 'aval asm : ('a, 'b, 'c, 'd) Analyses.man -> 'aval skip : ('a, 'b, 'c, 'd) Analyses.man -> 'aval paths_as_set : ('a, 'b, 'c, 'd) Analyses.man -> 'a listmodule A = Analyses.UnitAmodule Priv : sig ... endmodule D : sig ... endmodule G = Priv.Gmodule V : sig ... endmodule P : sig ... endmodule RV = RD.Vmodule PCU : sig ... endval exitstate : 'a -> (RD.t, Priv.D.t) RelationDomain.relcomponents_tval startstate : 'a -> (RD.t, Priv.D.t) RelationDomain.relcomponents_tval read_global :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
RelationDomain.RelComponents(RD)(Priv.D).t ->
GoblintCil.varinfo ->
GoblintCil.varinfo ->
RD.tmodule VH : sig ... endval read_globals_to_locals :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.exp ->
RD.t * GoblintCil.exp * GoblintCil.varinfo VH.tval read_globals_to_locals_inv :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.varinfo list ->
RD.t * (GoblintCil.exp -> GoblintCil.exp) * GoblintCil.varinfo VH.tval read_from_globals_wrapper :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.exp ->
(RD.t -> GoblintCil.exp -> 'a) ->
'aval assign_from_globals_wrapper :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.exp ->
(RD.t -> GoblintCil.exp -> RD.t) ->
RD.tval write_global :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
(Priv.V.t -> Priv.G.t -> unit) ->
RelationDomain.RelComponents(RD)(Priv.D).t ->
GoblintCil.varinfo ->
GoblintCil.varinfo ->
RelationDomain.RelComponents(RD)(Priv.D).tval assign_to_global_wrapper :
Queries.ask ->
(Priv.V.t -> Priv.G.t) ->
(Priv.V.t -> Priv.G.t -> unit) ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.lval ->
((RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.varinfo ->
RD.t) ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tAn extended overflow handling inside relationAnalysis for expression assignments when overflows are assumed to occur. Since affine equalities can only keep track of integer bounds of expressions evaluating to definite constants, we now query the integer bounds information for expressions from other analysis. If an analysis returns bounds that are unequal to min and max of ikind , we can exclude the possibility that an overflow occurs and the abstract effect of the expression assignment can be used, i.e. we do not have to set the variable's value to top.
val no_overflow : Queries.ask -> GoblintCil.exp -> bool lazy_tval assert_type_bounds : Queries.ask -> RD.t -> GoblintCil.varinfo -> RD.tval replace_deref_exps :
(ValueDomain.AD.t Queries.t -> ValueDomain.AD.t) ->
GoblintCil.exp ->
GoblintCil.expval assign :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.lval ->
GoblintCil.exp ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval branch :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.exp ->
bool ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval any_local_reachable : GoblintCil.fundec -> VS.t -> boolval reachable_from_args :
('a, 'b, 'c, 'd) Analyses.man ->
GoblintCil.exp list ->
VS.tval belongs_to_fundec : GoblintCil.fundec -> GobApron.Var.t -> boolval make_callee_rel :
thread:bool ->
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.fundec ->
GoblintCil.exp list ->
RD.tval enter :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
'b ->
GoblintCil.fundec ->
GoblintCil.exp list ->
((RD.t, Priv.D.t) RelationDomain.relcomponents_t
* (RD.t, Priv.D.t) RelationDomain.relcomponents_t)
listval body :
((RD.t, 'a) RelationDomain.relcomponents_t, 'b, 'c, 'd) Analyses.man ->
GoblintCil.fundec ->
(RD.t, 'a) RelationDomain.relcomponents_tval return :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.exp option ->
GoblintCil.fundec ->
RelationDomain.RelComponents(RD)(Priv.D).tval combine_env :
(D.t, Priv.G.t, 'a, Priv.V.t) Analyses.man ->
'b ->
'c ->
GoblintCil.fundec ->
GoblintCil.exp list ->
'd ->
D.t ->
Queries.ask ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval combine_assign :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.lval option ->
'b ->
GoblintCil.fundec ->
'c ->
'd ->
'e ->
Queries.ask ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval invalidate_one :
Queries.ask ->
('a, Priv.G.t, 'b, Priv.V.t) Analyses.man ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.lval ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval reachables : Queries.ask -> GoblintCil.exp list -> ValueDomain.AD.tval forget_reachable :
('a, Priv.G.t, 'b, Priv.V.t) Analyses.man ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t ->
GoblintCil.exp list ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval assert_fn :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.exp ->
bool ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval special_unknown_invalidate :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.Cil.varinfo ->
LibraryDesc.Cil.Cil.exp list ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval special :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
GoblintCil.lval option ->
GoblintCil.Cil.varinfo ->
LibraryDesc.Cil.Cil.exp list ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_tval query_invariant :
(RelationDomain.RelComponents(RD)(Priv.D).t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
'b ->
Invariant.tval query_invariant_global :
('a, Priv.G.t, 'b, Priv.V.t) Analyses.man ->
Priv.V.t ->
Invariant.tval query :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'b, Priv.V.t)
Analyses.man ->
'a Queries.t ->
'a Queries.resultval threadenter :
(RelationDomain.RelComponents(RD)(Priv.D).t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
multiple:'b ->
'c ->
Cilfacade.VarinfoH.key ->
LibraryDesc.Cil.Cil.exp list ->
(RD.t, Priv.D.t) RelationDomain.relcomponents_t listval threadspawn :
('a, 'b, 'c, 'd) Analyses.man ->
multiple:'e ->
'f ->
'g ->
'h ->
'i ->
'aval event :
(RelationDomain.RelComponents(RD)(Priv.D).t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
Events.t ->
'b ->
RelationDomain.RelComponents(RD)(Priv.D).tval sync :
((RD.t, Priv.D.t) RelationDomain.relcomponents_t, Priv.G.t, 'a, Priv.V.t)
Analyses.man ->
[< `Init
| `Join
| `JoinCall of CilType.Fundec.t
| `Normal
| `Return
| `Thread ] ->
RelationDomain.RelComponents(RD)(Priv.D).t