package mopsa
Install
dune-project
Dependency
Authors
Maintainers
Sources
md5=37966e98ffeebcedc09bd6e9b2b81f69
sha512=40d4d826c25f680766c07eccbabdf5e8a4fa023016e8a164e4e4f6b3781c8484dc4df437055721dfd19b9db8fb7fe3b61236c4833186d346fc7204a68d01eaaa
doc/mopsa.mopsa_analyzer/Mopsa_analyzer/Languages/C/Memory/Aggregates/Domain/index.html
Module Aggregates.Domain
Domain header
================
include sig ... end
val debug : ('a, Format.formatter, unit, unit) format4 -> 'a
Command-line options
========================
val opt_init_memset_threshold : int ref
Size threshold (in bytes) for using memset to initialize memory blocks instead of a sequence of assignments
Initialization procedure
============================
Syntactic simplifications
=============================
val mk_lowlevel_subscript_access :
MopsaLib.expr ->
MopsaLib.expr ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
ai
-> *(a + i)
val mk_lowlevel_field_address :
MopsaLib.expr ->
int ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
𝔼⟦ &(p->f) ⟧ -> ( typeof(p->f)* )(( char* )p + alignof(p->f))
val pp_record_field : Format.formatter -> Lang.Ast.c_record_field -> unit
val pp_record_fields : Format.formatter -> Lang.Ast.c_record_field list -> unit
val locate_bitfield_cell :
Lang.Ast.c_record_field ->
MopsaLib.typ ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
int * int * MopsaLib.typ
val mk_lowlevel_bitfield_access :
MopsaLib.expr ->
Lang.Ast.c_record_field ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
MopsaLib.expr
Transform an access to a bitfield into an access to the container scalar with appropriate bitwise operations
val mk_lowlevel_arrow_access :
MopsaLib.expr ->
int ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
MopsaLib.expr
𝔼⟦ p->f ⟧ -> *(( typeof(p->f)* )(( char* )p + alignof(p->f)))
val mk_lowlevel_member_access :
MopsaLib.expr ->
int ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
MopsaLib.expr
s.f -> *(( typeof(s.f)* )(( char* )(&s) + alignof(s.f)))
Abstract transformers
=========================
val are_all_bitfields_of_same_cell_initialized :
'a option list ->
Lang.Ast.c_record_field list ->
'b Mopsa_analyzer.MopsaLib.Flow.flow ->
bool
val flatten_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
The following functions flatten the initialization expression into a list of scalar initializations
val flatten_scalar_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
val flatten_array_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
val flatten_record_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
val flatten_struct_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
val flatten_union_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
val flatten_union_field_init :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Z.t ->
Lang.Ast.c_record_field ->
Mopsa_utils.Core.Location.range ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
(MopsaLib.expr * Z.t * MopsaLib.typ) list
* (MopsaLib.expr option * Z.t * Z.t * MopsaLib.typ) list
val mk_typed_zero :
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
val declare :
Framework.Core.Ast.Var.var ->
Lang.Ast.c_var_init option ->
Lang.Ast.c_var_scope ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
('a, unit) Core.Cases.cases
𝕊⟦ type v = init; ⟧
val copy_record_field :
MopsaLib.expr ->
MopsaLib.expr ->
Lang.Ast.c_record_field ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
'a Core.Post.post
val assign_struct :
MopsaLib.expr ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Mopsa_analyzer.MopsaLib.Post.post
𝕊⟦ lval = rval; ⟧ when lval is a struct
val assign_union :
MopsaLib.expr ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('a, 'b) MopsaLib.man ->
'a Mopsa_analyzer.MopsaLib.Flow.flow ->
'a Core.Post.post
val assign_bitfield :
MopsaLib.expr ->
int ->
'a ->
MopsaLib.expr ->
Mopsa_utils.Core.Location.range ->
('b, 'c) MopsaLib.man ->
'b Mopsa_analyzer.MopsaLib.Flow.flow ->
'b Core.Post.post
val exec :
MopsaLib.stmt ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
('a, unit) Core.Cases.cases option
Abstract evaluations
========================
val array_subscript :
MopsaLib.expr ->
MopsaLib.expr ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
val member_access :
MopsaLib.expr ->
int ->
'a ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'b Mopsa_analyzer.MopsaLib.Flow.flow ->
MopsaLib.expr
𝔼⟦ s.f ⟧ -> *(( typeof(s.f)* )(( char* )(&s) + alignof(s.f)))
val arrow_access :
MopsaLib.expr ->
int ->
'a ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
'b Mopsa_analyzer.MopsaLib.Flow.flow ->
MopsaLib.expr
𝔼⟦ p->f ⟧ -> *(( typeof(p->f)* )(( char* )p + alignof(p->f)))
val address_of_array_subscript :
MopsaLib.expr ->
MopsaLib.expr ->
Framework.Core.Ast.Typ.typ ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
𝔼⟦ &(ai
) ⟧ = a + i
val address_of_arrow_access :
MopsaLib.expr ->
int ->
'a ->
MopsaLib.typ ->
Mopsa_utils.Core.Location.range ->
MopsaLib.expr
𝔼⟦ &(p->f) ⟧ = ( typeof(p->f)* )(( char* )p + alignof(p->f))
val eval :
MopsaLib.expr ->
('a, 'b) MopsaLib.man ->
'a Core.Flow.flow ->
'a Framework.Core.Eval.eval option
Pretty printer
******************