You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.5 KiB

(*
* Copyright (c) 2009 - 2013 Monoidics ltd.
* Copyright (c) 2013 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
(** The Smallfoot Intermediate Language: Predicate Symbols *)
open! IStd
module L = Logging
module F = Format
(** {2 Programs and Types} *)
type func_attribute = FA_sentinel of int * int [@@deriving compare]
val get_sentinel_func_attribute_value : func_attribute list -> (int * int) option
(** Return the value of the FA_sentinel attribute in [attr_list] if it is found *)
(** Visibility modifiers. *)
type access = Default | Public | Private | Protected [@@deriving compare]
val equal_access : access -> access -> bool
type mem_kind =
| Mmalloc (** memory allocated with malloc *)
| Mnew (** memory allocated with new *)
| Mnew_array (** memory allocated with new[] *)
| Mobjc (** memory allocated with objective-c alloc *)
[@@deriving compare]
(** resource that can be allocated *)
type resource = Rmemory of mem_kind | Rfile | Rignore | Rlock [@@deriving compare]
(** kind of resource action *)
type res_act_kind = Racquire | Rrelease [@@deriving compare]
val equal_res_act_kind : res_act_kind -> res_act_kind -> bool
(** kind of dangling pointers *)
type dangling_kind =
| DAuninit (** pointer is dangling because it is uninitialized *)
| DAaddr_stack_var
(** pointer is dangling because it is the address of a stack variable which went out of scope *)
| DAminusone (** pointer is -1 *)
(** position in a path: proc name, node id *)
type path_pos = Typ.Procname.t * int [@@deriving compare]
val equal_path_pos : path_pos -> path_pos -> bool
(** acquire/release action on a resource *)
type res_action =
{ ra_kind: res_act_kind (** kind of action *)
; ra_res: resource (** kind of resource *)
; ra_pname: Typ.Procname.t (** name of the procedure used to acquire/release the resource *)
; ra_loc: Location.t (** location of the acquire/release *)
; ra_vpath: DecompiledExp.vpath (** vpath of the resource value *) }
(** 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. *)
type t =
| Aresource of res_action (** resource acquire/release *)
| Aautorelease
| Adangling of dangling_kind (** dangling pointer *)
| Aundef of Typ.Procname.t * Annot.Item.t * 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 Typ.Procname.t * 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 *)
[@@deriving compare]
val equal : t -> t -> bool
val mem_alloc_pname : mem_kind -> Typ.Procname.t
(** name of the allocation function for the given memory kind *)
val mem_dealloc_pname : mem_kind -> Typ.Procname.t
(** name of the deallocation function for the given memory kind *)
(** Categories of attributes *)
type category =
| ACresource
| ACautorelease
| AClock
| ACdiv0
| ACobjc_null
| ACundef
| ACretval
| ACobserver
| ACwontleak
[@@deriving compare]
val equal_category : category -> category -> bool
val to_category : t -> category
(** Return the category to which the attribute belongs. *)
val is_undef : t -> bool
val is_wont_leak : t -> bool
val to_string : Pp.env -> t -> string
(** convert the attribute to a string *)
val d_attribute : t -> unit
(** Dump an attribute. *)