PulseModelsDSL.Syntaxmodule ModeledField = PulseOperations.ModeledFieldval to_aval : Pulselib.PulseBasicInterface.ValueOrigin.t -> avalval let* : 'a model_monad -> ('a -> 'b model_monad) -> 'b model_monadval (>>=) : 'a model_monad -> ('a -> 'b model_monad) -> 'b model_monadval (@=) : ('a -> 'b model_monad) -> 'a model_monad -> 'b model_monadval (@@>) : unit model_monad -> 'a model_monad -> 'a model_monadsequential composition
val compose1 :
('a -> PulseModelsImport.model) ->
('a -> PulseModelsImport.model) ->
'a ->
PulseModelsImport.modelval compose2 :
('a -> 'b -> PulseModelsImport.model) ->
('a -> 'b -> PulseModelsImport.model) ->
'a ->
'b ->
PulseModelsImport.modelval ret : 'a -> 'a model_monadval throw : unit model_monadval unreachable : 'a model_monadval report : Pulselib.PulseDomainInterface.Diagnostic.t -> unit model_monadval report_assert_error : unit model_monadval list_fold :
'a list ->
init:'accum ->
f:('accum -> 'a -> 'accum model_monad) ->
'accum model_monadval list_iter : 'a list -> f:('a -> unit model_monad) -> unit model_monadval list_filter_map :
'a list ->
f:('a -> 'b option model_monad) ->
'b list model_monadval option_iter : 'a option -> f:('a -> unit model_monad) -> unit model_monadval absvalue_set_fold :
Pulselib.PulseBasicInterface.AbstractValue.Set.t ->
init:'accum ->
f:
('accum ->
Pulselib.PulseBasicInterface.AbstractValue.t ->
'accum model_monad) ->
'accum model_monadval absvalue_set_iter :
Pulselib.PulseBasicInterface.AbstractValue.Set.t ->
f:(Pulselib.PulseBasicInterface.AbstractValue.t -> unit model_monad) ->
unit model_monadval ignore : 'a model_monad -> unit model_monadval assign_ret : aval -> unit model_monadval dynamic_dispatch :
cases:(IR.Typ.name * (unit -> 'a model_monad)) list ->
?default:(unit -> 'a model_monad) ->
aval ->
'a model_monadval dispatch_call :
(IR.Ident.t * IR.Typ.t) ->
IR.Procname.t ->
Pulselib.PulseBasicInterface.ValueOrigin.t
Absint.ProcnameDispatcher.Call.FuncArg.t
list ->
unit model_monadval python_call : IR.Procname.t -> (string * aval) list -> aval model_monadval apply_hack_closure : aval -> aval list -> aval model_monadval apply_python_closure :
aval ->
(IR.ProcAttributes.t option -> aval list model_monad) ->
aval model_monadval get_data : PulseModelsImport.model_data model_monadval add_model_call :
Pulselib.PulseBasicInterface.ValueHistory.t ->
Pulselib.PulseBasicInterface.ValueHistory.t model_monadval disj : 'a model_monad list -> 'a model_monadval start_model : (unit -> unit model_monad) -> PulseModelsImport.modelget a model from a disjunctive model_monad
val start_named_model :
string ->
(unit -> unit model_monad) ->
PulseModelsImport.modelval lift_to_monad : PulseModelsImport.model -> unit model_monadbeware that the model may modify the model_data.ret field
val lift_to_monad_and_get_result : PulseModelsImport.model -> aval model_monadapply the model and return its result. fails if the model did not assign the reserved model_data.ret variable.
PulseOperations functions you need should be copied here
val allocation :
Pulselib.PulseBasicInterface.Attribute.allocator ->
aval ->
unit model_monadval is_allocated : aval -> bool model_monadval data_dependency :
Pulselib.PulseBasicInterface.ValueOrigin.t ->
Pulselib.PulseBasicInterface.ValueOrigin.t list ->
unit model_monadval data_dependency_to_ret :
Pulselib.PulseBasicInterface.ValueOrigin.t list ->
unit model_monadval add_dict_read_const_key : aval -> IR.Fieldname.t -> unit model_monadval is_dict_contain_const_keys : aval -> bool model_monadval remove_dict_contain_const_keys : aval -> unit model_monadval is_hack_constinit_called : aval -> bool model_monadval set_hack_constinit_called : aval -> unit model_monadval add_static_type : IR.Typ.name -> aval -> unit model_monadval get_static_type : aval -> IR.Typ.name option model_monadval deep_copy : ?depth_max:int -> aval -> aval model_monadval check_valid :
?must_be_valid_reason:
Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason ->
Pulselib.PulseBasicInterface.ValueOrigin.t ->
unit model_monadval binop : IR.Binop.t -> aval -> aval -> aval model_monadval binop_int : IR.Binop.t -> aval -> IR.IntLit.t -> aval model_monadval unop : IR.Unop.t -> aval -> aval model_monadval read : IR.Exp.t -> aval model_monadval remove_allocation_attr_transitively : aval list -> unit model_monadval int :
?hist:Pulselib.PulseBasicInterface.ValueHistory.t ->
int ->
aval model_monadval string : string -> aval model_monadval string_concat : aval -> aval -> aval model_monadval access :
PulseOperationResult.Import.access_mode ->
aval ->
Pulselib.PulseBasicInterface.Access.t ->
aval model_monadval load_access :
?no_access:bool ->
?deref:bool ->
aval ->
Pulselib.PulseBasicInterface.Access.t ->
aval model_monadval load : aval -> aval model_monadread the Dereference access from the value
val and_dynamic_type_is : aval -> IR.Typ.t -> unit model_monadval get_dynamic_type :
ask_specialization:bool ->
aval ->
Pulselib.PulseBasicInterface.Formula.dynamic_type_data option model_monadval new_ : IR.Exp.t -> aval model_monadval constructor :
?deref:bool ->
?field_of_string:(string -> IR.Fieldname.t) ->
IR.Typ.Name.t ->
(string * aval) list ->
aval model_monadconstructor_dsl typ_name fields builds a fresh object of type typ_name and initializes its fields using list fields
val construct_dict :
?deref:bool ->
?field_of_string:(string -> IR.Fieldname.t) ->
IR.Typ.name ->
(string
* (Pulselib.PulseBasicInterface.AbstractValue.t
* Pulselib.PulseBasicInterface.ValueHistory.t))
list ->
const_strings_only:bool ->
aval model_monadval remove_hack_builder_attributes : aval -> unit model_monadval fresh : ?more:string -> unit -> aval model_monadval fresh_nonneg : ?more:string -> unit -> aval model_monadval write_field : ref:aval -> IR.Fieldname.t -> aval -> unit model_monadval store_field :
?deref:bool ->
ref:aval ->
IR.Fieldname.t ->
aval ->
unit model_monadval store : ref:aval -> aval -> unit model_monadval get_known_fields :
aval ->
Pulselib.PulseBasicInterface.Access.t list model_monadReturn the fields we know about. There may be more, so use with caution
val is_known_field : aval -> IR.Fieldname.t -> bool model_monadReturn true if the given field appears for sure. Otherwise (missing or if we don't know), return false
val prune_eq : aval -> aval -> unit model_monadval prune_eq_int : aval -> IR.IntLit.t -> unit model_monadval prune_eq_string : aval -> string -> unit model_monadval prune_ne_string : aval -> string -> unit model_monadval prune_eq_zero : aval -> unit model_monadval prune_positive : aval -> unit model_monadval prune_lt : aval -> aval -> unit model_monadval prune_lt_int : aval -> IR.IntLit.t -> unit model_monadval prune_le : aval -> aval -> unit model_monadval prune_gt : aval -> aval -> unit model_monadval prune_gt_int : aval -> IR.IntLit.t -> unit model_monadval prune_ge : aval -> aval -> unit model_monadval prune_ge_int : aval -> IR.IntLit.t -> unit model_monadval prune_ne : aval -> aval -> unit model_monadval prune_ne_int : aval -> IR.IntLit.t -> unit model_monadval prune_ne_zero : aval -> unit model_monadval and_eq_int : aval -> IR.IntLit.t -> unit model_monadval and_eq : aval -> aval -> unit model_monadval and_equal_instanceof :
aval ->
aval ->
IR.Typ.t ->
nullable:bool ->
unit model_monadval and_positive : aval -> unit model_monadval as_constant_q : aval -> Q.t option model_monadval as_constant_int : aval -> int option model_monadval as_constant_bool : aval -> bool option model_monadval as_constant_string : aval -> string option model_monadval null : aval model_monadval tenv_get_supers : IR.Typ.name -> IR.Typ.name list model_monadval tenv_resolve_field_info :
IR.Typ.name ->
IR.Fieldname.t ->
IR.Struct.field_info option model_monadval tenv_resolve_fieldname :
IR.Typ.name ->
string ->
(IR.Fieldname.t option * IR.Tenv.unresolved_reason option) model_monadval tenv_type_is_defined : IR.Typ.name -> bool model_monadInvalidation operations
val invalidate_access :
Pulselib.PulseBasicInterface.Invalidation.t ->
aval ->
Pulselib.PulseBasicInterface.Access.t ->
unit model_monadif necessary you can convert an operation outside of this module with the following operators
val exec_command : (astate -> astate) -> unit model_monadval exec_partial_command :
(astate -> astate PulseOperationResult.t) ->
unit model_monadval exec_operation : (astate -> 'a * astate) -> 'a model_monadval exec_partial_operation :
(astate -> (astate * 'a) PulseOperationResult.t) ->
'a model_monadval exec_pure_operation : (astate -> 'a) -> 'a model_monadval register_class_object_for_value : aval -> aval -> unit model_monadThis is used to make hack_get_static_class behave like a pure function
module Basic : sig ... end