package mopsa
Install
dune-project
Dependency
Authors
Maintainers
Sources
md5=37966e98ffeebcedc09bd6e9b2b81f69
sha512=40d4d826c25f680766c07eccbabdf5e8a4fa023016e8a164e4e4f6b3781c8484dc4df437055721dfd19b9db8fb7fe3b61236c4833186d346fc7204a68d01eaaa
doc/mopsa.mopsa_analyzer/Mopsa_analyzer/Languages/C/Memory/Smashing/Domain/index.html
Module Smashing.Domain
Domain header
*****************
val scalar : MopsaLib.route
Smashes
***********
Types of smashed elements
type smash = {
base : Common.Base.base;
(*smashed memory container
*)styp : styp;
(*type of the smashed elements
*)
}
Smashes
val pp_styp : Format.formatter -> styp -> unit
val pp_smash : Format.formatter -> smash -> unit
val styp_of_typ : MopsaLib.typ -> styp
val typ_of_styp : styp -> MopsaLib.typ
val sizeof_styp : styp -> 'a Mopsa_analyzer.MopsaLib.Flow.flow -> Z.t
val rangeof_styp : styp -> 'a Mopsa_analyzer.MopsaLib.Flow.flow -> Z.t * Z.t
val mk_smash : Common.Base.base -> MopsaLib.typ -> smash
Abstract state
******************
module STypeSet : sig ... end
module Init : sig ... end
Initialization state with shortcut states to avoid useless tests on `uninit`
module State : sig ... end
type t = State.t
include sig ... end
val id : t Mopsa_analyzer__Framework__Core__Id.id
val debug : ('a, Format.formatter, unit, unit) format4 -> 'a
Smash variables
*******************
val mk_smash_var : smash -> MopsaLib.var
Create a variable from a smash
val mk_smash_expr :
smash ->
?typ:MopsaLib.typ option ->
?mode:Framework.Core.Ast.Var.mode option ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
val add_smash :
Common.Base.base ->
styp ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
Functions for managing smash variables
val remove_smash :
Common.Base.base ->
styp ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val rename_smash :
Common.Base.base ->
Common.Base.base ->
styp ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val forget_smash :
Common.Base.base ->
styp ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val expand_smash :
Common.Base.base ->
Common.Base.base list ->
styp ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val fold_smash :
Common.Base.base ->
Common.Base.base list ->
styp ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
Offset of the first uninitialized element
*********************************************
val mk_uninit_var : Common.Base.base -> MopsaLib.var
val mk_uninit_expr :
Common.Base.base ->
?mode:Framework.Core.Ast.Var.mode option ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
val add_uninit :
Common.Base.base ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
Functions for managing uninit variables
val set_uninit_to_base_size :
Common.Base.base ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
('a, unit) Mopsa_analyzer.MopsaLib.Cases.cases
val remove_uninit :
Common.Base.base ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val rename_uninit :
Common.Base.base ->
Common.Base.base ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val forget_uninit :
Common.Base.base ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val expand_uninit :
Common.Base.base ->
Common.Base.base list ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
val fold_uninit :
Common.Base.base ->
Common.Base.base list ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Core.Post.post
Unification
***************
val phi_int :
smash ->
Init.t ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
Synthesis function of integer smashes
val phi_nullptr :
smash ->
Init.t ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
val phi :
smash ->
Mopsa_utils.Core.Location.range ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
('a, unit) Mopsa_analyzer.MopsaLib.Cases.cases
phi s r m f
synthesizes the value of smash s
when existing smashes in the same base exist
val unify_range : MopsaLib.range
Singleton unification range
val unify :
('s, State.t) MopsaLib.man ->
's Framework.Core.Context.ctx ->
(t * 's) ->
(t * 's) ->
's * 's
Lattice operators
*********************
val bottom : State.t
val top : State.t
val subset :
('a, State.t) MopsaLib.man ->
'a Framework.Core.Context.ctx ->
(t * 'a) ->
(t * 'a) ->
bool * 'a * 'a
val join :
('a, State.t) MopsaLib.man ->
'a Framework.Core.Context.ctx ->
(t * 'a) ->
(t * 'a) ->
State.t * 'a * 'a
val meet :
('a, State.t) MopsaLib.man ->
'a Framework.Core.Context.ctx ->
(t * 'a) ->
(t * 'a) ->
State.t * 'a * 'a
val widen :
('a, State.t) MopsaLib.man ->
'a Framework.Core.Context.ctx ->
(t * 'a) ->
(t * 'a) ->
State.t * 'a * 'a * bool
Pretty printer
******************
val print_state : MopsaLib.printer -> t -> unit
Initialization procedure
****************************
val init :
'a ->
('b, State.t) Framework.Core.Manager.man ->
'b Core.Flow.flow ->
'b Core.Post.post option
Utility functions
*********************
val eval_pointed_base_offset :
MopsaLib.expr ->
'a ->
('b, 'c) MopsaLib.man ->
'b Core.Flow.flow ->
('b, Common.Base.base * MopsaLib.expr * MopsaLib.mode option)
Mopsa_analyzer.MopsaLib.Cases.cases
Get the base and offset pointed by ptr
val is_interesting_base : Common.Base.base -> bool
Predicate defining interesting bases to smash
val fold_stypes :
(styp ->
MopsaLib.range ->
('b, 'c) MopsaLib.man ->
'a MopsaLib.flow ->
'a MopsaLib.post) ->
STypeSet.t ->
MopsaLib.range ->
('b, 'c) MopsaLib.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
Fold an exec transfer function over a set of stypes
val exec_smashes :
(styp ->
MopsaLib.range ->
('b, 'c) MopsaLib.man ->
'a MopsaLib.flow ->
'a MopsaLib.post) ->
Common.Base.Base.t ->
State.t ->
MopsaLib.range ->
('b, 'c) MopsaLib.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
Fold an exec transfer function smashes of a base
val exec_uninit :
(MopsaLib.range ->
('b, 'c) MopsaLib.man ->
'a MopsaLib.flow ->
'a MopsaLib.post) ->
Common.Base.Base.t ->
State.t ->
MopsaLib.range ->
('b, 'c) MopsaLib.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
Execute a transfer when a uninit variable exists
Environment transfer functions
**********************************
val exec_add_base :
Common.Base.base ->
'a ->
('b, State.t) Framework.Core.Manager.man ->
'b Core.Flow.flow ->
'b Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ add(base); ⟧
val exec_declare_variable :
MopsaLib.var ->
'a ->
'b ->
('c, State.t) Framework.Core.Manager.man ->
'c Core.Flow.flow ->
'c Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ type v; ⟧
val exec_remove_base :
Common.Base.base ->
MopsaLib.range ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ remove(base); ⟧
val exec_rename_base :
Common.Base.base ->
Common.Base.base ->
MopsaLib.range ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ rename(base1,base2);
val exec_expand_base :
Common.Base.base ->
Common.Base.base list ->
MopsaLib.range ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ expand(base, bases); ⟧
val exec_fold_bases :
Common.Base.base ->
Common.Base.base list ->
Mopsa_utils.Core.Location.range ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ fold(base, bases); ⟧
val exec_forget :
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, unit) Mopsa_analyzer.MopsaLib.Cases.cases
𝕊⟦ forget(lval) ⟧
val exec_forget_quant :
(Stubs.Ast.quant * MopsaLib.var * Stubs.Ast.set) list ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, unit) Mopsa_analyzer.MopsaLib.Cases.cases
𝕊⟦ ∀i ∈ lo,hi
: forget( *(p + i) ) ⟧
Assignment transfer function
********************************
val exec_assign :
MopsaLib.expr ->
Framework.Core.Ast.Expr.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, unit) Mopsa_analyzer.MopsaLib.Cases.cases
𝕊⟦ lval = rval; ⟧
Exec entry point
********************
val exec :
MopsaLib.stmt ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post option
Abstract evaluations
************************
val eval_deref :
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, Framework.Core.Ast.Expr.expr) Mopsa_analyzer.MopsaLib.Cases.cases
Abstract evaluation of a dereference
Quantified tests transfer functions
***************************************
val assume_forall_compare :
MopsaLib.var ->
MopsaLib.expr ->
MopsaLib.expr ->
Framework.Core.Ast.Operator.operator ->
Common.Base.base ->
MopsaLib.expr ->
Framework.Core.Ast.Var.mode option ->
MopsaLib.typ ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) Framework.Core.Manager.man ->
'a Core.Flow.flow ->
('a, unit) Mopsa_analyzer.MopsaLib.Cases.cases
𝕊⟦ ∀i ∈ lo,hi
: *(p + i) ? e ⟧
val assume_forall_eq2 :
MopsaLib.var ->
MopsaLib.expr ->
MopsaLib.expr ->
Common.Base.Base.t ->
MopsaLib.expr ->
'a ->
MopsaLib.typ ->
MopsaLib.typ ->
Common.Base.Base.t ->
MopsaLib.expr ->
'b ->
MopsaLib.typ ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
('c, State.t) Framework.Core.Manager.man ->
'c Core.Flow.flow ->
('c, unit) Mopsa_analyzer.MopsaLib.Cases.cases
𝕊⟦ ∀i ∈ lo,hi
: *(p + i) == *(q + i) ⟧
val assume_exists_compare :
'a ->
'b ->
'c ->
'd ->
'e ->
'f ->
'g ->
'h ->
'i ->
'j ->
'k ->
'l Core.Flow.flow ->
'l Mopsa_analyzer.MopsaLib.Post.post
val assume_exists_ne2 :
'a ->
'b ->
'c ->
'd ->
'e ->
'f ->
'g ->
'h ->
'i ->
'j ->
'k ->
'l ->
'm ->
'n ->
'o ->
'p Core.Flow.flow ->
'p Mopsa_analyzer.MopsaLib.Post.post
val eval_forall_compare :
MopsaLib.var ->
MopsaLib.expr ->
MopsaLib.expr ->
Framework.Core.Ast.Operator.operator ->
MopsaLib.expr ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, Framework.Core.Ast.Expr.expr) Mopsa_analyzer.MopsaLib.Cases.cases
val eval_forall_eq2 :
MopsaLib.var ->
MopsaLib.expr ->
MopsaLib.expr ->
MopsaLib.expr ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, Framework.Core.Ast.Expr.expr) Mopsa_analyzer.MopsaLib.Cases.cases
val eval :
MopsaLib.expr ->
('a, State.t) MopsaLib.man ->
'a Core.Flow.flow ->
('a, Framework.Core.Ast.Expr.expr) Mopsa_analyzer.MopsaLib.Cases.cases option
Evaluations entry point
Query handler
*****************
- Domain header
- Smashes
- Abstract state
- Smash variables
- Offset of the first uninitialized element
- Unification
- Lattice operators
- Pretty printer
- Initialization procedure
- Utility functions
- Environment transfer functions
- Assignment transfer function
- Exec entry point
- Abstract evaluations
- Quantified tests transfer functions
- Query handler