The Smallfoot Intermediate Language: Predicate Symbols
include sig ... endval compare_func_attribute : func_attribute ‑> func_attribute ‑> intval pp_func_attribute : F.formatter ‑> func_attribute ‑> unitval get_sentinel_func_attribute_value : func_attribute list ‑> (int * int) optionReturn the value of the FA_sentinel attribute in attr_list if it is found
val string_of_access : access ‑> stringinclude sig ... endval compare_res_act_kind : res_act_kind ‑> res_act_kind ‑> intval equal_res_act_kind : res_act_kind ‑> res_act_kind ‑> booltype dangling_kind = kind of dangling pointers
type res_action = {ra_kind : res_act_kind; | (** kind of action *) |
ra_res : resource; | (** kind of resource *) |
ra_pname : InferIR.Typ.Procname.t; | (** name of the procedure used to acquire/release the resource *) |
ra_loc : InferBase.Location.t; | (** location of the acquire/release *) |
ra_vpath : InferIR.DecompiledExp.vpath; | (** vpath of the resource value *) |
}acquire/release action on a resource
type t = | Aresource of res_action | (** resource acquire/release *) |
| Aautorelease | |
| Adangling of dangling_kind | (** dangling pointer *) |
| Aundef of InferIR.Typ.Procname.t * InferIR.Annot.Item.t * InferBase.Location.t * path_pos | |
| Alocked | |
| Aunlocked | |
| Adiv0 of path_pos | (** value appeared in second argument of division at given path position *) |
| Aobjc_null | (** attributed exp is null due to a call to a method with given path as null receiver *) |
| Aretval of InferIR.Typ.Procname.t * InferIR.Annot.Item.t | (** value was returned from a call to the given procedure, plus the annots of the return value *) |
| Aobserver | (** denotes an object registered as an observers to a notification center *) |
| Aunsubscribed_observer | (** denotes an object unsubscribed from observers of a notification center *) |
| Awont_leak | (** value do not participate in memory leak analysis *) |
Attributes are nary function symbols that are applied to expression arguments in Apred and Anpred atomic formulas. Many operations don't make much sense for nullary predicates, and are generally treated as no-ops. The first argument is treated specially, as the "anchor" of the predicate application. For example, adding or removing an attribute uses the anchor to identify the atom to operate on. Also, abstraction and normalization operations treat the anchor specially and maintain more information on it than other arguments. Therefore when attaching an attribute to an expression, that expression should be the first argument, optionally followed by additional related expressions.
val mem_alloc_pname : mem_kind ‑> InferIR.Typ.Procname.tname of the allocation function for the given memory kind
val mem_dealloc_pname : mem_kind ‑> InferIR.Typ.Procname.tname of the deallocation function for the given memory kind
type category = | ACresource |
| ACautorelease |
| AClock |
| ACdiv0 |
| ACobjc_null |
| ACundef |
| ACretval |
| ACobserver |
| ACwontleak |
Categories of attributes
val is_undef : t ‑> bool