Parameter PairNoJoin.1-Domain1
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
From eace6140f5825f496bf8773248d2a7d7e34ae654 Mon Sep 17 00:00:00 2001
From: Daiva Naudziuniene
--eradicate
@@ -597,8 +597,8 @@ disable all other checkers (Conversely: on program paths that contain calls to unknown methods (those without implementation) are not reported unless all the unknown method names match this pattern. If the empty -list is provided or ---pulse_report_ignore_unknown_java_methods_patterns-reset, +list is provided with +--pulse-report-ignore-unknown-java-methods-patterns-reset, all issues will be reported regardless the presence of unknown code @@ -763,11 +763,11 @@ temporal properties over multiple objects. (Conversely: disable all other checkers (Conversely: --no-topl-only) ---no-uninit
+--uninit
-Deactivates: checker uninit: +
Activates: checker uninit: Warns when values are used before having been initialized. -(Conversely: --uninit)
+(Conversely: --no-uninit)--uninit-only
diff --git a/website/static/man/next/infer-report.1.html b/website/static/man/next/infer-report.1.html index 7885b47fa..a2f718863 100644 --- a/website/static/man/next/infer-report.1.html +++ b/website/static/man/next/infer-report.1.html @@ -350,7 +350,7 @@ PRECONDITION_NOT_FOUND (enabled by default),See also
infer-analyze(1).
@@ -906,7 +906,7 @@ PRECONDITION_NOT_FOUND (enabled by default),
PRECONDITION_NOT_MET (enabled by default),
PREMATURE_NIL_TERMINATION_ARGUMENT (enabled by default),
-PULSE_UNINITIALIZED_VALUE (disabled by default),
+PULSE_UNINITIALIZED_VALUE (enabled by default),
PURE_FUNCTION (enabled by default),
QUANDARY_TAINT_ERROR (enabled by default),
RESOURCE_LEAK (enabled by default),
@@ -1786,8 +1786,8 @@ disable all other checkers (Conversely:
on program paths that contain calls to unknown methods
(those without implementation) are not reported unless all
the unknown method names match this pattern. If the empty
-list is provided or
---pulse_report_ignore_unknown_java_methods_patterns-reset,
+list is provided with
+--pulse-report-ignore-unknown-java-methods-patterns-reset,
all issues will be reported regardless the presence of
unknown code
See also
infer-analyze(1).
---no-uninit
Deactivates: checker uninit: +
Activates: checker uninit: Warns when values are used before having been initialized. -(Conversely: --uninit)
+(Conversely: --no-uninit)See also
infer-analyze(1). A domain with an explicit bottom value A domain with an explicit top value Create a domain with Bottom element from a pre-domain Create a domain with Top element from a pre-domain Cartesian product of two domains. Flat abstract domain: Bottom, Top, and non-comparable elements in between Stacked abstract domain: tagged union of Abstracts a set of Lift a PPSet to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by superset, so the join operator is intersection Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else. Uses PPMap as the underlying map Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else Map domain ordered by intersection over the set of bindings, so the top element is the empty map. Every element implictly maps to top unless it is explicitly bound to something else Similar to Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches. Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch. Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented. Domain keeping a non-negative count with a bounded maximum value. A domain with an explicit bottom value A domain with an explicit top value Create a domain with Bottom element from a pre-domain Create a domain with Top element from a pre-domain Cartesian product of two domains. Flat abstract domain: Bottom, Top, and non-comparable elements in between Stacked abstract domain: tagged union of Abstracts a set of Lift a PPSet to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by superset, so the join operator is intersection Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else. Uses PPMap as the underlying map Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else Map domain ordered by intersection over the set of bindings, so the top element is the empty map. Every element implictly maps to top unless it is explicitly bound to something else Similar to Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches. Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch. Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented. Domain keeping a non-negative count with a bounded maximum value. for the Restart scheduler: raise when a worker tries to analyze a procedure already being analyzed by another process matches primary key of matches primary key of A domain with an explicit bottom value A domain with an explicit top value Create a domain with Bottom element from a pre-domain Create a domain with Top element from a pre-domain Cartesian product of two domains. Flat abstract domain: Bottom, Top, and non-comparable elements in between Stacked abstract domain: tagged union of Abstracts a set of Lift a PPSet to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by superset, so the join operator is intersection Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else. Uses PPMap as the underlying map Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else Map domain ordered by intersection over the set of bindings, so the top element is the empty map. Every element implictly maps to top unless it is explicitly bound to something else Similar to Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches. Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch. Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented. Domain keeping a non-negative count with a bounded maximum value. A domain with an explicit bottom value A domain with an explicit top value Create a domain with Bottom element from a pre-domain Create a domain with Top element from a pre-domain Cartesian product of two domains. Flat abstract domain: Bottom, Top, and non-comparable elements in between Stacked abstract domain: tagged union of Abstracts a set of Lift a PPSet to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union. Lift a set to a powerset domain ordered by superset, so the join operator is intersection Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else. Uses PPMap as the underlying map Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else Map domain ordered by intersection over the set of bindings, so the top element is the empty map. Every element implictly maps to top unless it is explicitly bound to something else Similar to Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches. Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch. Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented. Domain keeping a non-negative count with a bounded maximum value. for the Restart scheduler: raise when a worker tries to analyze a procedure already being analyzed by another process matches primary key of matches primary key of return Some (access) if this procedure accesses the contents of a container (e.g., Map.get) return true if the given procname boxes a primitive type into a reference type Methods in return true if we should compute a summary for the procedure. if this returns false, we won't analyze the procedure or report any warnings on it. note: in the future, we will want to analyze the procedures in all of these cases in order to find more bugs. this is just a temporary measure to avoid obvious false positives returns true if method or overriden method in superclass is check if an access to a field is thread-confined, or whether the field is volatile should an interface call be flagged as potentially non-thread safe? is a call on an access expression to a method of a synchronized container? should the given procedure be treated as a constructor/initializer? is the given return Some (access) if this procedure accesses the contents of a container (e.g., Map.get) return true if the given procname boxes a primitive type into a reference type Methods in return true if we should compute a summary for the procedure. if this returns false, we won't analyze the procedure or report any warnings on it. note: in the future, we will want to analyze the procedures in all of these cases in order to find more bugs. this is just a temporary measure to avoid obvious false positives returns true if method or overriden method in superclass is check if an access to a field is thread-confined, or whether the field is volatile should an interface call be flagged as potentially non-thread safe? is a call on an access expression to a method of a synchronized container? should the given procedure be treated as a constructor/initializer? is the given Get report explanation specific to Litho class methods, if applicable return Some (access) if this procedure accesses the contents of a container (e.g., Map.get) return true if the given procname boxes a primitive type into a reference type Methods in return true if we should compute a summary for the procedure. if this returns false, we won't analyze the procedure or report any warnings on it. note: in the future, we will want to analyze the procedures in all of these cases in order to find more bugs. this is just a temporary measure to avoid obvious false positives returns true if method or overriden method in superclass is check if an access to a field is thread-confined, or whether the field is volatile should an interface call be flagged as potentially non-thread safe? is a call on an access expression to a method of a synchronized container? should the given procedure be treated as a constructor/initializer? is the given return Some (access) if this procedure accesses the contents of a container (e.g., Map.get) return true if the given procname boxes a primitive type into a reference type Methods in return true if we should compute a summary for the procedure. if this returns false, we won't analyze the procedure or report any warnings on it. note: in the future, we will want to analyze the procedures in all of these cases in order to find more bugs. this is just a temporary measure to avoid obvious false positives returns true if method or overriden method in superclass is check if an access to a field is thread-confined, or whether the field is volatile should an interface call be flagged as potentially non-thread safe? is a call on an access expression to a method of a synchronized container? should the given procedure be treated as a constructor/initializer? is the given Get report explanation specific to Litho class methods, if applicable Erlang abstract forms, following https://erlang.org/doc/apps/erts/absform.html Erlang abstract forms, following https://erlang.org/doc/apps/erts/absform.html marker to recognize methods generated by javalib to eliminate lambdas In some integrations, eg Buck, infer subprocesses started by the build system (started by the toplevel infer process) will have their own results directory; this points to the results directory of the toplevel infer process, which can be useful for, eg, storing debug info. In other cases this is equal to Does named symbol match any prefix in the named custom symbol list? a random number to (hopefully) uniquely identify this run Windows Subsystem for Linux marker to recognize methods generated by javalib to eliminate lambdas In some integrations, eg Buck, infer subprocesses started by the build system (started by the toplevel infer process) will have their own results directory; this points to the results directory of the toplevel infer process, which can be useful for, eg, storing debug info. In other cases this is equal to Does named symbol match any prefix in the named custom symbol list? a random number to (hopefully) uniquely identify this run Maps from source_file Set of source files Is the source file the invalid source file? Set of files read from --changed-files-index file, None if option not specified NOTE: it may include extra source_files if --changed-files-index contains paths to header files Invalid source file create source file from absolute path. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Create a SourceFile from a given path. If relative, it assumes it is w.r.t. project root. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Returns true if the file is under the project root or the workspace directory if it exists Return approximate source file corresponding to the parameter if it's header file and file exists. returns None otherwise. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given SourceFile (e.g. if it does not exist). pretty print t get the full path of a source file get the relative path of a source file convert a source file to a string WARNING: result may not be valid file path, do not use this function to perform operations on filenames returns whether the source file has provided extension Maps from source_file Set of source files Is the source file the invalid source file? return the list of changed files as read from Config.changed_files_index. NOTE: it may include extra source_files if --changed-files-index contains paths to header files. Invalid source file create source file from absolute path. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Create a SourceFile from a given path. If relative, it assumes it is w.r.t. project root. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Returns true if the file is under the project root or the workspace directory if it exists Return approximate source file corresponding to the parameter if it's header file and file exists. returns None otherwise. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given SourceFile (e.g. if it does not exist). pretty print t get the full path of a source file get the relative path of a source file convert a source file to a string WARNING: result may not be valid file path, do not use this function to perform operations on filenames returns whether the source file has provided extension marker to recognize methods generated by javalib to eliminate lambdas In some integrations, eg Buck, infer subprocesses started by the build system (started by the toplevel infer process) will have their own results directory; this points to the results directory of the toplevel infer process, which can be useful for, eg, storing debug info. In other cases this is equal to Does named symbol match any prefix in the named custom symbol list? a random number to (hopefully) uniquely identify this run Windows Subsystem for Linux marker to recognize methods generated by javalib to eliminate lambdas In some integrations, eg Buck, infer subprocesses started by the build system (started by the toplevel infer process) will have their own results directory; this points to the results directory of the toplevel infer process, which can be useful for, eg, storing debug info. In other cases this is equal to Does named symbol match any prefix in the named custom symbol list? a random number to (hopefully) uniquely identify this run Maps from source_file Set of source files Is the source file the invalid source file? Set of files read from --changed-files-index file, None if option not specified NOTE: it may include extra source_files if --changed-files-index contains paths to header files Invalid source file create source file from absolute path. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Create a SourceFile from a given path. If relative, it assumes it is w.r.t. project root. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Returns true if the file is under the project root or the workspace directory if it exists Return approximate source file corresponding to the parameter if it's header file and file exists. returns None otherwise. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given SourceFile (e.g. if it does not exist). pretty print t get the full path of a source file get the relative path of a source file convert a source file to a string WARNING: result may not be valid file path, do not use this function to perform operations on filenames returns whether the source file has provided extension Maps from source_file Set of source files Is the source file the invalid source file? return the list of changed files as read from Config.changed_files_index. NOTE: it may include extra source_files if --changed-files-index contains paths to header files. Invalid source file create source file from absolute path. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Create a SourceFile from a given path. If relative, it assumes it is w.r.t. project root. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given path (e.g. if it does not exist). Returns true if the file is under the project root or the workspace directory if it exists Return approximate source file corresponding to the parameter if it's header file and file exists. returns None otherwise. WARNING: If warn_on_error is false, no warning will be shown whenever an error occurs for the given SourceFile (e.g. if it does not exist). pretty print t get the full path of a source file get the relative path of a source file convert a source file to a string WARNING: result may not be valid file path, do not use this function to perform operations on filenames returns whether the source file has provided extension used to represent behavior that is not modeled in infer used to represent behavior that is not modeled in infer all patterns in a function failed to match node of the control flow graph Map with node id keys. Hash table with nodes as keys. Map over nodes. Set of nodes. append a list of new local variables to the existing list of local variables Compute the distance of each node to the exit node, if not computed already Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc. fold over all nodes and their instructions Use Return the visibility attribute Get the attributes of the procedure. Return name and type of block's captured variables Return name and type of formal parameters Return loc information for the procedure Return name and type and attributes of local variables Return the return type of the procedure and type string get a list of unique static callees excluding self Return Return Return Return iterate over all nodes and their instructions Map and replace the instructions to be executed. Returns true if at least one substitution occured. Map and replace the instructions to be executed using a context that we built with previous instructions in the node. Returns true if at least one substitution occured. Like fold over all the nodes of a procedure fold between two nodes or until we reach a branching structure Set the successor nodes and exception nodes, if given, and update predecessor links Set the successor nodes and exception nodes, and update predecessor links true if pvar is a captured variable of a cpp lambda or obcj block true if var is a captured variable of a cpp lambda or obcj block per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG node of the control flow graph Map with node id keys. Hash table with nodes as keys. Map over nodes. Set of nodes. append a list of new local variables to the existing list of local variables Compute the distance of each node to the exit node, if not computed already Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc. fold over all nodes and their instructions Use Return the visibility attribute Get the attributes of the procedure. Return name and type of block's captured variables Return name and type of formal parameters Return loc information for the procedure Return name and type and attributes of local variables Return the return type of the procedure and type string Return the return type from method signature: if the procedure has added return parameter, return its type get a list of unique static callees excluding self Return Return Return Return iterate over all nodes and their instructions Map and replace the instructions to be executed. Returns true if at least one substitution occured. Map and replace the instructions to be executed using a context that we built with previous instructions in the node. Returns true if at least one substitution occured. Like fold over all the nodes of a procedure fold between two nodes or until we reach a branching structure Set the successor nodes and exception nodes, if given, and update predecessor links Set the successor nodes and exception nodes, and update predecessor links true if pvar is a captured variable of a cpp lambda or obcj block true if var is a captured variable of a cpp lambda or obcj block per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG Type of csharp procedure names. Type of java procedure names. Type of procedure names. WithBlockParameters is used for creating an instantiation of a method that contains block parameters and it's called with concrete blocks. For example: Similar to compare, but compares only names, except parameter types and template arguments. Hash tables with proc names as keys. Maps from proc names. Sets of proc names. One-sized cache for one procedure at a time. Returns getter and setter. Create a Java procedure name. Create a CSharp procedure name. Create a Objective-C dealloc name. This is a destructor for an Objective-C class. This procname is given by the class name, since it is always an instance method with the name "dealloc" Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable. Empty block name. Return the language of the procedure. Return the method/function of a procname. Return whether the procname is a block procname. Return whether the procname is a cpp lambda procname. Return whether the dealloc method of an Objective-C class. Return whether the init method of an Objective-C class. Return true this is an Objective-C/C++ method name. Check if this is a constructor. Check if this is a CSharp procedure name. Check if this is a Java procedure name. Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures. Check if this is a special Infer undefined procedure. Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise. Pretty print a proc name for the user to see. Convert a proc name into a string for the user to see. to use in user messages Replace the class name component of a procedure name. In case of Java, replace package and class name. Pretty print a proc name as an easy string for the user to see in an IDE. Convert a proc name into an easy string for the user to see in an IDE. Convert a string to a c function name. Replace "$[0-9]+" index into "$_" in Java proc name. Convert the procedure name in a format suitable for computing the bug hash. Convert a proc name into a unique identifier. Convert a proc name to a filename. get qualifiers of C/objc/C++ method/function Type of csharp procedure names. Type of java procedure names. Type of procedure names. WithBlockParameters is used for creating an instantiation of a method that contains block parameters and it's called with concrete blocks. For example: Similar to compare, but compares only names, except parameter types and template arguments. Hash tables with proc names as keys. Maps from proc names. Sets of proc names. One-sized cache for one procedure at a time. Returns getter and setter. Create a Java procedure name. Create a CSharp procedure name. Create an Erlang procedure name. Create a Objective-C dealloc name. This is a destructor for an Objective-C class. This procname is given by the class name, since it is always an instance method with the name "dealloc" Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable. Empty block name. Return the language of the procedure. Return the method/function of a procname. Return whether the procname is a block procname. Return whether the procname is a cpp lambda procname. Return whether the dealloc method of an Objective-C class. Return whether the init method of an Objective-C class. Return true this is an Objective-C/C++ method name. Check if this is a constructor. Check if this is a CSharp procedure name. Check if this is a Java procedure name. Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures. Check if this is a special Infer undefined procedure. Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise. Pretty print a proc name for the user to see. Convert a proc name into a string for the user to see. to use in user messages Replace the class name component of a procedure name. In case of Java, replace package and class name. Pretty print a proc name as an easy string for the user to see in an IDE. Convert a proc name into an easy string for the user to see in an IDE. Convert a string to a c function name. Replace "$[0-9]+" index into "$_" in Java proc name. Convert the procedure name in a format suitable for computing the bug hash. Convert a proc name into a unique identifier. Convert a proc name to a filename. get qualifiers of C/objc/C++ method/function Kinds of integers Check whether the integer kind is a char Check whether the integer kind is unsigned kind of pointer types for sil (structured) expressions integer type float type void type function type pointer type structured value type name type variable (ie. C++ template variables) array type with statically fixed length and stride qualified name does NOT contain template arguments of the class. It will contain template args of its parent classes, for example: MyClass<int>::InnerClass<int> will store "MyClass<int>", "InnerClass" ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying> WARNING: because of type substitutions performed by Create Typ.t from given desc. if Create an array type from a given element type. If make a pointer to ikind of size_t Equality for types, but ignoring quals in it. Pretty print a type with all the details. Pretty print a type. Pretty print a type desc. Pretty print a Java type. Raises if type isn't produced by the Java frontend Pretty print a Java type. Raises if type isn't produced by the CSharp frontend Dump a type with all the details. Dump a list of types. If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception is is is Kinds of integers Check whether the integer kind is a char Check whether the integer kind is unsigned kind of pointer types for sil (structured) expressions integer type float type void type function type pointer type structured value type name type variable (ie. C++ template variables) array type with statically fixed length and stride qualified name does NOT contain template arguments of the class. It will contain template args of its parent classes, for example: MyClass<int>::InnerClass<int> will store "MyClass<int>", "InnerClass" ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying> WARNING: because of type substitutions performed by Create Typ.t from given desc. if Create an array type from a given element type. If make a pointer to ikind of size_t Equality for types, but ignoring quals in it. Pretty print a type with all the details. Pretty print a type. Pretty print a type desc. Pretty print a Java type. Raises if type isn't produced by the Java frontend Pretty print a Java type. Raises if type isn't produced by the CSharp frontend Dump a type with all the details. Dump a list of types. If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception is is is used to represent behavior that is not modeled in infer used to represent behavior that is not modeled in infer all patterns in a function failed to match node of the control flow graph Map with node id keys. Hash table with nodes as keys. Map over nodes. Set of nodes. append a list of new local variables to the existing list of local variables Compute the distance of each node to the exit node, if not computed already Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc. fold over all nodes and their instructions Use Return the visibility attribute Get the attributes of the procedure. Return name and type of block's captured variables Return name and type of formal parameters Return loc information for the procedure Return name and type and attributes of local variables Return the return type of the procedure and type string get a list of unique static callees excluding self Return Return Return Return iterate over all nodes and their instructions Map and replace the instructions to be executed. Returns true if at least one substitution occured. Map and replace the instructions to be executed using a context that we built with previous instructions in the node. Returns true if at least one substitution occured. Like fold over all the nodes of a procedure fold between two nodes or until we reach a branching structure Set the successor nodes and exception nodes, if given, and update predecessor links Set the successor nodes and exception nodes, and update predecessor links true if pvar is a captured variable of a cpp lambda or obcj block true if var is a captured variable of a cpp lambda or obcj block per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG node of the control flow graph Map with node id keys. Hash table with nodes as keys. Map over nodes. Set of nodes. append a list of new local variables to the existing list of local variables Compute the distance of each node to the exit node, if not computed already Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc. fold over all nodes and their instructions Use Return the visibility attribute Get the attributes of the procedure. Return name and type of block's captured variables Return name and type of formal parameters Return loc information for the procedure Return name and type and attributes of local variables Return the return type of the procedure and type string Return the return type from method signature: if the procedure has added return parameter, return its type get a list of unique static callees excluding self Return Return Return Return iterate over all nodes and their instructions Map and replace the instructions to be executed. Returns true if at least one substitution occured. Map and replace the instructions to be executed using a context that we built with previous instructions in the node. Returns true if at least one substitution occured. Like fold over all the nodes of a procedure fold between two nodes or until we reach a branching structure Set the successor nodes and exception nodes, if given, and update predecessor links Set the successor nodes and exception nodes, and update predecessor links true if pvar is a captured variable of a cpp lambda or obcj block true if var is a captured variable of a cpp lambda or obcj block per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG Type of csharp procedure names. Type of java procedure names. Type of procedure names. WithBlockParameters is used for creating an instantiation of a method that contains block parameters and it's called with concrete blocks. For example: Similar to compare, but compares only names, except parameter types and template arguments. Hash tables with proc names as keys. Maps from proc names. Sets of proc names. One-sized cache for one procedure at a time. Returns getter and setter. Create a Java procedure name. Create a CSharp procedure name. Create a Objective-C dealloc name. This is a destructor for an Objective-C class. This procname is given by the class name, since it is always an instance method with the name "dealloc" Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable. Empty block name. Return the language of the procedure. Return the method/function of a procname. Return whether the procname is a block procname. Return whether the procname is a cpp lambda procname. Return whether the dealloc method of an Objective-C class. Return whether the init method of an Objective-C class. Return true this is an Objective-C/C++ method name. Check if this is a constructor. Check if this is a CSharp procedure name. Check if this is a Java procedure name. Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures. Check if this is a special Infer undefined procedure. Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise. Pretty print a proc name for the user to see. Convert a proc name into a string for the user to see. to use in user messages Replace the class name component of a procedure name. In case of Java, replace package and class name. Pretty print a proc name as an easy string for the user to see in an IDE. Convert a proc name into an easy string for the user to see in an IDE. Convert a string to a c function name. Replace "$[0-9]+" index into "$_" in Java proc name. Convert the procedure name in a format suitable for computing the bug hash. Convert a proc name into a unique identifier. Convert a proc name to a filename. get qualifiers of C/objc/C++ method/function Type of csharp procedure names. Type of java procedure names. Type of procedure names. WithBlockParameters is used for creating an instantiation of a method that contains block parameters and it's called with concrete blocks. For example: Similar to compare, but compares only names, except parameter types and template arguments. Hash tables with proc names as keys. Maps from proc names. Sets of proc names. One-sized cache for one procedure at a time. Returns getter and setter. Create a Java procedure name. Create a CSharp procedure name. Create an Erlang procedure name. Create a Objective-C dealloc name. This is a destructor for an Objective-C class. This procname is given by the class name, since it is always an instance method with the name "dealloc" Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable. Empty block name. Return the language of the procedure. Return the method/function of a procname. Return whether the procname is a block procname. Return whether the procname is a cpp lambda procname. Return whether the dealloc method of an Objective-C class. Return whether the init method of an Objective-C class. Return true this is an Objective-C/C++ method name. Check if this is a constructor. Check if this is a CSharp procedure name. Check if this is a Java procedure name. Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures. Check if this is a special Infer undefined procedure. Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise. Pretty print a proc name for the user to see. Convert a proc name into a string for the user to see. to use in user messages Replace the class name component of a procedure name. In case of Java, replace package and class name. Pretty print a proc name as an easy string for the user to see in an IDE. Convert a proc name into an easy string for the user to see in an IDE. Convert a string to a c function name. Replace "$[0-9]+" index into "$_" in Java proc name. Convert the procedure name in a format suitable for computing the bug hash. Convert a proc name into a unique identifier. Convert a proc name to a filename. get qualifiers of C/objc/C++ method/function The Smallfoot Intermediate Language: Types Kinds of integers Check whether the integer kind is a char Check whether the integer kind is unsigned kind of pointer types for sil (structured) expressions integer type float type void type function type pointer type structured value type name type variable (ie. C++ template variables) array type with statically fixed length and stride qualified name does NOT contain template arguments of the class. It will contain template args of its parent classes, for example: MyClass<int>::InnerClass<int> will store "MyClass<int>", "InnerClass" ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying> WARNING: because of type substitutions performed by Create Typ.t from given desc. if Create an array type from a given element type. If make a pointer to ikind of size_t Equality for types, but ignoring quals in it. Pretty print a type with all the details. Pretty print a type. Pretty print a type desc. Pretty print a Java type. Raises if type isn't produced by the Java frontend Pretty print a Java type. Raises if type isn't produced by the CSharp frontend Dump a type with all the details. Dump a list of types. If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception is is is The Smallfoot Intermediate Language: Types Kinds of integers Check whether the integer kind is a char Check whether the integer kind is unsigned kind of pointer types for sil (structured) expressions integer type float type void type function type pointer type structured value type name type variable (ie. C++ template variables) array type with statically fixed length and stride qualified name does NOT contain template arguments of the class. It will contain template args of its parent classes, for example: MyClass<int>::InnerClass<int> will store "MyClass<int>", "InnerClass" ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying> WARNING: because of type substitutions performed by Create Typ.t from given desc. if Create an array type from a given element type. If make a pointer to ikind of size_t Equality for types, but ignoring quals in it. Pretty print a type with all the details. Pretty print a type. Pretty print a type desc. Pretty print a Java type. Raises if type isn't produced by the Java frontend Pretty print a Java type. Raises if type isn't produced by the CSharp frontend Dump a type with all the details. Dump a list of types. If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception is is is based on the build_system and options passed to infer, we run in different driver modes driver mode computed from the command-line arguments and settings in Config prepare the environment for running the given mode run the capture for the given mode run the analysis for the given mode cleanup infer-out/ for Buck, generate stats, and generally post-process the results of a run return the list of changed files as read from Config.changed_files_index and passed to SourceFile.changed_sources_from_changed_files based on the build_system and options passed to infer, we run in different driver modes driver mode computed from the command-line arguments and settings in Config prepare the environment for running the given mode run the capture for the given mode run the analysis for the given mode based on the build_system and options passed to infer, we run in different driver modes driver mode computed from the command-line arguments and settings in Config prepare the environment for running the given mode run the capture for the given mode run the analysis for the given mode cleanup infer-out/ for Buck, generate stats, and generally post-process the results of a run return the list of changed files as read from Config.changed_files_index and passed to SourceFile.changed_sources_from_changed_files based on the build_system and options passed to infer, we run in different driver modes driver mode computed from the command-line arguments and settings in Config prepare the environment for running the given mode run the capture for the given mode run the analysis for the given mode attribute operations like add the attributes to both the current state and, if meaningful, the pre add the attribute only to the post attribute operations like add the attributes to both the current state and, if meaningful, the pre add the attribute only to the post stack operations like return the value of the variable in the stack or create a fresh one if needed stack operations like return the value of the variable in the stack or create a fresh one if needed helper function wrapping helper function wrapping helper function wrapping helper function wrapping in case an element with the same rank is present both in check whether for each attr in the second list, there exists a corresponding attr in the first according to While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable in case an element with the same rank is present both in check whether for each attr in the second list, there exists a corresponding attr in the first according to While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable the The allocation is abduced so as the analysis could run normally temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks the The allocation is abduced so as the analysis could run normally temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks merge the attributes of all the variables that are equal according to merge the attributes of all the variables that are equal according to perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable. only used for unit tests some operations will return a set of new facts discovered that are relevant to communicate to the memory domain think a bit harder about the formula get the canonical representative for the variable according to the known/post equality relation Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable. only used for unit tests some operations will return a set of new facts discovered that are relevant to communicate to the memory domain think a bit harder about the formula get the canonical representative for the variable according to the known/post equality relation result of applying one pre/post pair of a callee's summary: result of applying one pre/post pair of a callee's summary: assert the validity of the addresses captured by the lambda assert the validity of the addresses captured by the lambda For monadic "bind" but not really that turns an monadic "map" but even less really that turns an Check that the Use the stack and heap to evaluate the given expression down to an abstract address representing its value. Return an error state if it traverses some known invalid address or if the end destination is known to be invalid. Similar to eval but apply to data structures and ISL abduction. Return a list of abduced states (ISLOk and ISLErs); The boolean indicates whether it is data structures or not. Like Like Like Havoc dereferenced field address. write the edge write the edge write the edge write the edge the value was read from the heap following the the value was read from the stack we don't know where the value came from; avoid using if possible the way that was used to get to the invalidated address in the state; this is used to record the invalidation point in its history in addition to inside the record that the address is invalid record that the address is invalid. If the address has not been allocated, abduce ISL specs for both invalid (null, free, unint) and allocated heap. record that what the address points via the access to is invalid Like record that all the array elements that address points to is invalid returns the address of a new cell with the same edges as the original Given a list of variables, computes the unreachable values if the variables were removed from the stack, then return the dynamic types of those values if they are available For monadic "bind" but not really that turns an monadic "map" but even less really that turns an Check that the Use the stack and heap to evaluate the given expression down to an abstract address representing its value. Return an error state if it traverses some known invalid address or if the end destination is known to be invalid. Similar to eval but apply to data structures and ISL abduction. Return a list of abduced states (ISLOk and ISLErs); The boolean indicates whether it is data structures or not. Like Like Like Havoc dereferenced field address. write the edge write the edge write the edge write the edge the value was read from the heap following the the value was read from the stack we don't know where the value came from; avoid using if possible the way that was used to get to the invalidated address in the state; this is used to record the invalidation point in its history in addition to inside the record that the address is invalid record that the address is invalid. If the address has not been allocated, abduce ISL specs for both invalid (null, free, unint) and allocated heap. record that what the address points via the access to is invalid Like record that all the array elements that address points to is invalid returns the address of a new cell with the same edges as the original Given a list of variables, computes the unreachable values if the variables were removed from the stack, then return the dynamic types of those values if they are available whether the state contains a contradiction, call this as often as you want whether the state contains a contradiction, only call this when you absolutely have to whether the current path is independent of any calling context get the canonical representative for the variable according to the equality relation in the "known" part of the formula get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula whether the state contains a contradiction, call this as often as you want whether the state contains a contradiction, only call this when you absolutely have to whether the current path is independent of any calling context get the canonical representative for the variable according to the equality relation in the "known" part of the formula get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula step number attribute operations like add the attributes to both the current state and, if meaningful, the pre add the attribute only to the post attribute operations like add the attributes to both the current state and, if meaningful, the pre add the attribute only to the post stack operations like return the value of the variable in the stack or create a fresh one if needed stack operations like return the value of the variable in the stack or create a fresh one if needed helper function wrapping helper function wrapping helper function wrapping helper function wrapping in case an element with the same rank is present both in check whether for each attr in the second list, there exists a corresponding attr in the first according to While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable in case an element with the same rank is present both in check whether for each attr in the second list, there exists a corresponding attr in the first according to While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable the The allocation is abduced so as the analysis could run normally temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks the The allocation is abduced so as the analysis could run normally temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks merge the attributes of all the variables that are equal according to merge the attributes of all the variables that are equal according to perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable. only used for unit tests some operations will return a set of new facts discovered that are relevant to communicate to the memory domain think a bit harder about the formula get the canonical representative for the variable according to the known/post equality relation Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable. only used for unit tests some operations will return a set of new facts discovered that are relevant to communicate to the memory domain think a bit harder about the formula get the canonical representative for the variable according to the known/post equality relation result of applying one pre/post pair of a callee's summary: result of applying one pre/post pair of a callee's summary: assert the validity of the addresses captured by the lambda assert the validity of the addresses captured by the lambda For monadic "bind" but not really that turns an monadic "map" but even less really that turns an Check that the Use the stack and heap to evaluate the given expression down to an abstract address representing its value. Return an error state if it traverses some known invalid address or if the end destination is known to be invalid. Similar to eval but apply to data structures and ISL abduction. Return a list of abduced states (ISLOk and ISLErs); The boolean indicates whether it is data structures or not. Like Like Like Havoc dereferenced field address. write the edge write the edge write the edge write the edge the value was read from the heap following the the value was read from the stack we don't know where the value came from; avoid using if possible the way that was used to get to the invalidated address in the state; this is used to record the invalidation point in its history in addition to inside the record that the address is invalid record that the address is invalid. If the address has not been allocated, abduce ISL specs for both invalid (null, free, unint) and allocated heap. record that what the address points via the access to is invalid Like record that all the array elements that address points to is invalid returns the address of a new cell with the same edges as the original Given a list of variables, computes the unreachable values if the variables were removed from the stack, then return the dynamic types of those values if they are available For monadic "bind" but not really that turns an monadic "map" but even less really that turns an Check that the Use the stack and heap to evaluate the given expression down to an abstract address representing its value. Return an error state if it traverses some known invalid address or if the end destination is known to be invalid. Similar to eval but apply to data structures and ISL abduction. Return a list of abduced states (ISLOk and ISLErs); The boolean indicates whether it is data structures or not. Like Like Like Havoc dereferenced field address. write the edge write the edge write the edge write the edge the value was read from the heap following the the value was read from the stack we don't know where the value came from; avoid using if possible the way that was used to get to the invalidated address in the state; this is used to record the invalidation point in its history in addition to inside the record that the address is invalid record that the address is invalid. If the address has not been allocated, abduce ISL specs for both invalid (null, free, unint) and allocated heap. record that what the address points via the access to is invalid Like record that all the array elements that address points to is invalid returns the address of a new cell with the same edges as the original Given a list of variables, computes the unreachable values if the variables were removed from the stack, then return the dynamic types of those values if they are available whether the state contains a contradiction, call this as often as you want whether the state contains a contradiction, only call this when you absolutely have to whether the current path is independent of any calling context get the canonical representative for the variable according to the equality relation in the "known" part of the formula get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula whether the state contains a contradiction, call this as often as you want whether the state contains a contradiction, only call this when you absolutely have to whether the current path is independent of any calling context get the canonical representative for the variable according to the equality relation in the "known" part of the formula get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula
@@ -2421,6 +2421,9 @@ without their leading "--", and values depend on
the type of the option:
- for switches options, the value is a JSON boolean (true or
false, without quotes)
+- for non-switches options with no arguments (for instance
+the undefined option associated with a list option), the
+value is null
- for integers, the value is a JSON integer (without quotes)
- string options have string values
diff --git a/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-1-Domain1/index.html b/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-1-Domain1/index.html
new file mode 100644
index 000000000..5a7ebf445
--- /dev/null
+++ b/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-1-Domain1/index.html
@@ -0,0 +1,2 @@
+
+Parameter
PairNoJoin.1-Domain1
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
Parameter
PairNoJoin.2-Domain2
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
Module
AbstractDomain.PairNoJoin
Parameters
Signature
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
Module
Absint.AbstractDomain
Abstract domains and domain combinators
module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
module type WithBottom = sig ... end
module type WithTop = sig ... end
module BottomLifted : functor (Domain : S) -> sig ... end
module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted
module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t
module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end
include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.t, Val.t, Above.t) Types.below_above
Below
, Val
, and Above
domains where all elements of Below
are strictly smaller than all elements of Val
which are strictly smaller than all elements of Above
module StackedUtils : sig ... end
module MinReprSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
Element
s by keeping its smallest representative only. The widening is terminating only if the order fulfills the descending chain condition.module type FiniteSetS = sig ... end
include sig ... end
module FiniteSetOfPPSet : functor (PPSet : IStdlib.PrettyPrintable.PPSet) -> FiniteSetS with type FiniteSetOfPPSet.elt = PPSet.elt
module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t
module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t
module type MapS = sig ... end
include sig ... end
module MapOfPPMap : functor (PPMap : IStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> MapS with type key = PPMap.key and type value = ValueDomain.t and type t = ValueDomain.t PPMap.t
module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t
module type InvertedMapS = sig ... end
module InvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
InvertedMap
but it guarantees that it has a canonical form. For example, both {a -> top_v}
and empty
represent the same abstract value top
in InvertedMap
, but in this implementation, top
is always implemented as empty
by not adding the top_v
explicitly.include sig ... end
module FiniteMultiMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (Value : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
module BooleanAnd : S with type t = bool
module BooleanOr : WithBottom with type t = bool
module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end
module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end
join
is minimum and top
is zero.Module
Absint.AbstractDomain
Abstract domains and domain combinators
module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
module type WithBottom = sig ... end
module type WithTop = sig ... end
module BottomLifted : functor (Domain : S) -> sig ... end
module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted
module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t
module PairNoJoin : functor (Domain1 : NoJoin) -> functor (Domain2 : NoJoin) -> NoJoin with type t = Domain1.t * Domain2.t
module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end
include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.t, Val.t, Above.t) Types.below_above
Below
, Val
, and Above
domains where all elements of Below
are strictly smaller than all elements of Val
which are strictly smaller than all elements of Above
module StackedUtils : sig ... end
module MinReprSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
Element
s by keeping its smallest representative only. The widening is terminating only if the order fulfills the descending chain condition.module type FiniteSetS = sig ... end
include sig ... end
module FiniteSetOfPPSet : functor (PPSet : IStdlib.PrettyPrintable.PPSet) -> FiniteSetS with type FiniteSetOfPPSet.elt = PPSet.elt
module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t
module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t
module type MapS = sig ... end
include sig ... end
module MapOfPPMap : functor (PPMap : IStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> MapS with type key = PPMap.key and type value = ValueDomain.t and type t = ValueDomain.t PPMap.t
module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t
module type InvertedMapS = sig ... end
module InvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
InvertedMap
but it guarantees that it has a canonical form. For example, both {a -> top_v}
and empty
represent the same abstract value top
in InvertedMap
, but in this implementation, top
is always implemented as empty
by not adding the top_v
explicitly.include sig ... end
module FiniteMultiMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (Value : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
module BooleanAnd : S with type t = bool
module BooleanOr : WithBottom with type t = bool
module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end
module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end
join
is minimum and top
is zero.Module
Absint.TaskSchedulerTypes
exception
ProcnameAlreadyLocked of
{
dependency_filename : string;
}
type target
=
|
Procname of IR.Procname.t
|
File of IBase.SourceFile.t
|
ProcUID of string
procedures
and specs
tables; see ResultsDatabase.ml
Module
Absint.TaskSchedulerTypes
type target
=
|
Procname of IR.Procname.t
|
File of IBase.SourceFile.t
|
ProcUID of string
procedures
and specs
tables; see ResultsDatabase.ml
Parameter
PairNoJoin.1-Domain1
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
Parameter
PairNoJoin.2-Domain2
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
Module
Absint__AbstractDomain.PairNoJoin
Parameters
Signature
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
Module
Absint__AbstractDomain
Abstract domains and domain combinators
module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
module type WithBottom = sig ... end
module type WithTop = sig ... end
module BottomLifted : functor (Domain : S) -> sig ... end
module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted
module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t
module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end
include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.t, Val.t, Above.t) Types.below_above
Below
, Val
, and Above
domains where all elements of Below
are strictly smaller than all elements of Val
which are strictly smaller than all elements of Above
module StackedUtils : sig ... end
module MinReprSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
Element
s by keeping its smallest representative only. The widening is terminating only if the order fulfills the descending chain condition.module type FiniteSetS = sig ... end
include sig ... end
module FiniteSetOfPPSet : functor (PPSet : IStdlib.PrettyPrintable.PPSet) -> FiniteSetS with type FiniteSetOfPPSet.elt = PPSet.elt
module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t
module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t
module type MapS = sig ... end
include sig ... end
module MapOfPPMap : functor (PPMap : IStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> MapS with type key = PPMap.key and type value = ValueDomain.t and type t = ValueDomain.t PPMap.t
module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t
module type InvertedMapS = sig ... end
module InvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
InvertedMap
but it guarantees that it has a canonical form. For example, both {a -> top_v}
and empty
represent the same abstract value top
in InvertedMap
, but in this implementation, top
is always implemented as empty
by not adding the top_v
explicitly.include sig ... end
module FiniteMultiMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (Value : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
module BooleanAnd : S with type t = bool
module BooleanOr : WithBottom with type t = bool
module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end
module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end
join
is minimum and top
is zero.Module
Absint__AbstractDomain
Abstract domains and domain combinators
module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
module type WithBottom = sig ... end
module type WithTop = sig ... end
module BottomLifted : functor (Domain : S) -> sig ... end
module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted
module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t
module PairNoJoin : functor (Domain1 : NoJoin) -> functor (Domain2 : NoJoin) -> NoJoin with type t = Domain1.t * Domain2.t
module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end
include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.t, Val.t, Above.t) Types.below_above
Below
, Val
, and Above
domains where all elements of Below
are strictly smaller than all elements of Val
which are strictly smaller than all elements of Above
module StackedUtils : sig ... end
module MinReprSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
Element
s by keeping its smallest representative only. The widening is terminating only if the order fulfills the descending chain condition.module type FiniteSetS = sig ... end
include sig ... end
module FiniteSetOfPPSet : functor (PPSet : IStdlib.PrettyPrintable.PPSet) -> FiniteSetS with type FiniteSetOfPPSet.elt = PPSet.elt
module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t
module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t
module type MapS = sig ... end
include sig ... end
module MapOfPPMap : functor (PPMap : IStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> MapS with type key = PPMap.key and type value = ValueDomain.t and type t = ValueDomain.t PPMap.t
module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t
module type InvertedMapS = sig ... end
module InvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t
InvertedMap
but it guarantees that it has a canonical form. For example, both {a -> top_v}
and empty
represent the same abstract value top
in InvertedMap
, but in this implementation, top
is always implemented as empty
by not adding the top_v
explicitly.include sig ... end
module FiniteMultiMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (Value : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end
module BooleanAnd : S with type t = bool
module BooleanOr : WithBottom with type t = bool
module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end
module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end
join
is minimum and top
is zero.Module
Absint__TaskSchedulerTypes
exception
ProcnameAlreadyLocked of
{
dependency_filename : string;
}
type target
=
|
Procname of IR.Procname.t
|
File of IBase.SourceFile.t
|
ProcUID of string
procedures
and specs
tables; see ResultsDatabase.ml
Module
Absint__TaskSchedulerTypes
type target
=
|
Procname of IR.Procname.t
|
File of IBase.SourceFile.t
|
ProcUID of string
procedures
and specs
tables; see ResultsDatabase.ml
Module
Concurrency.RacerDModels
val is_container_read : IR.Tenv.t -> IR.Procname.t -> bool
val is_container_write : IR.Tenv.t -> IR.Procname.t -> bool
val has_return_annot : (IR.Annot.Item.t -> bool) -> IR.Procname.t -> bool
val is_functional : IR.Procname.t -> bool
val acquires_ownership : IR.Procname.t -> IR.Tenv.t -> bool
val is_box : IR.Procname.t -> bool
val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool
@ThreadConfined
classes and methods annotated with @ThreadConfined
are assumed to all run on the same thread. For the moment we won't warn on accesses resulting from use of such methods at all. In future we should account for races between these methods and methods from completely different classes that don't necessarily run on the same thread as the confined object.val should_analyze_proc : IR.Tenv.t -> IR.Procname.t -> bool
val get_current_class_and_threadsafe_superclasses : IR.Tenv.t -> IR.Procname.t -> (IR.Typ.name * IR.Typ.name list) option
val is_thread_safe_method : IR.Procname.t -> IR.Tenv.t -> bool
@ThreadSafe
, @ThreadSafe(enableChecks = true)
, or is defined as an alias of @ThreadSafe
in a .inferconfig file.val is_marked_thread_safe : IR.Procname.t -> IR.Tenv.t -> bool
val is_safe_access : 'a Absint.HilExp.Access.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool
val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool
val is_synchronized_container_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_converter_to_synchronized_container : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
procname
a method that wraps a container into a thread-safe wrapper?Module
Concurrency.RacerDModels
val is_container_read : IR.Tenv.t -> IR.Procname.t -> bool
val is_container_write : IR.Tenv.t -> IR.Procname.t -> bool
val has_return_annot : (IR.Annot.Item.t -> bool) -> IR.Procname.t -> bool
val is_functional : IR.Procname.t -> bool
val acquires_ownership : IR.Procname.t -> IR.Tenv.t -> bool
val is_box : IR.Procname.t -> bool
val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool
@ThreadConfined
classes and methods annotated with @ThreadConfined
are assumed to all run on the same thread. For the moment we won't warn on accesses resulting from use of such methods at all. In future we should account for races between these methods and methods from completely different classes that don't necessarily run on the same thread as the confined object.val should_analyze_proc : IR.Tenv.t -> IR.Procname.t -> bool
val get_current_class_and_threadsafe_superclasses : IR.Tenv.t -> IR.Procname.t -> (IR.Typ.name * IR.Typ.name list) option
val is_thread_safe_method : IR.Procname.t -> IR.Tenv.t -> bool
@ThreadSafe
, @ThreadSafe(enableChecks = true)
, or is defined as an alias of @ThreadSafe
in a .inferconfig file.val is_marked_thread_safe : IR.Procname.t -> IR.Tenv.t -> bool
val is_safe_access : 'a Absint.HilExp.Access.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool
val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool
val is_synchronized_container_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_converter_to_synchronized_container : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
procname
a method that wraps a container into a thread-safe wrapper?val get_litho_explanation : IR.Tenv.t -> IR.Procname.t -> string option
Module
Concurrency__RacerDModels
val is_container_read : IR.Tenv.t -> IR.Procname.t -> bool
val is_container_write : IR.Tenv.t -> IR.Procname.t -> bool
val has_return_annot : (IR.Annot.Item.t -> bool) -> IR.Procname.t -> bool
val is_functional : IR.Procname.t -> bool
val acquires_ownership : IR.Procname.t -> IR.Tenv.t -> bool
val is_box : IR.Procname.t -> bool
val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool
@ThreadConfined
classes and methods annotated with @ThreadConfined
are assumed to all run on the same thread. For the moment we won't warn on accesses resulting from use of such methods at all. In future we should account for races between these methods and methods from completely different classes that don't necessarily run on the same thread as the confined object.val should_analyze_proc : IR.Tenv.t -> IR.Procname.t -> bool
val get_current_class_and_threadsafe_superclasses : IR.Tenv.t -> IR.Procname.t -> (IR.Typ.name * IR.Typ.name list) option
val is_thread_safe_method : IR.Procname.t -> IR.Tenv.t -> bool
@ThreadSafe
, @ThreadSafe(enableChecks = true)
, or is defined as an alias of @ThreadSafe
in a .inferconfig file.val is_marked_thread_safe : IR.Procname.t -> IR.Tenv.t -> bool
val is_safe_access : 'a Absint.HilExp.Access.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool
val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool
val is_synchronized_container_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_converter_to_synchronized_container : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
procname
a method that wraps a container into a thread-safe wrapper?Module
Concurrency__RacerDModels
val is_container_read : IR.Tenv.t -> IR.Procname.t -> bool
val is_container_write : IR.Tenv.t -> IR.Procname.t -> bool
val has_return_annot : (IR.Annot.Item.t -> bool) -> IR.Procname.t -> bool
val is_functional : IR.Procname.t -> bool
val acquires_ownership : IR.Procname.t -> IR.Tenv.t -> bool
val is_box : IR.Procname.t -> bool
val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool
@ThreadConfined
classes and methods annotated with @ThreadConfined
are assumed to all run on the same thread. For the moment we won't warn on accesses resulting from use of such methods at all. In future we should account for races between these methods and methods from completely different classes that don't necessarily run on the same thread as the confined object.val should_analyze_proc : IR.Tenv.t -> IR.Procname.t -> bool
val get_current_class_and_threadsafe_superclasses : IR.Tenv.t -> IR.Procname.t -> (IR.Typ.name * IR.Typ.name list) option
val is_thread_safe_method : IR.Procname.t -> IR.Tenv.t -> bool
@ThreadSafe
, @ThreadSafe(enableChecks = true)
, or is defined as an alias of @ThreadSafe
in a .inferconfig file.val is_marked_thread_safe : IR.Procname.t -> IR.Tenv.t -> bool
val is_safe_access : 'a Absint.HilExp.Access.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool
val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool
val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool
val is_synchronized_container_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_converter_to_synchronized_container : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
procname
a method that wraps a container into a thread-safe wrapper?val get_litho_explanation : IR.Tenv.t -> IR.Procname.t -> string option
Module
ErlangFrontend.ErlangAst
Basics
type module_reference
=
|
ModuleName of string
|
ModuleMissing
|
ModuleVariable of string
type function_reference
=
|
FunctionName of string
|
FunctionVariable of string
type function_
=
{
module_ : module_reference;
function_ : function_reference;
arity : int;
}
type line
= int
type record_name
= string
type binary_operator
=
|
Add
|
And
|
AndAlso
|
AtLeast
|
AtMost
|
BAnd
|
BOr
|
Bsl
|
Bsr
|
BXor
|
Equal
|
ExactlyEqual
|
ExactlyNotEqual
|
FDiv
|
Greater
|
IDiv
|
Less
|
ListAdd
|
ListSub
|
Mul
|
NotEqual
|
Or
|
OrElse
|
Rem
|
Send
|
Sub
|
Xor
type unary_operator
=
|
UBNot
|
UMinus
|
UNot
type association_kind
=
|
Arrow
|
Exact
type exception_
=
|
Atom of string
|
Pattern of string
type type_specifier
= unit
S8.2: Atomic literals
S8.4: Expressions
type body
= expression list
and simple_expression
=
|
BinaryOperator of expression * binary_operator * expression
|
BitstringComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
BitstringConstructor of bin_element list
|
Block of body
|
Call of
{
module_ : expression option;
function_ : expression;
args : expression list;
}
|
Case of
{
expression : expression;
cases : case_clause list;
}
|
Catch of expression
|
Cons of
{
head : expression;
tail : expression;
}
|
Fun of function_
|
If of case_clause list
|
Lambda of
{
name : string option;
cases : case_clause list;
}
|
ListComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
Literal of literal
|
Map of
{
map : expression option;
updates : association list;
}
|
Match of
{
pattern : pattern;
body : expression;
}
|
Nil
|
Receive of
{
cases : case_clause list;
timeout : timeout option;
}
|
RecordAccess of
{
record : expression;
name : record_name;
field : string;
}
|
RecordIndex of
{
name : record_name;
field : string;
}
|
RecordUpdate of
{
record : expression option;
name : record_name;
updates : record_update list;
}
|
TryCatch of
{
body : body;
ok_cases : case_clause list;
catch_cases : catch_clause list;
after : body;
}
|
Tuple of expression list
|
UnaryOperator of unary_operator * expression
|
Variable of string
and expression
=
{
line : line;
simple_expression : simple_expression;
}
and qualifier
=
|
BitsGenerator of
{
pattern : pattern;
expression : expression;
}
|
Filter of expression
|
Generator of
{
pattern : pattern;
expression : expression;
}
and timeout
=
{
time : expression;
handler : body;
}
and bin_element
=
{
expression : expression;
size : expression option;
types : type_specifier list option;
}
and record_update
=
{
field : string option;
expression : expression;
}
and association
=
{
kind : association_kind;
key : expression;
value : expression;
}
and pattern
= expression
and guard
= expression
S8.5 Clauses
and 'pat clause
=
{
line : line;
patterns : 'pat list;
guards : guard list;
body : body;
}
and case_clause
= pattern clause
and catch_clause
= catch_pattern clause
and catch_pattern
=
{
exception_ : exception_;
pattern : pattern;
variable : string;
}
S8.1: Module declarations and forms
type simple_form
=
|
Export of function_ list
|
Import of
{
module_name : string;
functions : function_ list;
}
|
Module of string
|
File of
{
path : string;
}
|
Function of
{
function_ : function_;
clauses : case_clause list;
}
type form
=
{
line : line;
simple_form : simple_form;
}
type module_
= form list
Module
ErlangFrontend.ErlangAst
Basics
type module_reference
=
|
ModuleName of string
|
ModuleMissing
|
ModuleVariable of string
type function_reference
=
|
FunctionName of string
|
FunctionVariable of string
type function_
=
{
module_ : module_reference;
function_ : function_reference;
arity : int;
}
type line
= int
type record_name
= string
type binary_operator
=
|
Add
|
And
|
AndAlso
|
AtLeast
|
AtMost
|
BAnd
|
BOr
|
Bsl
|
Bsr
|
BXor
|
Equal
|
ExactlyEqual
|
ExactlyNotEqual
|
FDiv
|
Greater
|
IDiv
|
Less
|
ListAdd
|
ListSub
|
Mul
|
NotEqual
|
Or
|
OrElse
|
Rem
|
Send
|
Sub
|
Xor
type unary_operator
=
|
UBNot
|
UMinus
|
UNot
type association_kind
=
|
Arrow
|
Exact
type exception_
=
|
Atom of string
|
Pattern of string
type type_specifier
= unit
S8.2: Atomic literals
S8.4: Expressions
type body
= expression list
and simple_expression
=
|
BinaryOperator of expression * binary_operator * expression
|
BitstringComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
BitstringConstructor of bin_element list
|
Block of body
|
Call of
{
module_ : expression option;
function_ : expression;
args : expression list;
}
|
Case of
{
expression : expression;
cases : case_clause list;
}
|
Catch of expression
|
Cons of
{
head : expression;
tail : expression;
}
|
Fun of function_
|
If of case_clause list
|
Lambda of
{
name : string option;
cases : case_clause list;
}
|
ListComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
Literal of literal
|
Map of
{
map : expression option;
updates : association list;
}
|
Match of
{
pattern : pattern;
body : expression;
}
|
Nil
|
Receive of
{
cases : case_clause list;
timeout : timeout option;
}
|
RecordAccess of
{
record : expression;
name : record_name;
field : string;
}
|
RecordIndex of
{
name : record_name;
field : string;
}
|
RecordUpdate of
{
record : expression option;
name : record_name;
updates : record_update list;
}
|
TryCatch of
{
body : body;
ok_cases : case_clause list;
catch_cases : catch_clause list;
after : body;
}
|
Tuple of expression list
|
UnaryOperator of unary_operator * expression
|
Variable of string
and expression
=
{
line : line;
simple_expression : simple_expression;
}
and qualifier
=
|
BitsGenerator of
{
pattern : pattern;
expression : expression;
}
|
Filter of expression
|
Generator of
{
pattern : pattern;
expression : expression;
}
and timeout
=
{
time : expression;
handler : body;
}
and bin_element
=
{
expression : expression;
size : expression option;
types : type_specifier list option;
}
and record_update
=
{
field : string option;
expression : expression;
}
and association
=
{
kind : association_kind;
key : expression;
value : expression;
}
and pattern
= expression
and guard_test
= expression
S8.5 Clauses
and 'pat clause
=
{
line : line;
patterns : 'pat list;
guards : guard_test list list;
body : body;
}
and case_clause
= pattern clause
and catch_clause
= catch_pattern clause
and catch_pattern
=
{
exception_ : exception_;
pattern : pattern;
variable : string;
}
S8.1: Module declarations and forms
type simple_form
=
|
Export of function_ list
|
Import of
{
module_name : string;
functions : function_ list;
}
|
Module of string
|
File of
{
path : string;
}
|
Function of
{
function_ : function_;
clauses : case_clause list;
}
type form
=
{
line : line;
simple_form : simple_form;
}
type module_
= form list
Module
ErlangFrontend.ErlangTranslator
val to_source_and_cfg : ErlangAst.module_ -> IBase.SourceFile.t * IR.Cfg.t
Module
ErlangFrontend.ErlangTranslator
val translate_module : ErlangAst.module_ -> unit
Module
ErlangFrontend__ErlangAst
Basics
type module_reference
=
|
ModuleName of string
|
ModuleMissing
|
ModuleVariable of string
type function_reference
=
|
FunctionName of string
|
FunctionVariable of string
type function_
=
{
module_ : module_reference;
function_ : function_reference;
arity : int;
}
type line
= int
type record_name
= string
type binary_operator
=
|
Add
|
And
|
AndAlso
|
AtLeast
|
AtMost
|
BAnd
|
BOr
|
Bsl
|
Bsr
|
BXor
|
Equal
|
ExactlyEqual
|
ExactlyNotEqual
|
FDiv
|
Greater
|
IDiv
|
Less
|
ListAdd
|
ListSub
|
Mul
|
NotEqual
|
Or
|
OrElse
|
Rem
|
Send
|
Sub
|
Xor
type unary_operator
=
|
UBNot
|
UMinus
|
UNot
type association_kind
=
|
Arrow
|
Exact
type exception_
=
|
Atom of string
|
Pattern of string
type type_specifier
= unit
S8.2: Atomic literals
S8.4: Expressions
type body
= expression list
and simple_expression
=
|
BinaryOperator of expression * binary_operator * expression
|
BitstringComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
BitstringConstructor of bin_element list
|
Block of body
|
Call of
{
module_ : expression option;
function_ : expression;
args : expression list;
}
|
Case of
{
expression : expression;
cases : case_clause list;
}
|
Catch of expression
|
Cons of
{
head : expression;
tail : expression;
}
|
Fun of function_
|
If of case_clause list
|
Lambda of
{
name : string option;
cases : case_clause list;
}
|
ListComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
Literal of literal
|
Map of
{
map : expression option;
updates : association list;
}
|
Match of
{
pattern : pattern;
body : expression;
}
|
Nil
|
Receive of
{
cases : case_clause list;
timeout : timeout option;
}
|
RecordAccess of
{
record : expression;
name : record_name;
field : string;
}
|
RecordIndex of
{
name : record_name;
field : string;
}
|
RecordUpdate of
{
record : expression option;
name : record_name;
updates : record_update list;
}
|
TryCatch of
{
body : body;
ok_cases : case_clause list;
catch_cases : catch_clause list;
after : body;
}
|
Tuple of expression list
|
UnaryOperator of unary_operator * expression
|
Variable of string
and expression
=
{
line : line;
simple_expression : simple_expression;
}
and qualifier
=
|
BitsGenerator of
{
pattern : pattern;
expression : expression;
}
|
Filter of expression
|
Generator of
{
pattern : pattern;
expression : expression;
}
and timeout
=
{
time : expression;
handler : body;
}
and bin_element
=
{
expression : expression;
size : expression option;
types : type_specifier list option;
}
and record_update
=
{
field : string option;
expression : expression;
}
and association
=
{
kind : association_kind;
key : expression;
value : expression;
}
and pattern
= expression
and guard
= expression
S8.5 Clauses
and 'pat clause
=
{
line : line;
patterns : 'pat list;
guards : guard list;
body : body;
}
and case_clause
= pattern clause
and catch_clause
= catch_pattern clause
and catch_pattern
=
{
exception_ : exception_;
pattern : pattern;
variable : string;
}
S8.1: Module declarations and forms
type simple_form
=
|
Export of function_ list
|
Import of
{
module_name : string;
functions : function_ list;
}
|
Module of string
|
File of
{
path : string;
}
|
Function of
{
function_ : function_;
clauses : case_clause list;
}
type form
=
{
line : line;
simple_form : simple_form;
}
type module_
= form list
Module
ErlangFrontend__ErlangAst
Basics
type module_reference
=
|
ModuleName of string
|
ModuleMissing
|
ModuleVariable of string
type function_reference
=
|
FunctionName of string
|
FunctionVariable of string
type function_
=
{
module_ : module_reference;
function_ : function_reference;
arity : int;
}
type line
= int
type record_name
= string
type binary_operator
=
|
Add
|
And
|
AndAlso
|
AtLeast
|
AtMost
|
BAnd
|
BOr
|
Bsl
|
Bsr
|
BXor
|
Equal
|
ExactlyEqual
|
ExactlyNotEqual
|
FDiv
|
Greater
|
IDiv
|
Less
|
ListAdd
|
ListSub
|
Mul
|
NotEqual
|
Or
|
OrElse
|
Rem
|
Send
|
Sub
|
Xor
type unary_operator
=
|
UBNot
|
UMinus
|
UNot
type association_kind
=
|
Arrow
|
Exact
type exception_
=
|
Atom of string
|
Pattern of string
type type_specifier
= unit
S8.2: Atomic literals
S8.4: Expressions
type body
= expression list
and simple_expression
=
|
BinaryOperator of expression * binary_operator * expression
|
BitstringComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
BitstringConstructor of bin_element list
|
Block of body
|
Call of
{
module_ : expression option;
function_ : expression;
args : expression list;
}
|
Case of
{
expression : expression;
cases : case_clause list;
}
|
Catch of expression
|
Cons of
{
head : expression;
tail : expression;
}
|
Fun of function_
|
If of case_clause list
|
Lambda of
{
name : string option;
cases : case_clause list;
}
|
ListComprehension of
{
expression : expression;
qualifiers : qualifier list;
}
|
Literal of literal
|
Map of
{
map : expression option;
updates : association list;
}
|
Match of
{
pattern : pattern;
body : expression;
}
|
Nil
|
Receive of
{
cases : case_clause list;
timeout : timeout option;
}
|
RecordAccess of
{
record : expression;
name : record_name;
field : string;
}
|
RecordIndex of
{
name : record_name;
field : string;
}
|
RecordUpdate of
{
record : expression option;
name : record_name;
updates : record_update list;
}
|
TryCatch of
{
body : body;
ok_cases : case_clause list;
catch_cases : catch_clause list;
after : body;
}
|
Tuple of expression list
|
UnaryOperator of unary_operator * expression
|
Variable of string
and expression
=
{
line : line;
simple_expression : simple_expression;
}
and qualifier
=
|
BitsGenerator of
{
pattern : pattern;
expression : expression;
}
|
Filter of expression
|
Generator of
{
pattern : pattern;
expression : expression;
}
and timeout
=
{
time : expression;
handler : body;
}
and bin_element
=
{
expression : expression;
size : expression option;
types : type_specifier list option;
}
and record_update
=
{
field : string option;
expression : expression;
}
and association
=
{
kind : association_kind;
key : expression;
value : expression;
}
and pattern
= expression
and guard_test
= expression
S8.5 Clauses
and 'pat clause
=
{
line : line;
patterns : 'pat list;
guards : guard_test list list;
body : body;
}
and case_clause
= pattern clause
and catch_clause
= catch_pattern clause
and catch_pattern
=
{
exception_ : exception_;
pattern : pattern;
variable : string;
}
S8.1: Module declarations and forms
type simple_form
=
|
Export of function_ list
|
Import of
{
module_name : string;
functions : function_ list;
}
|
Module of string
|
File of
{
path : string;
}
|
Function of
{
function_ : function_;
clauses : case_clause list;
}
type form
=
{
line : line;
simple_form : simple_form;
}
type module_
= form list
Module
ErlangFrontend__ErlangTranslator
val to_source_and_cfg : ErlangFrontend.ErlangAst.module_ -> IBase.SourceFile.t * IR.Cfg.t
Module
ErlangFrontend__ErlangTranslator
val translate_module : ErlangFrontend.ErlangAst.module_ -> unit
Module
IBase.Config
type os_type
=
|
Unix
|
Win32
|
Cygwin
type build_system
=
|
BAnt
|
BBuck
|
BClang
|
BGradle
|
BJava
|
BJavac
|
BMake
|
BMvn
|
BNdk
|
BRebar3
|
BXcode
type scheduler
=
|
File
|
Restart
|
SyntacticCallGraph
val build_system_of_exe_name : string -> build_system
val string_of_build_system : build_system -> string
val env_inside_maven : IStdlib.IStd.Unix.env
Constant configuration values
val anonymous_block_num_sep : string
val anonymous_block_prefix : string
val assign : string
val biabduction_models_sql : string
val biabduction_models_jar : string
val bin_dir : string
val bound_error_allowed_in_procedure_call : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val default_failure_name : string
val dotty_frontend_output : string
val etc_dir : string
val fail_on_issue_exit_code : int
val fcp_dir : string
val idempotent_getters : bool
val initial_analysis_time : float
val ivar_attributes : string
val java_lambda_marker_infix : string
val kotlin_source_extension : string
val lib_dir : string
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val unsafe_unret : string
val weak : string
val whitelisted_cpp_classes : string list
val whitelisted_cpp_methods : string list
val wrappers_dir : string
Configuration values specified by command-line options
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val append_buck_flavors : string list
val biabduction_abs_struct : int
val biabduction_abs_val : int
val biabduction_allow_leak : bool
val biabduction_array_level : int
val biabduction_models_mode : bool
val biabduction_iterations : int
val biabduction_join_cond : int
val biabduction_memleak_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val biabduction_monitor_prop_size : bool
val biabduction_nelseg : bool
val biabduction_only_footprint : bool
val biabduction_seconds_per_iteration : float option
val biabduction_symops_per_iteration : int option
val biabduction_trace_join : bool
val biabduction_trace_rearrange : bool
val biabduction_type_size : bool
val biabduction_unsafe_malloc : bool
val biabduction_worklist_mode : int
val biabduction_write_dotty : bool
val bo_debug : int
val bo_field_depth_limit : int option
val bootclasspath : string option
val buck : bool
val buck_blacklist : string list
val buck_build_args : string list
val buck_build_args_no_inline : string list
val buck_cache_mode : bool
val buck_java_flavor_suppress_config : bool
val buck_java_heap_size_gb : int option
val buck_merge_all_deps : bool
val buck_mode : BuckMode.t option
val buck_out_gen : string
val buck_targets_blacklist : string list
val call_graph_schedule : bool
val capture : bool
val capture_blacklist : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
val cfg_json : string option
val changed_files_index : string option
val check_version : string option
val clang_ast_file : [ `Biniou of string | `Yojson of string ] option
val clang_compound_literal_init_limit : int
val clang_extra_flags : string list
val clang_blacklisted_flags : string list
val clang_blacklisted_flags_with_arg : string list
val clang_frontend_action_string : string
val clang_ignore_regex : string option
val clang_isystem_to_override_regex : Str.regexp option
val clang_idirafter_to_override_regex : Str.regexp option
val clang_libcxx_include_to_override_regex : string option
val classpath : string option
val command : ATDGenerated.InferCommand.t
val config_impact_current : string option
val config_impact_data_file : string option
val config_impact_issues_tests : string option
val config_impact_max_callees_to_print : int
val config_impact_previous : string option
val continue_analysis : bool
val continue_capture : bool
val costs_current : string option
val cost_issues_tests : string option
val cost_scuba_logging : bool
val costs_previous : string option
val cost_suppress_func_ptr : bool
val cost_tests_only_autoreleasepool : bool
val cxx : bool
val cxx_scope_guards : Yojson.Basic.t
val deduplicate : bool
val debug_exceptions : bool
val debug_level_analysis : int
val debug_level_capture : int
val debug_level_linters : int
val debug_level_test_determinator : int
val debug_mode : bool
val default_linters : bool
val dependency_mode : bool
val developer_mode : bool
val differential_filter_files : string option
val differential_filter_set : [ `Introduced | `Fixed | `Preexisting ] list
val dotty_cfg_libs : bool
val dump_duplicate_symbols : bool
val eradicate_condition_redundant : bool
val eradicate_field_over_annotated : bool
val eradicate_return_over_annotated : bool
val eradicate_verbose : bool
val erlang_ast_dir : string option
val erlang_skip_rebar3 : bool
val fail_on_bug : bool
val fcp_apple_clang : string option
val fcp_syntax_only : bool
val file_renamings : string option
val filter_paths : bool
val filtering : bool
val force_delete_results_dir : bool
val force_integration : build_system option
val from_json_report : string
val from_json_config_impact_report : string
val from_json_costs_report : string
val frontend_stats : bool
val frontend_tests : bool
val function_pointer_specialization : bool
val generated_classes : string option
val genrule_mode : bool
val get_linter_doc_url : linter_id:string -> string option
val help_checker : Checker.t list
val help_issue_type : IssueType.t list
val hoisting_report_only_expensive : bool
val html : bool
val global_tenv : bool
val icfg_dotty_outfile : string option
val impurity_report_immutable_modifications : bool
val incremental_analysis : bool
val infer_is_clang : bool
val infer_is_javac : bool
val implicit_sdk_root : string option
val inclusive_cost : bool
val inferconfig_file : string option
val inferconfig_dir : string option
val is_checker_enabled : Checker.t -> bool
val issues_tests : string option
val issues_tests_fields : IssuesTestField.t list
val java_debug_source_file_info : string option
val java_jar_compiler : string option
val java_source_parser_experimental : bool
val java_version : int option
val javac_classes_out : string
val job_id : string option
val jobs : int
val keep_going : bool
val linter : string option
val linters_def_file : string list
val linters_def_folder : string list
val linters_developer_mode : bool
val linters_ignore_clang_failures : bool
val linters_validate_syntax_only : bool
val list_checkers : bool
val list_issue_types : bool
val liveness_dangerous_classes : Yojson.Basic.t
val liveness_ignored_constant : string list
val load_average : float option
val max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val modified_lines : string option
val no_translate_libs : bool
val nullable_annotation : string option
val nullsafe_annotation_graph : bool
val nullsafe_disable_field_not_initialized_in_nonstrict_classes : bool
val nullsafe_optimistic_third_party_in_default_mode : bool
val nullsafe_third_party_signatures : string option
val nullsafe_third_party_location_for_messaging_only : string option
val nullsafe_strict_containers : bool
val oom_threshold : int option
val only_cheap_debug : bool
val patterns_modeled_expensive : string * Yojson.Basic.t
val patterns_never_returning_null : string * Yojson.Basic.t
val patterns_skip_implementation : string * Yojson.Basic.t
val patterns_skip_translation : string * Yojson.Basic.t
val pmd_xml : bool
val print_active_checkers : bool
val print_builtins : bool
val print_jbir : bool
val print_logs : bool
val print_types : bool
val print_using_diff : bool
val procedures : bool
val procedures_attributes : bool
val procedures_cfg : bool
val procedures_definedness : bool
val procedures_filter : string option
val procedures_name : bool
val procedures_source_file : bool
val procedures_summary : bool
val procedures_summary_json : bool
val process_clang_ast : bool
val profiler_samples : string option
val progress_bar : [ `MultiLine | `Plain | `Quiet ]
val project_root : string
val pulse_cut_to_one_path_procedures_pattern : Str.regexp option
val pulse_intraprocedural_only : bool
val pulse_isl : bool
val pulse_manifest_emp : bool
val pulse_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_free_pattern : Str.regexp option
val pulse_model_malloc_pattern : Str.regexp option
val pulse_model_realloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_first_arg : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : Str.regexp option
val pulse_report_ignore_unknown_java_methods_patterns : Str.regexp option
val pulse_model_transfer_ownership_namespace : (string * string) list
val pulse_model_transfer_ownership : string list
val pulse_report_latent_issues : bool
val pulse_recency_limit : int
val pulse_widen_threshold : int
val pulse_nullsafe_report_npe : bool
val pure_by_default : bool
val quandary_endpoints : Yojson.Basic.t
val quandary_sanitizers : Yojson.Basic.t
val quandary_show_passthroughs : bool
val quandary_sinks : Yojson.Basic.t
val quandary_sources : Yojson.Basic.t
val quiet : bool
val racerd_guardedby : bool
val reactive_mode : bool
val reanalyze : bool
val relative_path_backtrack : int
val remodel_class : string option
val report : bool
val report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
val report_custom_error : bool
val report_force_relative_path : bool
val report_formatter : [ `No_formatter | `Phabricator_formatter ]
val report_path_regex_blacklist : string list
val report_path_regex_whitelist : string list
val report_previous : string option
val report_suppress_errors : string list
val reports_include_ml_loc : bool
val rest : string list
val results_dir : string
val scheduler : scheduler
val scuba_logging : bool
val scuba_normals : string IStdlib.IStd.String.Map.t
val scuba_tags : string list IStdlib.IStd.String.Map.t
val select : [ `All | `Select of int ] option
val show_buckets : bool
val siof_check_iostreams : bool
val siof_safe_methods : string list
val skip_analysis_in_path : string list
val skip_analysis_in_path_skips_compilation : bool
val skip_duplicated_types : bool
val skip_non_capture_clang_commands : bool
val skip_translation_headers : string list
val source_files : bool
val source_files_cfg : bool
val source_files_filter : string option
val source_files_freshly_captured : bool
val source_files_procedure_names : bool
val source_files_type_environment : bool
val source_preview : bool
val sourcepath : string option
val sources : string list
val sqlite_cache_size : int
val sqlite_page_size : int
val sqlite_lock_timeout : int
val sqlite_vfs : string option
val starvation_skip_analysis : Yojson.Basic.t
val starvation_strict_mode : bool
val starvation_whole_program : bool
val subtype_multirange : bool
val summaries_caches_max_size : int
val suppress_lint_ignore_types : bool
val tenv_json : string option
val test_determinator : bool
val export_changed_functions : bool
val test_filtering : bool
val testing_mode : bool
val threadsafe_aliases : Yojson.Basic.t
val topl_max_conjuncts : int
val topl_max_disjuncts : int
val topl_properties : string list
val trace_absarray : bool
val trace_error : bool
val trace_events : bool
val trace_ondemand : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val uninit_interproc : bool
val workspace : string option
val write_html : bool
val write_html_whitelist_regex : string list
val write_website : string option
val xcode_developer_dir : string option
val xcode_isysroot_suffix : string option
val xcpretty : bool
Configuration values derived from command-line options
val dynamic_dispatch : bool
val toplevel_results_dir : string
results_dir
.val is_in_custom_symbols : string -> string -> bool
val scuba_execution_id : IStdlib.IStd.Int64.t option
Global variables with initial values specified by command-line options
Module
IBase.Config
type os_type
=
|
Unix
|
Win32
|
Cygwin
type build_system
=
|
BAnt
|
BBuck
|
BClang
|
BGradle
|
BJava
|
BJavac
|
BMake
|
BMvn
|
BNdk
|
BRebar3
|
BXcode
type scheduler
=
|
File
|
Restart
|
SyntacticCallGraph
val build_system_of_exe_name : string -> build_system
val string_of_build_system : build_system -> string
val env_inside_maven : IStdlib.IStd.Unix.env
Constant configuration values
val anonymous_block_num_sep : string
val anonymous_block_prefix : string
val assign : string
val biabduction_models_sql : string
val biabduction_models_jar : string
val bin_dir : string
val bound_error_allowed_in_procedure_call : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val default_failure_name : string
val dotty_frontend_output : string
val etc_dir : string
val fail_on_issue_exit_code : int
val fcp_dir : string
val idempotent_getters : bool
val initial_analysis_time : float
val is_WSL : bool
val ivar_attributes : string
val java_lambda_marker_infix : string
val kotlin_source_extension : string
val lib_dir : string
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val unsafe_unret : string
val weak : string
val whitelisted_cpp_classes : string list
val whitelisted_cpp_methods : string list
val wrappers_dir : string
Configuration values specified by command-line options
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val append_buck_flavors : string list
val biabduction_abs_struct : int
val biabduction_abs_val : int
val biabduction_allow_leak : bool
val biabduction_array_level : int
val biabduction_models_mode : bool
val biabduction_iterations : int
val biabduction_join_cond : int
val biabduction_memleak_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val biabduction_monitor_prop_size : bool
val biabduction_nelseg : bool
val biabduction_only_footprint : bool
val biabduction_seconds_per_iteration : float option
val biabduction_symops_per_iteration : int option
val biabduction_trace_join : bool
val biabduction_trace_rearrange : bool
val biabduction_type_size : bool
val biabduction_unsafe_malloc : bool
val biabduction_worklist_mode : int
val biabduction_write_dotty : bool
val bo_debug : int
val bo_field_depth_limit : int option
val bootclasspath : string option
val buck : bool
val buck_blacklist : string list
val buck_build_args : string list
val buck_build_args_no_inline : string list
val buck_cache_mode : bool
val buck_java_flavor_suppress_config : bool
val buck_java_heap_size_gb : int option
val buck_merge_all_deps : bool
val buck_mode : BuckMode.t option
val buck_out_gen : string
val buck_targets_blacklist : string list
val call_graph_schedule : bool
val capture : bool
val capture_blacklist : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
val cfg_json : string option
val changed_files_index : string option
val check_version : string option
val clang_ast_file : [ `Biniou of string | `Yojson of string ] option
val clang_compound_literal_init_limit : int
val clang_extra_flags : string list
val clang_blacklisted_flags : string list
val clang_blacklisted_flags_with_arg : string list
val clang_frontend_action_string : string
val clang_ignore_regex : string option
val clang_isystem_to_override_regex : Str.regexp option
val clang_idirafter_to_override_regex : Str.regexp option
val clang_libcxx_include_to_override_regex : string option
val classpath : string option
val command : ATDGenerated.InferCommand.t
val config_impact_current : string option
val config_impact_data_file : string option
val config_impact_issues_tests : string option
val config_impact_max_callees_to_print : int
val config_impact_previous : string option
val continue_analysis : bool
val continue_capture : bool
val costs_current : string option
val cost_issues_tests : string option
val cost_scuba_logging : bool
val costs_previous : string option
val cost_suppress_func_ptr : bool
val cost_tests_only_autoreleasepool : bool
val cxx : bool
val cxx_scope_guards : Yojson.Basic.t
val dbwriter : bool
val deduplicate : bool
val debug_exceptions : bool
val debug_level_analysis : int
val debug_level_capture : int
val debug_level_linters : int
val debug_level_test_determinator : int
val debug_mode : bool
val default_linters : bool
val dependency_mode : bool
val developer_mode : bool
val differential_filter_files : string option
val differential_filter_set : [ `Introduced | `Fixed | `Preexisting ] list
val dotty_cfg_libs : bool
val dump_duplicate_symbols : bool
val eradicate_condition_redundant : bool
val eradicate_field_over_annotated : bool
val eradicate_return_over_annotated : bool
val eradicate_verbose : bool
val erlang_ast_dir : string option
val erlang_skip_rebar3 : bool
val fail_on_bug : bool
val fcp_apple_clang : string option
val fcp_syntax_only : bool
val file_renamings : string option
val filter_paths : bool
val filtering : bool
val force_delete_results_dir : bool
val force_integration : build_system option
val from_json_report : string
val from_json_config_impact_report : string
val from_json_costs_report : string
val frontend_stats : bool
val frontend_tests : bool
val function_pointer_specialization : bool
val generated_classes : string option
val genrule_mode : bool
val get_linter_doc_url : linter_id:string -> string option
val help_checker : Checker.t list
val help_issue_type : IssueType.t list
val hoisting_report_only_expensive : bool
val html : bool
val global_tenv : bool
val icfg_dotty_outfile : string option
val impurity_report_immutable_modifications : bool
val incremental_analysis : bool
val infer_is_clang : bool
val infer_is_javac : bool
val implicit_sdk_root : string option
val inclusive_cost : bool
val inferconfig_file : string option
val inferconfig_dir : string option
val is_checker_enabled : Checker.t -> bool
val issues_tests : string option
val issues_tests_fields : IssuesTestField.t list
val java_debug_source_file_info : string option
val java_jar_compiler : string option
val java_source_parser_experimental : bool
val java_version : int option
val javac_classes_out : string
val job_id : string option
val jobs : int
val keep_going : bool
val linter : string option
val linters_def_file : string list
val linters_def_folder : string list
val linters_developer_mode : bool
val linters_ignore_clang_failures : bool
val linters_validate_syntax_only : bool
val list_checkers : bool
val list_issue_types : bool
val liveness_dangerous_classes : Yojson.Basic.t
val liveness_ignored_constant : string list
val load_average : float option
val max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val modified_lines : string option
val no_translate_libs : bool
val nullable_annotation : string option
val nullsafe_annotation_graph : bool
val nullsafe_disable_field_not_initialized_in_nonstrict_classes : bool
val nullsafe_optimistic_third_party_in_default_mode : bool
val nullsafe_third_party_signatures : string option
val nullsafe_third_party_location_for_messaging_only : string option
val nullsafe_strict_containers : bool
val oom_threshold : int option
val only_cheap_debug : bool
val patterns_modeled_expensive : string * Yojson.Basic.t
val patterns_never_returning_null : string * Yojson.Basic.t
val patterns_skip_implementation : string * Yojson.Basic.t
val patterns_skip_translation : string * Yojson.Basic.t
val pmd_xml : bool
val print_active_checkers : bool
val print_builtins : bool
val print_jbir : bool
val print_logs : bool
val print_types : bool
val print_using_diff : bool
val procedures : bool
val procedures_attributes : bool
val procedures_cfg : bool
val procedures_definedness : bool
val procedures_filter : string option
val procedures_name : bool
val procedures_source_file : bool
val procedures_summary : bool
val procedures_summary_json : bool
val process_clang_ast : bool
val profiler_samples : string option
val progress_bar : [ `MultiLine | `Plain | `Quiet ]
val project_root : string
val pulse_cut_to_one_path_procedures_pattern : Str.regexp option
val pulse_intraprocedural_only : bool
val pulse_isl : bool
val pulse_manifest_emp : bool
val pulse_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_free_pattern : Str.regexp option
val pulse_model_malloc_pattern : Str.regexp option
val pulse_model_realloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_first_arg : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : Str.regexp option
val pulse_report_ignore_unknown_java_methods_patterns : Str.regexp option
val pulse_model_transfer_ownership_namespace : (string * string) list
val pulse_model_transfer_ownership : string list
val pulse_report_latent_issues : bool
val pulse_recency_limit : int
val pulse_widen_threshold : int
val pulse_nullsafe_report_npe : bool
val pure_by_default : bool
val quandary_endpoints : Yojson.Basic.t
val quandary_sanitizers : Yojson.Basic.t
val quandary_show_passthroughs : bool
val quandary_sinks : Yojson.Basic.t
val quandary_sources : Yojson.Basic.t
val quiet : bool
val racerd_guardedby : bool
val reactive_mode : bool
val reanalyze : bool
val relative_path_backtrack : int
val remodel_class : string option
val report : bool
val report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
val report_custom_error : bool
val report_force_relative_path : bool
val report_formatter : [ `No_formatter | `Phabricator_formatter ]
val report_path_regex_blacklist : string list
val report_path_regex_whitelist : string list
val report_previous : string option
val report_suppress_errors : string list
val reports_include_ml_loc : bool
val rest : string list
val results_dir : string
val scheduler : scheduler
val scuba_logging : bool
val scuba_normals : string IStdlib.IStd.String.Map.t
val scuba_tags : string list IStdlib.IStd.String.Map.t
val select : [ `All | `Select of int ] option
val show_buckets : bool
val siof_check_iostreams : bool
val siof_safe_methods : string list
val skip_analysis_in_path : string list
val skip_analysis_in_path_skips_compilation : bool
val skip_duplicated_types : bool
val skip_non_capture_clang_commands : bool
val skip_translation_headers : string list
val source_files : bool
val source_files_cfg : bool
val source_files_filter : string option
val source_files_freshly_captured : bool
val source_files_procedure_names : bool
val source_files_type_environment : bool
val source_preview : bool
val sourcepath : string option
val sources : string list
val sqlite_cache_size : int
val sqlite_page_size : int
val sqlite_lock_timeout : int
val sqlite_vfs : string option
val starvation_skip_analysis : Yojson.Basic.t
val starvation_strict_mode : bool
val starvation_whole_program : bool
val subtype_multirange : bool
val summaries_caches_max_size : int
val suppress_lint_ignore_types : bool
val tenv_json : string option
val test_determinator : bool
val export_changed_functions : bool
val test_filtering : bool
val testing_mode : bool
val threadsafe_aliases : Yojson.Basic.t
val topl_max_conjuncts : int
val topl_max_disjuncts : int
val topl_properties : string list
val trace_absarray : bool
val trace_error : bool
val trace_events : bool
val trace_ondemand : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val uninit_interproc : bool
val workspace : string option
val write_html : bool
val write_html_whitelist_regex : string list
val write_website : string option
val xcode_developer_dir : string option
val xcode_isysroot_suffix : string option
val xcpretty : bool
Configuration values derived from command-line options
val dynamic_dispatch : bool
val toplevel_results_dir : string
results_dir
.val is_in_custom_symbols : string -> string -> bool
val scuba_execution_id : IStdlib.IStd.Int64.t option
Global variables with initial values specified by command-line options
Module
IBase.RestartSchedulerException
Module
IBase.SourceFile
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t
module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool
val changed_sources_from_changed_files : string list -> Set.t
val invalid : string -> t
val from_abs_path : ?warn_on_error:bool -> string -> t
val create : ?warn_on_error:bool -> string -> t
val is_under_project_root : t -> bool
val of_header : ?warn_on_error:bool -> t -> t option
val pp : Stdlib.Format.formatter -> t -> unit
val to_abs_path : t -> string
val to_rel_path : t -> string
val to_string : ?force_relative:bool -> t -> string
val has_extension : t -> ext:string -> bool
module SQLite : SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IBase.SourceFile
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t
module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool
val read_config_changed_files : unit -> Set.t option
val invalid : string -> t
val from_abs_path : ?warn_on_error:bool -> string -> t
val create : ?warn_on_error:bool -> string -> t
val is_under_project_root : t -> bool
val of_header : ?warn_on_error:bool -> t -> t option
val pp : Stdlib.Format.formatter -> t -> unit
val to_abs_path : t -> string
val to_rel_path : t -> string
val to_string : ?force_relative:bool -> t -> string
val has_extension : t -> ext:string -> bool
module SQLite : SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IBase
module BuckMode : sig ... end
module Checker : sig ... end
module ClangProc : sig ... end
module CommandDoc : sig ... end
module CommandLineOption : sig ... end
module Config : sig ... end
module CostIssues : sig ... end
module CostIssuesTestField : sig ... end
module CostKind : sig ... end
module DB : sig ... end
module DBWriter : sig ... end
module Die : sig ... end
module Epilogues : sig ... end
module FileDiff : sig ... end
module ForkUtils : sig ... end
module IssueType : sig ... end
module IssuesTestField : sig ... end
module Language : sig ... end
module LineReader : sig ... end
module Location : sig ... end
module LogEntry : sig ... end
module Logging : sig ... end
module MarkupFormatter : sig ... end
module PerfEvent : sig ... end
module Process : sig ... end
module ProcessPool : sig ... end
module ProcessPoolState : sig ... end
module ResultsDatabase : sig ... end
module ResultsDir : sig ... end
module ResultsDirEntryName : sig ... end
module Scuba : sig ... end
module ScubaLogging : sig ... end
module Serialization : sig ... end
module SourceFile : sig ... end
module SqliteUtils : sig ... end
module SymOp : sig ... end
module TaskBar : sig ... end
module Utils : sig ... end
module Version : sig ... end
Module
IBase
module BuckMode : sig ... end
module Checker : sig ... end
module ClangProc : sig ... end
module CommandDoc : sig ... end
module CommandLineOption : sig ... end
module Config : sig ... end
module CostIssues : sig ... end
module CostIssuesTestField : sig ... end
module CostKind : sig ... end
module DB : sig ... end
module DBWriter : sig ... end
module Die : sig ... end
module Epilogues : sig ... end
module FileDiff : sig ... end
module ForkUtils : sig ... end
module IssueType : sig ... end
module IssuesTestField : sig ... end
module Language : sig ... end
module LineReader : sig ... end
module Location : sig ... end
module LogEntry : sig ... end
module Logging : sig ... end
module MarkupFormatter : sig ... end
module PerfEvent : sig ... end
module Process : sig ... end
module ProcessPool : sig ... end
module ProcessPoolState : sig ... end
module RestartSchedulerException : sig ... end
module ResultsDatabase : sig ... end
module ResultsDir : sig ... end
module ResultsDirEntryName : sig ... end
module Scuba : sig ... end
module ScubaLogging : sig ... end
module Serialization : sig ... end
module SourceFile : sig ... end
module SqliteUtils : sig ... end
module SymOp : sig ... end
module TaskBar : sig ... end
module Utils : sig ... end
module Version : sig ... end
Module
IBase__Config
type os_type
=
|
Unix
|
Win32
|
Cygwin
type build_system
=
|
BAnt
|
BBuck
|
BClang
|
BGradle
|
BJava
|
BJavac
|
BMake
|
BMvn
|
BNdk
|
BRebar3
|
BXcode
type scheduler
=
|
File
|
Restart
|
SyntacticCallGraph
val build_system_of_exe_name : string -> build_system
val string_of_build_system : build_system -> string
val env_inside_maven : IStdlib.IStd.Unix.env
Constant configuration values
val anonymous_block_num_sep : string
val anonymous_block_prefix : string
val assign : string
val biabduction_models_sql : string
val biabduction_models_jar : string
val bin_dir : string
val bound_error_allowed_in_procedure_call : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val default_failure_name : string
val dotty_frontend_output : string
val etc_dir : string
val fail_on_issue_exit_code : int
val fcp_dir : string
val idempotent_getters : bool
val initial_analysis_time : float
val ivar_attributes : string
val java_lambda_marker_infix : string
val kotlin_source_extension : string
val lib_dir : string
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val unsafe_unret : string
val weak : string
val whitelisted_cpp_classes : string list
val whitelisted_cpp_methods : string list
val wrappers_dir : string
Configuration values specified by command-line options
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val append_buck_flavors : string list
val biabduction_abs_struct : int
val biabduction_abs_val : int
val biabduction_allow_leak : bool
val biabduction_array_level : int
val biabduction_models_mode : bool
val biabduction_iterations : int
val biabduction_join_cond : int
val biabduction_memleak_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val biabduction_monitor_prop_size : bool
val biabduction_nelseg : bool
val biabduction_only_footprint : bool
val biabduction_seconds_per_iteration : float option
val biabduction_symops_per_iteration : int option
val biabduction_trace_join : bool
val biabduction_trace_rearrange : bool
val biabduction_type_size : bool
val biabduction_unsafe_malloc : bool
val biabduction_worklist_mode : int
val biabduction_write_dotty : bool
val bo_debug : int
val bo_field_depth_limit : int option
val bootclasspath : string option
val buck : bool
val buck_blacklist : string list
val buck_build_args : string list
val buck_build_args_no_inline : string list
val buck_cache_mode : bool
val buck_java_flavor_suppress_config : bool
val buck_java_heap_size_gb : int option
val buck_merge_all_deps : bool
val buck_mode : IBase.BuckMode.t option
val buck_out_gen : string
val buck_targets_blacklist : string list
val call_graph_schedule : bool
val capture : bool
val capture_blacklist : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
val cfg_json : string option
val changed_files_index : string option
val check_version : string option
val clang_ast_file : [ `Biniou of string | `Yojson of string ] option
val clang_compound_literal_init_limit : int
val clang_extra_flags : string list
val clang_blacklisted_flags : string list
val clang_blacklisted_flags_with_arg : string list
val clang_frontend_action_string : string
val clang_ignore_regex : string option
val clang_isystem_to_override_regex : Str.regexp option
val clang_idirafter_to_override_regex : Str.regexp option
val clang_libcxx_include_to_override_regex : string option
val classpath : string option
val command : ATDGenerated.InferCommand.t
val config_impact_current : string option
val config_impact_data_file : string option
val config_impact_issues_tests : string option
val config_impact_max_callees_to_print : int
val config_impact_previous : string option
val continue_analysis : bool
val continue_capture : bool
val costs_current : string option
val cost_issues_tests : string option
val cost_scuba_logging : bool
val costs_previous : string option
val cost_suppress_func_ptr : bool
val cost_tests_only_autoreleasepool : bool
val cxx : bool
val cxx_scope_guards : Yojson.Basic.t
val deduplicate : bool
val debug_exceptions : bool
val debug_level_analysis : int
val debug_level_capture : int
val debug_level_linters : int
val debug_level_test_determinator : int
val debug_mode : bool
val default_linters : bool
val dependency_mode : bool
val developer_mode : bool
val differential_filter_files : string option
val differential_filter_set : [ `Introduced | `Fixed | `Preexisting ] list
val dotty_cfg_libs : bool
val dump_duplicate_symbols : bool
val eradicate_condition_redundant : bool
val eradicate_field_over_annotated : bool
val eradicate_return_over_annotated : bool
val eradicate_verbose : bool
val erlang_ast_dir : string option
val erlang_skip_rebar3 : bool
val fail_on_bug : bool
val fcp_apple_clang : string option
val fcp_syntax_only : bool
val file_renamings : string option
val filter_paths : bool
val filtering : bool
val force_delete_results_dir : bool
val force_integration : build_system option
val from_json_report : string
val from_json_config_impact_report : string
val from_json_costs_report : string
val frontend_stats : bool
val frontend_tests : bool
val function_pointer_specialization : bool
val generated_classes : string option
val genrule_mode : bool
val get_linter_doc_url : linter_id:string -> string option
val help_checker : IBase.Checker.t list
val help_issue_type : IBase.IssueType.t list
val hoisting_report_only_expensive : bool
val html : bool
val global_tenv : bool
val icfg_dotty_outfile : string option
val impurity_report_immutable_modifications : bool
val incremental_analysis : bool
val infer_is_clang : bool
val infer_is_javac : bool
val implicit_sdk_root : string option
val inclusive_cost : bool
val inferconfig_file : string option
val inferconfig_dir : string option
val is_checker_enabled : IBase.Checker.t -> bool
val issues_tests : string option
val issues_tests_fields : IBase.IssuesTestField.t list
val java_debug_source_file_info : string option
val java_jar_compiler : string option
val java_source_parser_experimental : bool
val java_version : int option
val javac_classes_out : string
val job_id : string option
val jobs : int
val keep_going : bool
val linter : string option
val linters_def_file : string list
val linters_def_folder : string list
val linters_developer_mode : bool
val linters_ignore_clang_failures : bool
val linters_validate_syntax_only : bool
val list_checkers : bool
val list_issue_types : bool
val liveness_dangerous_classes : Yojson.Basic.t
val liveness_ignored_constant : string list
val load_average : float option
val max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val modified_lines : string option
val no_translate_libs : bool
val nullable_annotation : string option
val nullsafe_annotation_graph : bool
val nullsafe_disable_field_not_initialized_in_nonstrict_classes : bool
val nullsafe_optimistic_third_party_in_default_mode : bool
val nullsafe_third_party_signatures : string option
val nullsafe_third_party_location_for_messaging_only : string option
val nullsafe_strict_containers : bool
val oom_threshold : int option
val only_cheap_debug : bool
val patterns_modeled_expensive : string * Yojson.Basic.t
val patterns_never_returning_null : string * Yojson.Basic.t
val patterns_skip_implementation : string * Yojson.Basic.t
val patterns_skip_translation : string * Yojson.Basic.t
val pmd_xml : bool
val print_active_checkers : bool
val print_builtins : bool
val print_jbir : bool
val print_logs : bool
val print_types : bool
val print_using_diff : bool
val procedures : bool
val procedures_attributes : bool
val procedures_cfg : bool
val procedures_definedness : bool
val procedures_filter : string option
val procedures_name : bool
val procedures_source_file : bool
val procedures_summary : bool
val procedures_summary_json : bool
val process_clang_ast : bool
val profiler_samples : string option
val progress_bar : [ `MultiLine | `Plain | `Quiet ]
val project_root : string
val pulse_cut_to_one_path_procedures_pattern : Str.regexp option
val pulse_intraprocedural_only : bool
val pulse_isl : bool
val pulse_manifest_emp : bool
val pulse_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_free_pattern : Str.regexp option
val pulse_model_malloc_pattern : Str.regexp option
val pulse_model_realloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_first_arg : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : Str.regexp option
val pulse_report_ignore_unknown_java_methods_patterns : Str.regexp option
val pulse_model_transfer_ownership_namespace : (string * string) list
val pulse_model_transfer_ownership : string list
val pulse_report_latent_issues : bool
val pulse_recency_limit : int
val pulse_widen_threshold : int
val pulse_nullsafe_report_npe : bool
val pure_by_default : bool
val quandary_endpoints : Yojson.Basic.t
val quandary_sanitizers : Yojson.Basic.t
val quandary_show_passthroughs : bool
val quandary_sinks : Yojson.Basic.t
val quandary_sources : Yojson.Basic.t
val quiet : bool
val racerd_guardedby : bool
val reactive_mode : bool
val reanalyze : bool
val relative_path_backtrack : int
val remodel_class : string option
val report : bool
val report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
val report_custom_error : bool
val report_force_relative_path : bool
val report_formatter : [ `No_formatter | `Phabricator_formatter ]
val report_path_regex_blacklist : string list
val report_path_regex_whitelist : string list
val report_previous : string option
val report_suppress_errors : string list
val reports_include_ml_loc : bool
val rest : string list
val results_dir : string
val scheduler : scheduler
val scuba_logging : bool
val scuba_normals : string IStdlib.IStd.String.Map.t
val scuba_tags : string list IStdlib.IStd.String.Map.t
val select : [ `All | `Select of int ] option
val show_buckets : bool
val siof_check_iostreams : bool
val siof_safe_methods : string list
val skip_analysis_in_path : string list
val skip_analysis_in_path_skips_compilation : bool
val skip_duplicated_types : bool
val skip_non_capture_clang_commands : bool
val skip_translation_headers : string list
val source_files : bool
val source_files_cfg : bool
val source_files_filter : string option
val source_files_freshly_captured : bool
val source_files_procedure_names : bool
val source_files_type_environment : bool
val source_preview : bool
val sourcepath : string option
val sources : string list
val sqlite_cache_size : int
val sqlite_page_size : int
val sqlite_lock_timeout : int
val sqlite_vfs : string option
val starvation_skip_analysis : Yojson.Basic.t
val starvation_strict_mode : bool
val starvation_whole_program : bool
val subtype_multirange : bool
val summaries_caches_max_size : int
val suppress_lint_ignore_types : bool
val tenv_json : string option
val test_determinator : bool
val export_changed_functions : bool
val test_filtering : bool
val testing_mode : bool
val threadsafe_aliases : Yojson.Basic.t
val topl_max_conjuncts : int
val topl_max_disjuncts : int
val topl_properties : string list
val trace_absarray : bool
val trace_error : bool
val trace_events : bool
val trace_ondemand : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val uninit_interproc : bool
val workspace : string option
val write_html : bool
val write_html_whitelist_regex : string list
val write_website : string option
val xcode_developer_dir : string option
val xcode_isysroot_suffix : string option
val xcpretty : bool
Configuration values derived from command-line options
val dynamic_dispatch : bool
val toplevel_results_dir : string
results_dir
.val is_in_custom_symbols : string -> string -> bool
val scuba_execution_id : IStdlib.IStd.Int64.t option
Global variables with initial values specified by command-line options
Module
IBase__Config
type os_type
=
|
Unix
|
Win32
|
Cygwin
type build_system
=
|
BAnt
|
BBuck
|
BClang
|
BGradle
|
BJava
|
BJavac
|
BMake
|
BMvn
|
BNdk
|
BRebar3
|
BXcode
type scheduler
=
|
File
|
Restart
|
SyntacticCallGraph
val build_system_of_exe_name : string -> build_system
val string_of_build_system : build_system -> string
val env_inside_maven : IStdlib.IStd.Unix.env
Constant configuration values
val anonymous_block_num_sep : string
val anonymous_block_prefix : string
val assign : string
val biabduction_models_sql : string
val biabduction_models_jar : string
val bin_dir : string
val bound_error_allowed_in_procedure_call : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val default_failure_name : string
val dotty_frontend_output : string
val etc_dir : string
val fail_on_issue_exit_code : int
val fcp_dir : string
val idempotent_getters : bool
val initial_analysis_time : float
val is_WSL : bool
val ivar_attributes : string
val java_lambda_marker_infix : string
val kotlin_source_extension : string
val lib_dir : string
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val unsafe_unret : string
val weak : string
val whitelisted_cpp_classes : string list
val whitelisted_cpp_methods : string list
val wrappers_dir : string
Configuration values specified by command-line options
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val append_buck_flavors : string list
val biabduction_abs_struct : int
val biabduction_abs_val : int
val biabduction_allow_leak : bool
val biabduction_array_level : int
val biabduction_models_mode : bool
val biabduction_iterations : int
val biabduction_join_cond : int
val biabduction_memleak_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val biabduction_monitor_prop_size : bool
val biabduction_nelseg : bool
val biabduction_only_footprint : bool
val biabduction_seconds_per_iteration : float option
val biabduction_symops_per_iteration : int option
val biabduction_trace_join : bool
val biabduction_trace_rearrange : bool
val biabduction_type_size : bool
val biabduction_unsafe_malloc : bool
val biabduction_worklist_mode : int
val biabduction_write_dotty : bool
val bo_debug : int
val bo_field_depth_limit : int option
val bootclasspath : string option
val buck : bool
val buck_blacklist : string list
val buck_build_args : string list
val buck_build_args_no_inline : string list
val buck_cache_mode : bool
val buck_java_flavor_suppress_config : bool
val buck_java_heap_size_gb : int option
val buck_merge_all_deps : bool
val buck_mode : IBase.BuckMode.t option
val buck_out_gen : string
val buck_targets_blacklist : string list
val call_graph_schedule : bool
val capture : bool
val capture_blacklist : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
val cfg_json : string option
val changed_files_index : string option
val check_version : string option
val clang_ast_file : [ `Biniou of string | `Yojson of string ] option
val clang_compound_literal_init_limit : int
val clang_extra_flags : string list
val clang_blacklisted_flags : string list
val clang_blacklisted_flags_with_arg : string list
val clang_frontend_action_string : string
val clang_ignore_regex : string option
val clang_isystem_to_override_regex : Str.regexp option
val clang_idirafter_to_override_regex : Str.regexp option
val clang_libcxx_include_to_override_regex : string option
val classpath : string option
val command : ATDGenerated.InferCommand.t
val config_impact_current : string option
val config_impact_data_file : string option
val config_impact_issues_tests : string option
val config_impact_max_callees_to_print : int
val config_impact_previous : string option
val continue_analysis : bool
val continue_capture : bool
val costs_current : string option
val cost_issues_tests : string option
val cost_scuba_logging : bool
val costs_previous : string option
val cost_suppress_func_ptr : bool
val cost_tests_only_autoreleasepool : bool
val cxx : bool
val cxx_scope_guards : Yojson.Basic.t
val dbwriter : bool
val deduplicate : bool
val debug_exceptions : bool
val debug_level_analysis : int
val debug_level_capture : int
val debug_level_linters : int
val debug_level_test_determinator : int
val debug_mode : bool
val default_linters : bool
val dependency_mode : bool
val developer_mode : bool
val differential_filter_files : string option
val differential_filter_set : [ `Introduced | `Fixed | `Preexisting ] list
val dotty_cfg_libs : bool
val dump_duplicate_symbols : bool
val eradicate_condition_redundant : bool
val eradicate_field_over_annotated : bool
val eradicate_return_over_annotated : bool
val eradicate_verbose : bool
val erlang_ast_dir : string option
val erlang_skip_rebar3 : bool
val fail_on_bug : bool
val fcp_apple_clang : string option
val fcp_syntax_only : bool
val file_renamings : string option
val filter_paths : bool
val filtering : bool
val force_delete_results_dir : bool
val force_integration : build_system option
val from_json_report : string
val from_json_config_impact_report : string
val from_json_costs_report : string
val frontend_stats : bool
val frontend_tests : bool
val function_pointer_specialization : bool
val generated_classes : string option
val genrule_mode : bool
val get_linter_doc_url : linter_id:string -> string option
val help_checker : IBase.Checker.t list
val help_issue_type : IBase.IssueType.t list
val hoisting_report_only_expensive : bool
val html : bool
val global_tenv : bool
val icfg_dotty_outfile : string option
val impurity_report_immutable_modifications : bool
val incremental_analysis : bool
val infer_is_clang : bool
val infer_is_javac : bool
val implicit_sdk_root : string option
val inclusive_cost : bool
val inferconfig_file : string option
val inferconfig_dir : string option
val is_checker_enabled : IBase.Checker.t -> bool
val issues_tests : string option
val issues_tests_fields : IBase.IssuesTestField.t list
val java_debug_source_file_info : string option
val java_jar_compiler : string option
val java_source_parser_experimental : bool
val java_version : int option
val javac_classes_out : string
val job_id : string option
val jobs : int
val keep_going : bool
val linter : string option
val linters_def_file : string list
val linters_def_folder : string list
val linters_developer_mode : bool
val linters_ignore_clang_failures : bool
val linters_validate_syntax_only : bool
val list_checkers : bool
val list_issue_types : bool
val liveness_dangerous_classes : Yojson.Basic.t
val liveness_ignored_constant : string list
val load_average : float option
val max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val modified_lines : string option
val no_translate_libs : bool
val nullable_annotation : string option
val nullsafe_annotation_graph : bool
val nullsafe_disable_field_not_initialized_in_nonstrict_classes : bool
val nullsafe_optimistic_third_party_in_default_mode : bool
val nullsafe_third_party_signatures : string option
val nullsafe_third_party_location_for_messaging_only : string option
val nullsafe_strict_containers : bool
val oom_threshold : int option
val only_cheap_debug : bool
val patterns_modeled_expensive : string * Yojson.Basic.t
val patterns_never_returning_null : string * Yojson.Basic.t
val patterns_skip_implementation : string * Yojson.Basic.t
val patterns_skip_translation : string * Yojson.Basic.t
val pmd_xml : bool
val print_active_checkers : bool
val print_builtins : bool
val print_jbir : bool
val print_logs : bool
val print_types : bool
val print_using_diff : bool
val procedures : bool
val procedures_attributes : bool
val procedures_cfg : bool
val procedures_definedness : bool
val procedures_filter : string option
val procedures_name : bool
val procedures_source_file : bool
val procedures_summary : bool
val procedures_summary_json : bool
val process_clang_ast : bool
val profiler_samples : string option
val progress_bar : [ `MultiLine | `Plain | `Quiet ]
val project_root : string
val pulse_cut_to_one_path_procedures_pattern : Str.regexp option
val pulse_intraprocedural_only : bool
val pulse_isl : bool
val pulse_manifest_emp : bool
val pulse_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_free_pattern : Str.regexp option
val pulse_model_malloc_pattern : Str.regexp option
val pulse_model_realloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_first_arg : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : Str.regexp option
val pulse_report_ignore_unknown_java_methods_patterns : Str.regexp option
val pulse_model_transfer_ownership_namespace : (string * string) list
val pulse_model_transfer_ownership : string list
val pulse_report_latent_issues : bool
val pulse_recency_limit : int
val pulse_widen_threshold : int
val pulse_nullsafe_report_npe : bool
val pure_by_default : bool
val quandary_endpoints : Yojson.Basic.t
val quandary_sanitizers : Yojson.Basic.t
val quandary_show_passthroughs : bool
val quandary_sinks : Yojson.Basic.t
val quandary_sources : Yojson.Basic.t
val quiet : bool
val racerd_guardedby : bool
val reactive_mode : bool
val reanalyze : bool
val relative_path_backtrack : int
val remodel_class : string option
val report : bool
val report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
val report_custom_error : bool
val report_force_relative_path : bool
val report_formatter : [ `No_formatter | `Phabricator_formatter ]
val report_path_regex_blacklist : string list
val report_path_regex_whitelist : string list
val report_previous : string option
val report_suppress_errors : string list
val reports_include_ml_loc : bool
val rest : string list
val results_dir : string
val scheduler : scheduler
val scuba_logging : bool
val scuba_normals : string IStdlib.IStd.String.Map.t
val scuba_tags : string list IStdlib.IStd.String.Map.t
val select : [ `All | `Select of int ] option
val show_buckets : bool
val siof_check_iostreams : bool
val siof_safe_methods : string list
val skip_analysis_in_path : string list
val skip_analysis_in_path_skips_compilation : bool
val skip_duplicated_types : bool
val skip_non_capture_clang_commands : bool
val skip_translation_headers : string list
val source_files : bool
val source_files_cfg : bool
val source_files_filter : string option
val source_files_freshly_captured : bool
val source_files_procedure_names : bool
val source_files_type_environment : bool
val source_preview : bool
val sourcepath : string option
val sources : string list
val sqlite_cache_size : int
val sqlite_page_size : int
val sqlite_lock_timeout : int
val sqlite_vfs : string option
val starvation_skip_analysis : Yojson.Basic.t
val starvation_strict_mode : bool
val starvation_whole_program : bool
val subtype_multirange : bool
val summaries_caches_max_size : int
val suppress_lint_ignore_types : bool
val tenv_json : string option
val test_determinator : bool
val export_changed_functions : bool
val test_filtering : bool
val testing_mode : bool
val threadsafe_aliases : Yojson.Basic.t
val topl_max_conjuncts : int
val topl_max_disjuncts : int
val topl_properties : string list
val trace_absarray : bool
val trace_error : bool
val trace_events : bool
val trace_ondemand : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val uninit_interproc : bool
val workspace : string option
val write_html : bool
val write_html_whitelist_regex : string list
val write_website : string option
val xcode_developer_dir : string option
val xcode_isysroot_suffix : string option
val xcpretty : bool
Configuration values derived from command-line options
val dynamic_dispatch : bool
val toplevel_results_dir : string
results_dir
.val is_in_custom_symbols : string -> string -> bool
val scuba_execution_id : IStdlib.IStd.Int64.t option
Global variables with initial values specified by command-line options
Module
IBase__RestartSchedulerException
Module
IBase__SourceFile
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t
module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool
val changed_sources_from_changed_files : string list -> Set.t
val invalid : string -> t
val from_abs_path : ?warn_on_error:bool -> string -> t
val create : ?warn_on_error:bool -> string -> t
val is_under_project_root : t -> bool
val of_header : ?warn_on_error:bool -> t -> t option
val pp : Stdlib.Format.formatter -> t -> unit
val to_abs_path : t -> string
val to_rel_path : t -> string
val to_string : ?force_relative:bool -> t -> string
val has_extension : t -> ext:string -> bool
module SQLite : IBase.SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IBase__SourceFile
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t
module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool
val read_config_changed_files : unit -> Set.t option
val invalid : string -> t
val from_abs_path : ?warn_on_error:bool -> string -> t
val create : ?warn_on_error:bool -> string -> t
val is_under_project_root : t -> bool
val of_header : ?warn_on_error:bool -> t -> t option
val pp : Stdlib.Format.formatter -> t -> unit
val to_abs_path : t -> string
val to_rel_path : t -> string
val to_string : ?force_relative:bool -> t -> string
val has_extension : t -> ext:string -> bool
module SQLite : IBase.SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR.BuiltinDecl
include BUILTINS.S with type t = Procname.t
type t
= Procname.t
val __array_access : t
val __assert_fail : t
val __builtin_va_arg : t
val __builtin_va_copy : t
val __builtin_va_end : t
val __builtin_va_start : t
val __builtin_offsetof : t
val __cast : t
__cast(val,typ)
implements java's typ(val)
val __cxx_typeid : t
val __delete : t
val __delete_array : t
val __delete_locked_attribute : t
val __exit : t
val __objc_bridge_transfer : t
val __get_array_length : t
val __get_type_of : t
val __global_access : t
val __infer_assume : t
val __infer_fail : t
val __infer_skip : t
val __instanceof : t
__instanceof(val,typ)
implements java's val instanceof typ
val __method_set_ignore_attribute : t
val __new : t
val __new_array : t
val __objc_alloc_no_fail : t
val __objc_dictionary_literal : t
val __placement_delete : t
val __placement_new : t
val __print_value : t
val __require_allocated_array : t
val __set_array_length : t
val __set_file_attribute : t
val __set_locked_attribute : t
val __set_mem_attribute : t
val __set_observer_attribute : t
val __set_unsubscribed_observer_attribute : t
val __set_wont_leak_attribute : t
val __split_get_nth : t
val __throw : t
val __unwrap_exception : t
val abort : t
val exit : t
val free : t
val fscanf : t
val fwscanf : t
val malloc : t
val malloc_no_fail : t
val nsArray_arrayWithObjects : t
val nsArray_arrayWithObjectsCount : t
val objc_autorelease_pool_pop : t
val objc_autorelease_pool_push : t
val objc_cpp_throw : t
val pthread_create : t
val scanf : t
val sscanf : t
val swscanf : t
val vfscanf : t
val vfwscanf : t
val vscanf : t
val vsscanf : t
val vswscanf : t
val vwscanf : t
val wscanf : t
val zero_initialization : t
val is_declared : Procname.t -> bool
val __infer_initializer_list : Procname.t
val __infer_skip_function : Procname.t
val __infer_skip_gcc_asm_stmt : Procname.t
val __infer_generic_selection_expr : Procname.t
val __atomic_fetch_max : Procname.t
val __atomic_fetch_min : Procname.t
val __atomic_fetch_nand : Procname.t
val __atomic_max_fetch : Procname.t
val __atomic_min_fetch : Procname.t
val __atomic_nand_fetch : Procname.t
val __c11_atomic_fetch_max : Procname.t
val __c11_atomic_fetch_min : Procname.t
val __opencl_atomic_fetch_max : Procname.t
val __opencl_atomic_fetch_min : Procname.t
val match_builtin : t -> 'a -> string -> bool
Module
IR.BuiltinDecl
include BUILTINS.S with type t = Procname.t
type t
= Procname.t
val __array_access : t
val __assert_fail : t
val __builtin_va_arg : t
val __builtin_va_copy : t
val __builtin_va_end : t
val __builtin_va_start : t
val __builtin_offsetof : t
val __cast : t
__cast(val,typ)
implements java's typ(val)
val __cxx_typeid : t
val __delete : t
val __delete_array : t
val __delete_locked_attribute : t
val __exit : t
val __objc_bridge_transfer : t
val __get_array_length : t
val __get_type_of : t
val __global_access : t
val __infer_assume : t
val __infer_fail : t
val __infer_skip : t
val __instanceof : t
__instanceof(val,typ)
implements java's val instanceof typ
val __method_set_ignore_attribute : t
val __new : t
val __new_array : t
val __objc_alloc_no_fail : t
val __objc_dictionary_literal : t
val __placement_delete : t
val __placement_new : t
val __print_value : t
val __require_allocated_array : t
val __set_array_length : t
val __set_file_attribute : t
val __set_locked_attribute : t
val __set_mem_attribute : t
val __set_observer_attribute : t
val __set_unsubscribed_observer_attribute : t
val __set_wont_leak_attribute : t
val __split_get_nth : t
val __throw : t
val __unwrap_exception : t
val abort : t
val exit : t
val free : t
val fscanf : t
val fwscanf : t
val malloc : t
val malloc_no_fail : t
val nsArray_arrayWithObjects : t
val nsArray_arrayWithObjectsCount : t
val objc_autorelease_pool_pop : t
val objc_autorelease_pool_push : t
val objc_cpp_throw : t
val pthread_create : t
val scanf : t
val sscanf : t
val swscanf : t
val vfscanf : t
val vfwscanf : t
val vscanf : t
val vsscanf : t
val vswscanf : t
val vwscanf : t
val wscanf : t
val zero_initialization : t
val is_declared : Procname.t -> bool
val __erlang_pattern_fail : t
val __infer_initializer_list : Procname.t
val __infer_skip_function : Procname.t
val __infer_skip_gcc_asm_stmt : Procname.t
val __infer_generic_selection_expr : Procname.t
val __atomic_fetch_max : Procname.t
val __atomic_fetch_min : Procname.t
val __atomic_fetch_nand : Procname.t
val __atomic_max_fetch : Procname.t
val __atomic_min_fetch : Procname.t
val __atomic_nand_fetch : Procname.t
val __c11_atomic_fetch_max : Procname.t
val __c11_atomic_fetch_min : Procname.t
val __opencl_atomic_fetch_max : Procname.t
val __opencl_atomic_fetch_min : Procname.t
val match_builtin : t -> 'a -> string -> bool
Module
IR.ErlangTypeName
Module
IR.Procdesc
Per-procedure CFG
module NodeKey : sig ... end
module Node : sig ... end
module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id
module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t
module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t
module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t
val append_locals : t -> ProcAttributes.var_data list -> unit
val compute_distance_to_exit_node : t -> unit
val create_node : t -> IBase.Location.t -> Node.nodekind -> Sil.instr list -> Node.t
val create_node_from_not_reversed : t -> IBase.Location.t -> Node.nodekind -> Instrs.not_reversed_t -> Node.t
val fold_instrs : t -> init:'accum -> f:('accum -> Node.t -> Sil.instr -> 'accum) -> 'accum
val find_map_instrs : t -> f:(Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : ProcAttributes.t -> t
Cfg.create_proc_desc
if you are adding a proc desc to a cfgval get_access : t -> ProcAttributes.access
val get_attributes : t -> ProcAttributes.t
val set_attributes : t -> ProcAttributes.t -> unit
val get_captured : t -> CapturedVar.t list
val get_exit_node : t -> Node.t
val get_formals : t -> (Mangled.t * Typ.t) list
val get_loc : t -> IBase.Location.t
val get_locals : t -> ProcAttributes.var_data list
val get_nodes : t -> Node.t list
val get_proc_name : t -> Procname.t
val get_ret_type : t -> Typ.t
val has_added_return_param : t -> bool
val is_ret_type_pod : t -> bool
val get_ret_var : t -> Pvar.t
val get_ret_param_var : t -> Pvar.t
val get_start_node : t -> Node.t
val get_static_callees : t -> Procname.t list
val is_defined : t -> bool
true
iff the procedure is defined, and not just declaredval is_java_synchronized : t -> bool
true
if the procedure signature has the Java synchronized keywordval is_csharp_synchronized : t -> bool
true
if the procedure is synchronized via a C# lockval is_objc_arc_on : t -> bool
true
iff the ObjC procedure is compiled with ARCval iter_instrs : (Node.t -> Sil.instr -> unit) -> t -> unit
val replace_instrs : t -> f:(Node.t -> Sil.instr -> Sil.instr) -> bool
val replace_instrs_using_context : t -> f:(Node.t -> 'a -> Sil.instr -> Sil.instr) -> update_context:('a -> Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
val replace_instrs_by_using_context : t -> f:(Node.t -> 'a -> Sil.instr -> Sil.instr array) -> update_context:('a -> Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
replace_instrs_using_context
, but slower, and each instruction may be replaced by 0, 1, or more instructions.val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit
val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit
val set_start_node : t -> Node.t -> unit
val get_wto : t -> Node.t WeakTopologicalOrder.Partition.t
val is_loop_head : t -> Node.t -> bool
val pp_signature : Stdlib.Format.formatter -> t -> unit
val pp_local : Stdlib.Format.formatter -> ProcAttributes.var_data -> unit
val is_specialized : t -> bool
val is_captured_pvar : t -> Pvar.t -> bool
val is_captured_var : t -> Var.t -> bool
val has_modify_in_block_attr : t -> Pvar.t -> bool
val shallow_copy_code_from_pdesc : orig_pdesc:t -> dest_pdesc:t -> unit
module SQLite : IBase.SqliteUtils.Data with type t = t option
val load : Procname.t -> t option
Module
IR.Procdesc
Per-procedure CFG
module NodeKey : sig ... end
module Node : sig ... end
module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id
module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t
module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t
module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t
val append_locals : t -> ProcAttributes.var_data list -> unit
val compute_distance_to_exit_node : t -> unit
val create_node : t -> IBase.Location.t -> Node.nodekind -> Sil.instr list -> Node.t
val create_node_from_not_reversed : t -> IBase.Location.t -> Node.nodekind -> Instrs.not_reversed_t -> Node.t
val fold_instrs : t -> init:'accum -> f:('accum -> Node.t -> Sil.instr -> 'accum) -> 'accum
val find_map_instrs : t -> f:(Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : ProcAttributes.t -> t
Cfg.create_proc_desc
if you are adding a proc desc to a cfgval get_access : t -> ProcAttributes.access
val get_attributes : t -> ProcAttributes.t
val set_attributes : t -> ProcAttributes.t -> unit
val get_captured : t -> CapturedVar.t list
val get_exit_node : t -> Node.t
val get_formals : t -> (Mangled.t * Typ.t) list
val get_loc : t -> IBase.Location.t
val get_locals : t -> ProcAttributes.var_data list
val get_nodes : t -> Node.t list
val get_proc_name : t -> Procname.t
val get_ret_type : t -> Typ.t
val has_added_return_param : t -> bool
val is_ret_type_pod : t -> bool
val get_ret_var : t -> Pvar.t
val get_ret_param_var : t -> Pvar.t
val get_ret_type_from_signature : t -> Typ.t
val get_start_node : t -> Node.t
val get_static_callees : t -> Procname.t list
val is_defined : t -> bool
true
iff the procedure is defined, and not just declaredval is_java_synchronized : t -> bool
true
if the procedure signature has the Java synchronized keywordval is_csharp_synchronized : t -> bool
true
if the procedure is synchronized via a C# lockval is_objc_arc_on : t -> bool
true
iff the ObjC procedure is compiled with ARCval iter_instrs : (Node.t -> Sil.instr -> unit) -> t -> unit
val replace_instrs : t -> f:(Node.t -> Sil.instr -> Sil.instr) -> bool
val replace_instrs_using_context : t -> f:(Node.t -> 'a -> Sil.instr -> Sil.instr) -> update_context:('a -> Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
val replace_instrs_by_using_context : t -> f:(Node.t -> 'a -> Sil.instr -> Sil.instr array) -> update_context:('a -> Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
replace_instrs_using_context
, but slower, and each instruction may be replaced by 0, 1, or more instructions.val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit
val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit
val set_start_node : t -> Node.t -> unit
val get_wto : t -> Node.t WeakTopologicalOrder.Partition.t
val is_loop_head : t -> Node.t -> bool
val pp_signature : Stdlib.Format.formatter -> t -> unit
val pp_local : Stdlib.Format.formatter -> ProcAttributes.var_data -> unit
val is_specialized : t -> bool
val is_captured_pvar : t -> Pvar.t -> bool
val is_captured_var : t -> Var.t -> bool
val has_modify_in_block_attr : t -> Pvar.t -> bool
val shallow_copy_code_from_pdesc : orig_pdesc:t -> dest_pdesc:t -> unit
module SQLite : IBase.SqliteUtils.Data with type t = t option
val load : Procname.t -> t option
Module
IR.Procname
module CSharp : sig ... end
module Java : sig ... end
module Parameter : sig ... end
module ObjC_Cpp : sig ... end
module C : sig ... end
module Block : sig ... end
module Erlang : sig ... end
type t
=
|
CSharp of CSharp.t
|
Java of Java.t
|
C of C.t
|
Erlang of Erlang.t
|
Linters_dummy_method
|
Block of Block.t
|
ObjC_Cpp of ObjC_Cpp.t
|
WithBlockParameters of t * Block.t list
foo(Block block) {block();}
bar() {foo(my_block)}
is executed as foo_my_block() {my_block(); }
where foo_my_block is created with WithBlockParameters (foo, my_block
)val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int
val get_class_type_name : t -> Typ.Name.t option
val get_class_name : t -> string option
val get_parameters : t -> Parameter.t list
val replace_parameters : Parameter.t list -> t -> t
val parameter_of_name : t -> Typ.Name.t -> Parameter.t
val is_java_access_method : t -> bool
val is_java_class_initializer : t -> bool
val is_java_anonymous_inner_class_method : t -> bool
val is_java_autogen_method : t -> bool
val is_objc_method : t -> bool
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
module LRUHash : IStdlib.LRUHashtbl.S with type key = t
module HashQueue : IStdlib.IStd.Hash_queue.S with type HashQueue.key = t
module Map : IStdlib.PrettyPrintable.PPMap with type PPMap.key = t
module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t
module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end
val make_java : class_name:Typ.Name.t -> return_type:Typ.t option -> method_name:string -> parameters:Typ.t list -> kind:Java.kind -> unit -> t
val make_csharp : class_name:Typ.Name.t -> return_type:Typ.t option -> method_name:string -> parameters:Typ.t list -> kind:CSharp.kind -> unit -> t
val make_objc_dealloc : Typ.Name.t -> t
val make_objc_copyWithZone : is_mutable:bool -> Typ.Name.t -> t
val empty_block : t
val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t
val get_method : t -> string
val is_objc_block : t -> bool
val is_cpp_lambda : t -> bool
val is_objc_dealloc : t -> bool
val is_objc_init : t -> bool
val is_c_method : t -> bool
val is_constructor : t -> bool
val is_csharp : t -> bool
val is_java : t -> bool
val with_block_parameters : t -> Block.t list -> t
val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool
val get_global_name_of_initializer : t -> string option
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
val describe : Stdlib.Format.formatter -> t -> unit
val replace_class : t -> Typ.Name.t -> t
val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?withclass:bool -> F.formatter -> t -> unit
val to_simplified_string : ?withclass:bool -> t -> string
val from_string_c_fun : string -> t
val replace_java_inner_class_prefix_regex : string -> string
val hashable_name : t -> string
val to_unique_id : t -> string
val to_filename : t -> string
val get_qualifiers : t -> QualifiedCppName.t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR.Procname
module CSharp : sig ... end
module Java : sig ... end
module Parameter : sig ... end
module ObjC_Cpp : sig ... end
module C : sig ... end
module Block : sig ... end
module Erlang : sig ... end
type t
=
|
CSharp of CSharp.t
|
Java of Java.t
|
C of C.t
|
Erlang of Erlang.t
|
Linters_dummy_method
|
Block of Block.t
|
ObjC_Cpp of ObjC_Cpp.t
|
WithBlockParameters of t * Block.t list
foo(Block block) {block();}
bar() {foo(my_block)}
is executed as foo_my_block() {my_block(); }
where foo_my_block is created with WithBlockParameters (foo, my_block
)val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int
val get_class_type_name : t -> Typ.Name.t option
val get_class_name : t -> string option
val get_parameters : t -> Parameter.t list
val replace_parameters : Parameter.t list -> t -> t
val parameter_of_name : t -> Typ.Name.t -> Parameter.t
val is_java_access_method : t -> bool
val is_java_class_initializer : t -> bool
val is_java_anonymous_inner_class_method : t -> bool
val is_java_autogen_method : t -> bool
val is_objc_method : t -> bool
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
module LRUHash : IStdlib.LRUHashtbl.S with type key = t
module HashQueue : IStdlib.IStd.Hash_queue.S with type HashQueue.key = t
module Map : IStdlib.PrettyPrintable.PPMap with type PPMap.key = t
module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t
module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end
val make_java : class_name:Typ.Name.t -> return_type:Typ.t option -> method_name:string -> parameters:Typ.t list -> kind:Java.kind -> t
val make_csharp : class_name:Typ.Name.t -> return_type:Typ.t option -> method_name:string -> parameters:Typ.t list -> kind:CSharp.kind -> t
val make_erlang : module_name:string -> function_name:string -> arity:int -> t
val make_objc_dealloc : Typ.Name.t -> t
val make_objc_copyWithZone : is_mutable:bool -> Typ.Name.t -> t
val empty_block : t
val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t
val get_method : t -> string
val is_objc_block : t -> bool
val is_cpp_lambda : t -> bool
val is_objc_dealloc : t -> bool
val is_objc_init : t -> bool
val is_c_method : t -> bool
val is_constructor : t -> bool
val is_csharp : t -> bool
val is_java : t -> bool
val with_block_parameters : t -> Block.t list -> t
val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool
val get_global_name_of_initializer : t -> string option
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
val describe : Stdlib.Format.formatter -> t -> unit
val replace_class : t -> Typ.Name.t -> t
val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?withclass:bool -> F.formatter -> t -> unit
val to_simplified_string : ?withclass:bool -> t -> string
val from_string_c_fun : string -> t
val replace_java_inner_class_prefix_regex : string -> string
val hashable_name : t -> string
val to_unique_id : t -> string
val to_filename : t -> string
val get_qualifiers : t -> QualifiedCppName.t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR.Typ
module IntegerWidths : sig ... end
type ikind
=
val equal_ikind : ikind -> ikind -> bool
val width_of_ikind : IntegerWidths.t -> ikind -> int
val range_of_ikind : IntegerWidths.t -> ikind -> Z.t * Z.t
val ikind_is_char : ikind -> bool
val ikind_is_unsigned : ikind -> bool
type ptr_kind
=
val compare_type_quals : type_quals -> type_quals -> int
val mk_type_quals : ?default:type_quals -> ?is_const:bool -> ?is_restrict:bool -> ?is_volatile:bool -> unit -> type_quals
val is_const : type_quals -> bool
val is_restrict : type_quals -> bool
val is_volatile : type_quals -> bool
type t
=
{
desc : desc;
quals : type_quals;
}
and desc
=
|
Tint of ikind
|
Tfloat of fkind
|
Tvoid
|
Tfun
|
Tptr of t * ptr_kind
|
Tstruct of name
|
TVar of string
|
Tarray of
{
elt : t;
length : IntLit.t option;
stride : IntLit.t option;
}
and name
=
|
CStruct of QualifiedCppName.t
|
CUnion of QualifiedCppName.t
|
CppClass of
{
name : QualifiedCppName.t;
template_spec_info : template_spec_info;
is_union : bool;
}
|
CSharpClass of CSharpClassName.t
|
JavaClass of JavaClassName.t
|
ObjcClass of QualifiedCppName.t * name list
|
ObjcProtocol of QualifiedCppName.t
and template_arg
=
|
TType of t
|
TInt of IStdlib.IStd.Int64.t
|
TNull
|
TNullPtr
|
TOpaque
and template_spec_info
=
|
NoTemplate
|
Template of
{
mangled : string option;
sub_type
and sub_tname
, mangling is not guaranteed to be unique to a single type. All the information in the template arguments is also needed for uniqueness.args : template_arg list;
}
val compare : t -> t -> int
val compare_desc : desc -> desc -> int
val compare_name : name -> name -> int
val compare_template_arg : template_arg -> template_arg -> int
val compare_template_spec_info : template_spec_info -> template_spec_info -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_desc : desc -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_name : name -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_arg : template_arg -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_spec_info : template_spec_info -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp_template_spec_info : IStdlib.Pp.env -> F.formatter -> template_spec_info -> unit
val mk : ?default:t -> ?quals:type_quals -> desc -> t
default
is passed then use its value to set other fields such as qualsval mk_array : ?default:t -> ?quals:type_quals -> ?length:IntLit.t -> ?stride:IntLit.t -> t -> t
length
or stride
value is given, use them as static length and size.val mk_struct : name -> t
val mk_ptr : ?ptr_kind:ptr_kind -> t -> t
t
, default kind is Pk_pointer
val size_t : ikind
module Name : sig ... end
val equal_desc : desc -> desc -> bool
val equal_name : name -> name -> bool
val equal_quals : type_quals -> type_quals -> bool
val equal_ignore_quals : t -> t -> bool
val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit
val pp_java : verbose:bool -> F.formatter -> t -> unit
val pp_cs : verbose:bool -> F.formatter -> t -> unit
val pp_protocols : IStdlib.Pp.env -> F.formatter -> name list -> unit
val to_string : t -> string
val desc_to_string : desc -> string
val d_full : t -> unit
val d_list : t list -> unit
val array_elem : t option -> t -> t
val is_objc_class : t -> bool
val is_cpp_class : t -> bool
val is_pointer_to_cpp_class : t -> bool
val is_pointer_to_objc_non_tagged_class : t -> bool
val is_pointer_to_void : t -> bool
val is_void : t -> bool
val is_pointer_to_int : t -> bool
val is_pointer_to_function : t -> bool
val is_pointer : t -> bool
val is_reference : t -> bool
val is_struct : t -> bool
val is_int : t -> bool
val is_unsigned_int : t -> bool
val is_char : t -> bool
val is_csharp_type : t -> bool
t
a type produced by the Java frontend?val is_java_primitive_type : t -> bool
t
a primitive type produced by the Java frontend?val is_java_type : t -> bool
t
a type produced by the Java frontend?module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR.Typ
module IntegerWidths : sig ... end
type ikind
=
val equal_ikind : ikind -> ikind -> bool
val width_of_ikind : IntegerWidths.t -> ikind -> int
val range_of_ikind : IntegerWidths.t -> ikind -> Z.t * Z.t
val ikind_is_char : ikind -> bool
val ikind_is_unsigned : ikind -> bool
type ptr_kind
=
val compare_type_quals : type_quals -> type_quals -> int
val mk_type_quals : ?default:type_quals -> ?is_const:bool -> ?is_restrict:bool -> ?is_volatile:bool -> unit -> type_quals
val is_const : type_quals -> bool
val is_restrict : type_quals -> bool
val is_volatile : type_quals -> bool
type t
=
{
desc : desc;
quals : type_quals;
}
and desc
=
|
Tint of ikind
|
Tfloat of fkind
|
Tvoid
|
Tfun
|
Tptr of t * ptr_kind
|
Tstruct of name
|
TVar of string
|
Tarray of
{
elt : t;
length : IntLit.t option;
stride : IntLit.t option;
}
and name
=
|
CStruct of QualifiedCppName.t
|
CUnion of QualifiedCppName.t
|
CppClass of
{
name : QualifiedCppName.t;
template_spec_info : template_spec_info;
is_union : bool;
}
|
CSharpClass of CSharpClassName.t
|
ErlangType of ErlangTypeName.t
|
JavaClass of JavaClassName.t
|
ObjcClass of QualifiedCppName.t * name list
|
ObjcProtocol of QualifiedCppName.t
and template_arg
=
|
TType of t
|
TInt of IStdlib.IStd.Int64.t
|
TNull
|
TNullPtr
|
TOpaque
and template_spec_info
=
|
NoTemplate
|
Template of
{
mangled : string option;
sub_type
and sub_tname
, mangling is not guaranteed to be unique to a single type. All the information in the template arguments is also needed for uniqueness.args : template_arg list;
}
val compare : t -> t -> int
val compare_desc : desc -> desc -> int
val compare_name : name -> name -> int
val compare_template_arg : template_arg -> template_arg -> int
val compare_template_spec_info : template_spec_info -> template_spec_info -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_desc : desc -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_name : name -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_arg : template_arg -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_spec_info : template_spec_info -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp_template_spec_info : IStdlib.Pp.env -> F.formatter -> template_spec_info -> unit
val mk : ?default:t -> ?quals:type_quals -> desc -> t
default
is passed then use its value to set other fields such as qualsval mk_array : ?default:t -> ?quals:type_quals -> ?length:IntLit.t -> ?stride:IntLit.t -> t -> t
length
or stride
value is given, use them as static length and size.val mk_struct : name -> t
val mk_ptr : ?ptr_kind:ptr_kind -> t -> t
t
, default kind is Pk_pointer
val size_t : ikind
module Name : sig ... end
val equal_desc : desc -> desc -> bool
val equal_name : name -> name -> bool
val equal_quals : type_quals -> type_quals -> bool
val equal_ignore_quals : t -> t -> bool
val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit
val pp_java : verbose:bool -> F.formatter -> t -> unit
val pp_cs : verbose:bool -> F.formatter -> t -> unit
val pp_protocols : IStdlib.Pp.env -> F.formatter -> name list -> unit
val to_string : t -> string
val desc_to_string : desc -> string
val d_full : t -> unit
val d_list : t list -> unit
val array_elem : t option -> t -> t
val is_objc_class : t -> bool
val is_cpp_class : t -> bool
val is_pointer_to_cpp_class : t -> bool
val is_pointer_to_objc_non_tagged_class : t -> bool
val is_pointer_to_void : t -> bool
val is_void : t -> bool
val is_pointer_to_int : t -> bool
val is_pointer_to_function : t -> bool
val is_pointer : t -> bool
val is_reference : t -> bool
val is_struct : t -> bool
val is_int : t -> bool
val is_unsigned_int : t -> bool
val is_char : t -> bool
val is_csharp_type : t -> bool
t
a type produced by the Java frontend?val is_java_primitive_type : t -> bool
t
a primitive type produced by the Java frontend?val is_java_type : t -> bool
t
a type produced by the Java frontend?module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR
module Annot : sig ... end
module Attributes : sig ... end
module BUILTINS : sig ... end
module BiabductionModels : sig ... end
module Binop : sig ... end
module BuiltinDecl : sig ... end
module CSharpClassName : sig ... end
module CallFlags : sig ... end
module CapturedVar : sig ... end
module Cfg : sig ... end
module ClangMethodKind : sig ... end
module Const : sig ... end
module DecompiledExp : sig ... end
module DotCfg : sig ... end
module Exp : sig ... end
module Fieldname : sig ... end
module Filtering : sig ... end
module Ident : sig ... end
module Inferconfig : sig ... end
module Instrs : sig ... end
module IntLit : sig ... end
module Io_infer : sig ... end
module JConfig : sig ... end
module JavaClassName : sig ... end
module Mangled : sig ... end
module ObjCDispatchModels : sig ... end
module PredSymb : sig ... end
module ProcAttributes : sig ... end
module Procdesc : sig ... end
module Procname : sig ... end
module Pvar : sig ... end
module QualifiedCppName : sig ... end
module Sil : sig ... end
module SourceFiles : sig ... end
module SpecializeProcdesc : sig ... end
module StdTyp : sig ... end
module Struct : sig ... end
module Subtype : sig ... end
module Tenv : sig ... end
module Typ : sig ... end
module Unop : sig ... end
module Var : sig ... end
module WeakTopologicalOrder : sig ... end
Module
IR
module Annot : sig ... end
module Attributes : sig ... end
module BUILTINS : sig ... end
module BiabductionModels : sig ... end
module Binop : sig ... end
module BuiltinDecl : sig ... end
module CSharpClassName : sig ... end
module CallFlags : sig ... end
module CapturedVar : sig ... end
module Cfg : sig ... end
module ClangMethodKind : sig ... end
module Const : sig ... end
module DecompiledExp : sig ... end
module DotCfg : sig ... end
module ErlangTypeName : sig ... end
module Exp : sig ... end
module Fieldname : sig ... end
module Filtering : sig ... end
module Ident : sig ... end
module Inferconfig : sig ... end
module Instrs : sig ... end
module IntLit : sig ... end
module Io_infer : sig ... end
module JConfig : sig ... end
module JavaClassName : sig ... end
module Mangled : sig ... end
module ObjCDispatchModels : sig ... end
module PredSymb : sig ... end
module ProcAttributes : sig ... end
module Procdesc : sig ... end
module Procname : sig ... end
module Pvar : sig ... end
module QualifiedCppName : sig ... end
module Sil : sig ... end
module SourceFiles : sig ... end
module SpecializeProcdesc : sig ... end
module StdTyp : sig ... end
module Struct : sig ... end
module Subtype : sig ... end
module Tenv : sig ... end
module Typ : sig ... end
module Unop : sig ... end
module Var : sig ... end
module WeakTopologicalOrder : sig ... end
Module
IR__BuiltinDecl
include IR.BUILTINS.S with type t = IR.Procname.t
type t
= IR.Procname.t
val __array_access : t
val __assert_fail : t
val __builtin_va_arg : t
val __builtin_va_copy : t
val __builtin_va_end : t
val __builtin_va_start : t
val __builtin_offsetof : t
val __cast : t
__cast(val,typ)
implements java's typ(val)
val __cxx_typeid : t
val __delete : t
val __delete_array : t
val __delete_locked_attribute : t
val __exit : t
val __objc_bridge_transfer : t
val __get_array_length : t
val __get_type_of : t
val __global_access : t
val __infer_assume : t
val __infer_fail : t
val __infer_skip : t
val __instanceof : t
__instanceof(val,typ)
implements java's val instanceof typ
val __method_set_ignore_attribute : t
val __new : t
val __new_array : t
val __objc_alloc_no_fail : t
val __objc_dictionary_literal : t
val __placement_delete : t
val __placement_new : t
val __print_value : t
val __require_allocated_array : t
val __set_array_length : t
val __set_file_attribute : t
val __set_locked_attribute : t
val __set_mem_attribute : t
val __set_observer_attribute : t
val __set_unsubscribed_observer_attribute : t
val __set_wont_leak_attribute : t
val __split_get_nth : t
val __throw : t
val __unwrap_exception : t
val abort : t
val exit : t
val free : t
val fscanf : t
val fwscanf : t
val malloc : t
val malloc_no_fail : t
val nsArray_arrayWithObjects : t
val nsArray_arrayWithObjectsCount : t
val objc_autorelease_pool_pop : t
val objc_autorelease_pool_push : t
val objc_cpp_throw : t
val pthread_create : t
val scanf : t
val sscanf : t
val swscanf : t
val vfscanf : t
val vfwscanf : t
val vscanf : t
val vsscanf : t
val vswscanf : t
val vwscanf : t
val wscanf : t
val zero_initialization : t
val is_declared : IR.Procname.t -> bool
val __infer_initializer_list : IR.Procname.t
val __infer_skip_function : IR.Procname.t
val __infer_skip_gcc_asm_stmt : IR.Procname.t
val __infer_generic_selection_expr : IR.Procname.t
val __atomic_fetch_max : IR.Procname.t
val __atomic_fetch_min : IR.Procname.t
val __atomic_fetch_nand : IR.Procname.t
val __atomic_max_fetch : IR.Procname.t
val __atomic_min_fetch : IR.Procname.t
val __atomic_nand_fetch : IR.Procname.t
val __c11_atomic_fetch_max : IR.Procname.t
val __c11_atomic_fetch_min : IR.Procname.t
val __opencl_atomic_fetch_max : IR.Procname.t
val __opencl_atomic_fetch_min : IR.Procname.t
val match_builtin : t -> 'a -> string -> bool
Module
IR__BuiltinDecl
include IR.BUILTINS.S with type t = IR.Procname.t
type t
= IR.Procname.t
val __array_access : t
val __assert_fail : t
val __builtin_va_arg : t
val __builtin_va_copy : t
val __builtin_va_end : t
val __builtin_va_start : t
val __builtin_offsetof : t
val __cast : t
__cast(val,typ)
implements java's typ(val)
val __cxx_typeid : t
val __delete : t
val __delete_array : t
val __delete_locked_attribute : t
val __exit : t
val __objc_bridge_transfer : t
val __get_array_length : t
val __get_type_of : t
val __global_access : t
val __infer_assume : t
val __infer_fail : t
val __infer_skip : t
val __instanceof : t
__instanceof(val,typ)
implements java's val instanceof typ
val __method_set_ignore_attribute : t
val __new : t
val __new_array : t
val __objc_alloc_no_fail : t
val __objc_dictionary_literal : t
val __placement_delete : t
val __placement_new : t
val __print_value : t
val __require_allocated_array : t
val __set_array_length : t
val __set_file_attribute : t
val __set_locked_attribute : t
val __set_mem_attribute : t
val __set_observer_attribute : t
val __set_unsubscribed_observer_attribute : t
val __set_wont_leak_attribute : t
val __split_get_nth : t
val __throw : t
val __unwrap_exception : t
val abort : t
val exit : t
val free : t
val fscanf : t
val fwscanf : t
val malloc : t
val malloc_no_fail : t
val nsArray_arrayWithObjects : t
val nsArray_arrayWithObjectsCount : t
val objc_autorelease_pool_pop : t
val objc_autorelease_pool_push : t
val objc_cpp_throw : t
val pthread_create : t
val scanf : t
val sscanf : t
val swscanf : t
val vfscanf : t
val vfwscanf : t
val vscanf : t
val vsscanf : t
val vswscanf : t
val vwscanf : t
val wscanf : t
val zero_initialization : t
val is_declared : IR.Procname.t -> bool
val __erlang_pattern_fail : t
val __infer_initializer_list : IR.Procname.t
val __infer_skip_function : IR.Procname.t
val __infer_skip_gcc_asm_stmt : IR.Procname.t
val __infer_generic_selection_expr : IR.Procname.t
val __atomic_fetch_max : IR.Procname.t
val __atomic_fetch_min : IR.Procname.t
val __atomic_fetch_nand : IR.Procname.t
val __atomic_max_fetch : IR.Procname.t
val __atomic_min_fetch : IR.Procname.t
val __atomic_nand_fetch : IR.Procname.t
val __c11_atomic_fetch_max : IR.Procname.t
val __c11_atomic_fetch_min : IR.Procname.t
val __opencl_atomic_fetch_max : IR.Procname.t
val __opencl_atomic_fetch_min : IR.Procname.t
val match_builtin : t -> 'a -> string -> bool
Module
IR__ErlangTypeName
Module
IR__Procdesc
Per-procedure CFG
module NodeKey : sig ... end
module Node : sig ... end
module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id
module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t
module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t
module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t
val append_locals : t -> IR.ProcAttributes.var_data list -> unit
val compute_distance_to_exit_node : t -> unit
val create_node : t -> IBase.Location.t -> Node.nodekind -> IR.Sil.instr list -> Node.t
val create_node_from_not_reversed : t -> IBase.Location.t -> Node.nodekind -> IR.Instrs.not_reversed_t -> Node.t
val fold_instrs : t -> init:'accum -> f:('accum -> Node.t -> IR.Sil.instr -> 'accum) -> 'accum
val find_map_instrs : t -> f:(IR.Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : IR.ProcAttributes.t -> t
Cfg.create_proc_desc
if you are adding a proc desc to a cfgval get_access : t -> IR.ProcAttributes.access
val get_attributes : t -> IR.ProcAttributes.t
val set_attributes : t -> IR.ProcAttributes.t -> unit
val get_captured : t -> IR.CapturedVar.t list
val get_exit_node : t -> Node.t
val get_formals : t -> (IR.Mangled.t * IR.Typ.t) list
val get_loc : t -> IBase.Location.t
val get_locals : t -> IR.ProcAttributes.var_data list
val get_nodes : t -> Node.t list
val get_proc_name : t -> IR.Procname.t
val get_ret_type : t -> IR.Typ.t
val has_added_return_param : t -> bool
val is_ret_type_pod : t -> bool
val get_ret_var : t -> IR.Pvar.t
val get_ret_param_var : t -> IR.Pvar.t
val get_start_node : t -> Node.t
val get_static_callees : t -> IR.Procname.t list
val is_defined : t -> bool
true
iff the procedure is defined, and not just declaredval is_java_synchronized : t -> bool
true
if the procedure signature has the Java synchronized keywordval is_csharp_synchronized : t -> bool
true
if the procedure is synchronized via a C# lockval is_objc_arc_on : t -> bool
true
iff the ObjC procedure is compiled with ARCval iter_instrs : (Node.t -> IR.Sil.instr -> unit) -> t -> unit
val replace_instrs : t -> f:(Node.t -> IR.Sil.instr -> IR.Sil.instr) -> bool
val replace_instrs_using_context : t -> f:(Node.t -> 'a -> IR.Sil.instr -> IR.Sil.instr) -> update_context:('a -> IR.Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
val replace_instrs_by_using_context : t -> f:(Node.t -> 'a -> IR.Sil.instr -> IR.Sil.instr array) -> update_context:('a -> IR.Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
replace_instrs_using_context
, but slower, and each instruction may be replaced by 0, 1, or more instructions.val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit
val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit
val set_start_node : t -> Node.t -> unit
val get_wto : t -> Node.t IR.WeakTopologicalOrder.Partition.t
val is_loop_head : t -> Node.t -> bool
val pp_signature : Stdlib.Format.formatter -> t -> unit
val pp_local : Stdlib.Format.formatter -> IR.ProcAttributes.var_data -> unit
val is_specialized : t -> bool
val is_captured_pvar : t -> IR.Pvar.t -> bool
val is_captured_var : t -> IR.Var.t -> bool
val has_modify_in_block_attr : t -> IR.Pvar.t -> bool
val shallow_copy_code_from_pdesc : orig_pdesc:t -> dest_pdesc:t -> unit
module SQLite : IBase.SqliteUtils.Data with type t = t option
val load : IR.Procname.t -> t option
Module
IR__Procdesc
Per-procedure CFG
module NodeKey : sig ... end
module Node : sig ... end
module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id
module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t
module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t
module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t
val append_locals : t -> IR.ProcAttributes.var_data list -> unit
val compute_distance_to_exit_node : t -> unit
val create_node : t -> IBase.Location.t -> Node.nodekind -> IR.Sil.instr list -> Node.t
val create_node_from_not_reversed : t -> IBase.Location.t -> Node.nodekind -> IR.Instrs.not_reversed_t -> Node.t
val fold_instrs : t -> init:'accum -> f:('accum -> Node.t -> IR.Sil.instr -> 'accum) -> 'accum
val find_map_instrs : t -> f:(IR.Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : IR.ProcAttributes.t -> t
Cfg.create_proc_desc
if you are adding a proc desc to a cfgval get_access : t -> IR.ProcAttributes.access
val get_attributes : t -> IR.ProcAttributes.t
val set_attributes : t -> IR.ProcAttributes.t -> unit
val get_captured : t -> IR.CapturedVar.t list
val get_exit_node : t -> Node.t
val get_formals : t -> (IR.Mangled.t * IR.Typ.t) list
val get_loc : t -> IBase.Location.t
val get_locals : t -> IR.ProcAttributes.var_data list
val get_nodes : t -> Node.t list
val get_proc_name : t -> IR.Procname.t
val get_ret_type : t -> IR.Typ.t
val has_added_return_param : t -> bool
val is_ret_type_pod : t -> bool
val get_ret_var : t -> IR.Pvar.t
val get_ret_param_var : t -> IR.Pvar.t
val get_ret_type_from_signature : t -> IR.Typ.t
val get_start_node : t -> Node.t
val get_static_callees : t -> IR.Procname.t list
val is_defined : t -> bool
true
iff the procedure is defined, and not just declaredval is_java_synchronized : t -> bool
true
if the procedure signature has the Java synchronized keywordval is_csharp_synchronized : t -> bool
true
if the procedure is synchronized via a C# lockval is_objc_arc_on : t -> bool
true
iff the ObjC procedure is compiled with ARCval iter_instrs : (Node.t -> IR.Sil.instr -> unit) -> t -> unit
val replace_instrs : t -> f:(Node.t -> IR.Sil.instr -> IR.Sil.instr) -> bool
val replace_instrs_using_context : t -> f:(Node.t -> 'a -> IR.Sil.instr -> IR.Sil.instr) -> update_context:('a -> IR.Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
val replace_instrs_by_using_context : t -> f:(Node.t -> 'a -> IR.Sil.instr -> IR.Sil.instr array) -> update_context:('a -> IR.Sil.instr -> 'a) -> context_at_node:(Node.t -> 'a) -> bool
replace_instrs_using_context
, but slower, and each instruction may be replaced by 0, 1, or more instructions.val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum
val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit
val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit
val set_start_node : t -> Node.t -> unit
val get_wto : t -> Node.t IR.WeakTopologicalOrder.Partition.t
val is_loop_head : t -> Node.t -> bool
val pp_signature : Stdlib.Format.formatter -> t -> unit
val pp_local : Stdlib.Format.formatter -> IR.ProcAttributes.var_data -> unit
val is_specialized : t -> bool
val is_captured_pvar : t -> IR.Pvar.t -> bool
val is_captured_var : t -> IR.Var.t -> bool
val has_modify_in_block_attr : t -> IR.Pvar.t -> bool
val shallow_copy_code_from_pdesc : orig_pdesc:t -> dest_pdesc:t -> unit
module SQLite : IBase.SqliteUtils.Data with type t = t option
val load : IR.Procname.t -> t option
Module
IR__Procname
module CSharp : sig ... end
module Java : sig ... end
module Parameter : sig ... end
module ObjC_Cpp : sig ... end
module C : sig ... end
module Block : sig ... end
module Erlang : sig ... end
type t
=
|
CSharp of CSharp.t
|
Java of Java.t
|
C of C.t
|
Erlang of Erlang.t
|
Linters_dummy_method
|
Block of Block.t
|
ObjC_Cpp of ObjC_Cpp.t
|
WithBlockParameters of t * Block.t list
foo(Block block) {block();}
bar() {foo(my_block)}
is executed as foo_my_block() {my_block(); }
where foo_my_block is created with WithBlockParameters (foo, my_block
)val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int
val get_class_type_name : t -> IR.Typ.Name.t option
val get_class_name : t -> string option
val get_parameters : t -> Parameter.t list
val replace_parameters : Parameter.t list -> t -> t
val parameter_of_name : t -> IR.Typ.Name.t -> Parameter.t
val is_java_access_method : t -> bool
val is_java_class_initializer : t -> bool
val is_java_anonymous_inner_class_method : t -> bool
val is_java_autogen_method : t -> bool
val is_objc_method : t -> bool
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
module LRUHash : IStdlib.LRUHashtbl.S with type key = t
module HashQueue : IStdlib.IStd.Hash_queue.S with type HashQueue.key = t
module Map : IStdlib.PrettyPrintable.PPMap with type PPMap.key = t
module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t
module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end
val make_java : class_name:IR.Typ.Name.t -> return_type:IR.Typ.t option -> method_name:string -> parameters:IR.Typ.t list -> kind:Java.kind -> unit -> t
val make_csharp : class_name:IR.Typ.Name.t -> return_type:IR.Typ.t option -> method_name:string -> parameters:IR.Typ.t list -> kind:CSharp.kind -> unit -> t
val make_objc_dealloc : IR.Typ.Name.t -> t
val make_objc_copyWithZone : is_mutable:bool -> IR.Typ.Name.t -> t
val empty_block : t
val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t
val get_method : t -> string
val is_objc_block : t -> bool
val is_cpp_lambda : t -> bool
val is_objc_dealloc : t -> bool
val is_objc_init : t -> bool
val is_c_method : t -> bool
val is_constructor : t -> bool
val is_csharp : t -> bool
val is_java : t -> bool
val with_block_parameters : t -> Block.t list -> t
val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool
val get_global_name_of_initializer : t -> string option
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
val describe : Stdlib.Format.formatter -> t -> unit
val replace_class : t -> IR.Typ.Name.t -> t
val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?withclass:bool -> F.formatter -> t -> unit
val to_simplified_string : ?withclass:bool -> t -> string
val from_string_c_fun : string -> t
val replace_java_inner_class_prefix_regex : string -> string
val hashable_name : t -> string
val to_unique_id : t -> string
val to_filename : t -> string
val get_qualifiers : t -> IR.QualifiedCppName.t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR__Procname
module CSharp : sig ... end
module Java : sig ... end
module Parameter : sig ... end
module ObjC_Cpp : sig ... end
module C : sig ... end
module Block : sig ... end
module Erlang : sig ... end
type t
=
|
CSharp of CSharp.t
|
Java of Java.t
|
C of C.t
|
Erlang of Erlang.t
|
Linters_dummy_method
|
Block of Block.t
|
ObjC_Cpp of ObjC_Cpp.t
|
WithBlockParameters of t * Block.t list
foo(Block block) {block();}
bar() {foo(my_block)}
is executed as foo_my_block() {my_block(); }
where foo_my_block is created with WithBlockParameters (foo, my_block
)val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int
val get_class_type_name : t -> IR.Typ.Name.t option
val get_class_name : t -> string option
val get_parameters : t -> Parameter.t list
val replace_parameters : Parameter.t list -> t -> t
val parameter_of_name : t -> IR.Typ.Name.t -> Parameter.t
val is_java_access_method : t -> bool
val is_java_class_initializer : t -> bool
val is_java_anonymous_inner_class_method : t -> bool
val is_java_autogen_method : t -> bool
val is_objc_method : t -> bool
module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
module LRUHash : IStdlib.LRUHashtbl.S with type key = t
module HashQueue : IStdlib.IStd.Hash_queue.S with type HashQueue.key = t
module Map : IStdlib.PrettyPrintable.PPMap with type PPMap.key = t
module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t
module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end
val make_java : class_name:IR.Typ.Name.t -> return_type:IR.Typ.t option -> method_name:string -> parameters:IR.Typ.t list -> kind:Java.kind -> t
val make_csharp : class_name:IR.Typ.Name.t -> return_type:IR.Typ.t option -> method_name:string -> parameters:IR.Typ.t list -> kind:CSharp.kind -> t
val make_erlang : module_name:string -> function_name:string -> arity:int -> t
val make_objc_dealloc : IR.Typ.Name.t -> t
val make_objc_copyWithZone : is_mutable:bool -> IR.Typ.Name.t -> t
val empty_block : t
val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t
val get_method : t -> string
val is_objc_block : t -> bool
val is_cpp_lambda : t -> bool
val is_objc_dealloc : t -> bool
val is_objc_init : t -> bool
val is_c_method : t -> bool
val is_constructor : t -> bool
val is_csharp : t -> bool
val is_java : t -> bool
val with_block_parameters : t -> Block.t list -> t
val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool
val get_global_name_of_initializer : t -> string option
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
val describe : Stdlib.Format.formatter -> t -> unit
val replace_class : t -> IR.Typ.Name.t -> t
val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?withclass:bool -> F.formatter -> t -> unit
val to_simplified_string : ?withclass:bool -> t -> string
val from_string_c_fun : string -> t
val replace_java_inner_class_prefix_regex : string -> string
val hashable_name : t -> string
val to_unique_id : t -> string
val to_filename : t -> string
val get_qualifiers : t -> IR.QualifiedCppName.t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR__Typ
module IntegerWidths : sig ... end
type ikind
=
val equal_ikind : ikind -> ikind -> bool
val width_of_ikind : IntegerWidths.t -> ikind -> int
val range_of_ikind : IntegerWidths.t -> ikind -> Z.t * Z.t
val ikind_is_char : ikind -> bool
val ikind_is_unsigned : ikind -> bool
type ptr_kind
=
val compare_type_quals : type_quals -> type_quals -> int
val mk_type_quals : ?default:type_quals -> ?is_const:bool -> ?is_restrict:bool -> ?is_volatile:bool -> unit -> type_quals
val is_const : type_quals -> bool
val is_restrict : type_quals -> bool
val is_volatile : type_quals -> bool
type t
=
{
desc : desc;
quals : type_quals;
}
and desc
=
|
Tint of ikind
|
Tfloat of fkind
|
Tvoid
|
Tfun
|
Tptr of t * ptr_kind
|
Tstruct of name
|
TVar of string
|
Tarray of
{
elt : t;
length : IR.IntLit.t option;
stride : IR.IntLit.t option;
}
and name
=
|
CStruct of IR.QualifiedCppName.t
|
CUnion of IR.QualifiedCppName.t
|
CppClass of
{
name : IR.QualifiedCppName.t;
template_spec_info : template_spec_info;
is_union : bool;
}
|
CSharpClass of IR.CSharpClassName.t
|
JavaClass of IR.JavaClassName.t
|
ObjcClass of IR.QualifiedCppName.t * name list
|
ObjcProtocol of IR.QualifiedCppName.t
and template_arg
=
|
TType of t
|
TInt of IStdlib.IStd.Int64.t
|
TNull
|
TNullPtr
|
TOpaque
and template_spec_info
=
|
NoTemplate
|
Template of
{
mangled : string option;
sub_type
and sub_tname
, mangling is not guaranteed to be unique to a single type. All the information in the template arguments is also needed for uniqueness.args : template_arg list;
}
val compare : t -> t -> int
val compare_desc : desc -> desc -> int
val compare_name : name -> name -> int
val compare_template_arg : template_arg -> template_arg -> int
val compare_template_spec_info : template_spec_info -> template_spec_info -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_desc : desc -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_name : name -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_arg : template_arg -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_spec_info : template_spec_info -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp_template_spec_info : IStdlib.Pp.env -> F.formatter -> template_spec_info -> unit
val mk : ?default:t -> ?quals:type_quals -> desc -> t
default
is passed then use its value to set other fields such as qualsval mk_array : ?default:t -> ?quals:type_quals -> ?length:IR.IntLit.t -> ?stride:IR.IntLit.t -> t -> t
length
or stride
value is given, use them as static length and size.val mk_struct : name -> t
val mk_ptr : ?ptr_kind:ptr_kind -> t -> t
t
, default kind is Pk_pointer
val size_t : ikind
module Name : sig ... end
val equal_desc : desc -> desc -> bool
val equal_name : name -> name -> bool
val equal_quals : type_quals -> type_quals -> bool
val equal_ignore_quals : t -> t -> bool
val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit
val pp_java : verbose:bool -> F.formatter -> t -> unit
val pp_cs : verbose:bool -> F.formatter -> t -> unit
val pp_protocols : IStdlib.Pp.env -> F.formatter -> name list -> unit
val to_string : t -> string
val desc_to_string : desc -> string
val d_full : t -> unit
val d_list : t list -> unit
val array_elem : t option -> t -> t
val is_objc_class : t -> bool
val is_cpp_class : t -> bool
val is_pointer_to_cpp_class : t -> bool
val is_pointer_to_objc_non_tagged_class : t -> bool
val is_pointer_to_void : t -> bool
val is_void : t -> bool
val is_pointer_to_int : t -> bool
val is_pointer_to_function : t -> bool
val is_pointer : t -> bool
val is_reference : t -> bool
val is_struct : t -> bool
val is_int : t -> bool
val is_unsigned_int : t -> bool
val is_char : t -> bool
val is_csharp_type : t -> bool
t
a type produced by the Java frontend?val is_java_primitive_type : t -> bool
t
a primitive type produced by the Java frontend?val is_java_type : t -> bool
t
a type produced by the Java frontend?module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
IR__Typ
module IntegerWidths : sig ... end
type ikind
=
val equal_ikind : ikind -> ikind -> bool
val width_of_ikind : IntegerWidths.t -> ikind -> int
val range_of_ikind : IntegerWidths.t -> ikind -> Z.t * Z.t
val ikind_is_char : ikind -> bool
val ikind_is_unsigned : ikind -> bool
type ptr_kind
=
val compare_type_quals : type_quals -> type_quals -> int
val mk_type_quals : ?default:type_quals -> ?is_const:bool -> ?is_restrict:bool -> ?is_volatile:bool -> unit -> type_quals
val is_const : type_quals -> bool
val is_restrict : type_quals -> bool
val is_volatile : type_quals -> bool
type t
=
{
desc : desc;
quals : type_quals;
}
and desc
=
|
Tint of ikind
|
Tfloat of fkind
|
Tvoid
|
Tfun
|
Tptr of t * ptr_kind
|
Tstruct of name
|
TVar of string
|
Tarray of
{
elt : t;
length : IR.IntLit.t option;
stride : IR.IntLit.t option;
}
and name
=
|
CStruct of IR.QualifiedCppName.t
|
CUnion of IR.QualifiedCppName.t
|
CppClass of
{
name : IR.QualifiedCppName.t;
template_spec_info : template_spec_info;
is_union : bool;
}
|
CSharpClass of IR.CSharpClassName.t
|
ErlangType of IR.ErlangTypeName.t
|
JavaClass of IR.JavaClassName.t
|
ObjcClass of IR.QualifiedCppName.t * name list
|
ObjcProtocol of IR.QualifiedCppName.t
and template_arg
=
|
TType of t
|
TInt of IStdlib.IStd.Int64.t
|
TNull
|
TNullPtr
|
TOpaque
and template_spec_info
=
|
NoTemplate
|
Template of
{
mangled : string option;
sub_type
and sub_tname
, mangling is not guaranteed to be unique to a single type. All the information in the template arguments is also needed for uniqueness.args : template_arg list;
}
val compare : t -> t -> int
val compare_desc : desc -> desc -> int
val compare_name : name -> name -> int
val compare_template_arg : template_arg -> template_arg -> int
val compare_template_spec_info : template_spec_info -> template_spec_info -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_desc : desc -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_name : name -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_arg : template_arg -> Ppx_yojson_conv_lib.Yojson.Safe.t
val yojson_of_template_spec_info : template_spec_info -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp_template_spec_info : IStdlib.Pp.env -> F.formatter -> template_spec_info -> unit
val mk : ?default:t -> ?quals:type_quals -> desc -> t
default
is passed then use its value to set other fields such as qualsval mk_array : ?default:t -> ?quals:type_quals -> ?length:IR.IntLit.t -> ?stride:IR.IntLit.t -> t -> t
length
or stride
value is given, use them as static length and size.val mk_struct : name -> t
val mk_ptr : ?ptr_kind:ptr_kind -> t -> t
t
, default kind is Pk_pointer
val size_t : ikind
module Name : sig ... end
val equal_desc : desc -> desc -> bool
val equal_name : name -> name -> bool
val equal_quals : type_quals -> type_quals -> bool
val equal_ignore_quals : t -> t -> bool
val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp : IStdlib.Pp.env -> F.formatter -> t -> unit
val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit
val pp_java : verbose:bool -> F.formatter -> t -> unit
val pp_cs : verbose:bool -> F.formatter -> t -> unit
val pp_protocols : IStdlib.Pp.env -> F.formatter -> name list -> unit
val to_string : t -> string
val desc_to_string : desc -> string
val d_full : t -> unit
val d_list : t list -> unit
val array_elem : t option -> t -> t
val is_objc_class : t -> bool
val is_cpp_class : t -> bool
val is_pointer_to_cpp_class : t -> bool
val is_pointer_to_objc_non_tagged_class : t -> bool
val is_pointer_to_void : t -> bool
val is_void : t -> bool
val is_pointer_to_int : t -> bool
val is_pointer_to_function : t -> bool
val is_pointer : t -> bool
val is_reference : t -> bool
val is_struct : t -> bool
val is_int : t -> bool
val is_unsigned_int : t -> bool
val is_char : t -> bool
val is_csharp_type : t -> bool
t
a type produced by the Java frontend?val is_java_primitive_type : t -> bool
t
a primitive type produced by the Java frontend?val is_java_type : t -> bool
t
a type produced by the Java frontend?module Normalizer : IStdlib.HashNormalizer.S with type t = t
Module
Integration.Driver
type mode
=
|
Analyze
|
AnalyzeJson
|
Ant of
{
prog : string;
args : string list;
}
|
BuckClangFlavor of
{
build_cmd : string list;
}
|
BuckCompilationDB of
{
deps : IBase.BuckMode.clang_compilation_db_deps;
prog : string;
args : string list;
}
|
BuckGenrule of
{
prog : string;
}
|
BuckJavaFlavor of
{
build_cmd : string list;
}
|
Clang of
{
compiler : Clang.compiler;
prog : string;
args : string list;
}
|
ClangCompilationDB of
{
db_files : [ `Escaped of string | `Raw of string ] list;
}
|
Gradle of
{
prog : string;
args : string list;
}
|
Javac of
{
compiler : Javac.compiler;
prog : string;
args : string list;
}
|
Maven of
{
prog : string;
args : string list;
}
|
NdkBuild of
{
build_cmd : string list;
}
|
Rebar3 of
{
args : string list;
}
|
XcodeBuild of
{
prog : string;
args : string list;
}
|
XcodeXcpretty of
{
prog : string;
args : string list;
}
val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t
val run_prologue : mode -> unit
val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit
val analyze_and_report : ?suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit
val run_epilogue : unit -> unit
val read_config_changed_files : unit -> IBase.SourceFile.Set.t option
Module
Integration.Driver
type mode
=
|
Analyze
|
AnalyzeJson
|
Ant of
{
prog : string;
args : string list;
}
|
BuckClangFlavor of
{
build_cmd : string list;
}
|
BuckCompilationDB of
{
deps : IBase.BuckMode.clang_compilation_db_deps;
prog : string;
args : string list;
}
|
BuckGenrule of
{
prog : string;
}
|
BuckJavaFlavor of
{
build_cmd : string list;
}
|
Clang of
{
compiler : Clang.compiler;
prog : string;
args : string list;
}
|
ClangCompilationDB of
{
db_files : [ `Escaped of string | `Raw of string ] list;
}
|
Gradle of
{
prog : string;
args : string list;
}
|
Javac of
{
compiler : Javac.compiler;
prog : string;
args : string list;
}
|
Maven of
{
prog : string;
args : string list;
}
|
NdkBuild of
{
build_cmd : string list;
}
|
Rebar3 of
{
args : string list;
}
|
XcodeBuild of
{
prog : string;
args : string list;
}
|
XcodeXcpretty of
{
prog : string;
args : string list;
}
val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t
val run_prologue : mode -> unit
val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit
val analyze_and_report : ?suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit
Module
Integration__Driver
type mode
=
|
Analyze
|
AnalyzeJson
|
Ant of
{
prog : string;
args : string list;
}
|
BuckClangFlavor of
{
build_cmd : string list;
}
|
BuckCompilationDB of
{
deps : IBase.BuckMode.clang_compilation_db_deps;
prog : string;
args : string list;
}
|
BuckGenrule of
{
prog : string;
}
|
BuckJavaFlavor of
{
build_cmd : string list;
}
|
Clang of
{
compiler : Integration.Clang.compiler;
prog : string;
args : string list;
}
|
ClangCompilationDB of
{
db_files : [ `Escaped of string | `Raw of string ] list;
}
|
Gradle of
{
prog : string;
args : string list;
}
|
Javac of
{
compiler : Integration.Javac.compiler;
prog : string;
args : string list;
}
|
Maven of
{
prog : string;
args : string list;
}
|
NdkBuild of
{
build_cmd : string list;
}
|
Rebar3 of
{
args : string list;
}
|
XcodeBuild of
{
prog : string;
args : string list;
}
|
XcodeXcpretty of
{
prog : string;
args : string list;
}
val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t
val run_prologue : mode -> unit
val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit
val analyze_and_report : ?suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit
val run_epilogue : unit -> unit
val read_config_changed_files : unit -> IBase.SourceFile.Set.t option
Module
Integration__Driver
type mode
=
|
Analyze
|
AnalyzeJson
|
Ant of
{
prog : string;
args : string list;
}
|
BuckClangFlavor of
{
build_cmd : string list;
}
|
BuckCompilationDB of
{
deps : IBase.BuckMode.clang_compilation_db_deps;
prog : string;
args : string list;
}
|
BuckGenrule of
{
prog : string;
}
|
BuckJavaFlavor of
{
build_cmd : string list;
}
|
Clang of
{
compiler : Integration.Clang.compiler;
prog : string;
args : string list;
}
|
ClangCompilationDB of
{
db_files : [ `Escaped of string | `Raw of string ] list;
}
|
Gradle of
{
prog : string;
args : string list;
}
|
Javac of
{
compiler : Integration.Javac.compiler;
prog : string;
args : string list;
}
|
Maven of
{
prog : string;
args : string list;
}
|
NdkBuild of
{
build_cmd : string list;
}
|
Rebar3 of
{
args : string list;
}
|
XcodeBuild of
{
prog : string;
args : string list;
}
|
XcodeXcpretty of
{
prog : string;
args : string list;
}
val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t
val run_prologue : mode -> unit
val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit
val analyze_and_report : ?suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit
Module
OpenSource.FbThreadSafety
Module
OpenSource.FbThreadSafety
Module
OpenSource__FbThreadSafety
Module
OpenSource__FbThreadSafety
Module
PulseAbductiveDomain.AddressAttributes
BaseAddressAttributes
but that also take care of propagating facts to the preconditionval abduce_and_add : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t
val add_one : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attribute.t -> t -> t
val add_attrs : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t
val check_valid : ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> PulseBasicInterface.Trace.t -> PulseBasicInterface.AbstractValue.t -> t -> (t, PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : PulseBasicInterface.Trace.t -> PulseBasicInterface.AbstractValue.t -> t -> (t, unit) IStdlib.IStd.result
val invalidate : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val replace_must_be_valid_reason : PulseBasicInterface.Invalidation.must_be_valid_reason -> PulseBasicInterface.AbstractValue.t -> t -> t
val allocate : IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val add_dynamic_type : IR.Typ.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val get_allocation : PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * PulseBasicInterface.Trace.t) option
val get_closure_proc_name : PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val is_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : PulseBasicInterface.AbstractValue.t -> t -> bool
val std_vector_reserve : PulseBasicInterface.AbstractValue.t -> t -> t
val add_unreachable_at : PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val find_opt : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Attributes.t option
val check_valid_isl : PulseBasicInterface.Trace.t -> PulseBasicInterface.AbstractValue.t -> ?null_noop:bool -> t -> (t, [> `ISLError of t | `InvalidAccess of PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t * t ]) IStdlib.IStd.result list
Module
PulseAbductiveDomain.AddressAttributes
BaseAddressAttributes
but that also take care of propagating facts to the preconditionval abduce_and_add : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t
val add_one : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attribute.t -> t -> t
val add_attrs : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t
val check_valid : PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> PulseBasicInterface.Trace.t -> PulseBasicInterface.AbstractValue.t -> t -> (t, PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : PulseBasicInterface.PathContext.t -> PulseBasicInterface.Trace.t -> PulseBasicInterface.AbstractValue.t -> t -> (t, unit) IStdlib.IStd.result
val invalidate : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val replace_must_be_valid_reason : PulseBasicInterface.PathContext.t -> PulseBasicInterface.Invalidation.must_be_valid_reason -> PulseBasicInterface.AbstractValue.t -> t -> t
val allocate : IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val add_dynamic_type : IR.Typ.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val get_allocation : PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * PulseBasicInterface.Trace.t) option
val get_closure_proc_name : PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val is_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : PulseBasicInterface.AbstractValue.t -> t -> bool
val std_vector_reserve : PulseBasicInterface.AbstractValue.t -> t -> t
val add_unreachable_at : PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val find_opt : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Attributes.t option
val check_valid_isl : PulseBasicInterface.PathContext.t -> PulseBasicInterface.Trace.t -> PulseBasicInterface.AbstractValue.t -> ?null_noop:bool -> t -> (t, [> `ISLError of t | `InvalidAccess of PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t * t ]) IStdlib.IStd.result list
Module
PulseAbductiveDomain.Stack
BaseStack
but that also take care of propagating facts to the preconditionval add : IR.Var.t -> BaseStack.value -> t -> t
val remove_vars : IR.Var.t list -> t -> t
val fold : (IR.Var.t -> BaseStack.value -> 'a -> 'a) -> t -> 'a -> 'a
val find_opt : IR.Var.t -> t -> BaseStack.value option
val eval : IBase.Location.t -> PulseBasicInterface.ValueHistory.t -> IR.Var.t -> t -> t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)
Module
PulseAbductiveDomain.Stack
BaseStack
but that also take care of propagating facts to the preconditionval add : IR.Var.t -> BaseStack.value -> t -> t
val remove_vars : IR.Var.t list -> t -> t
val fold : (IR.Var.t -> BaseStack.value -> 'a -> 'a) -> t -> 'a -> 'a
val find_opt : IR.Var.t -> t -> BaseStack.value option
val eval : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.ValueHistory.t -> IR.Var.t -> t -> t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)
Module
Pulselib.PulseArithmetic
module AbductiveDomain = PulseAbductiveDomain
module AccessResult = PulseAccessResult
val and_nonnegative : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_positive : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_eq_int : PulseBasicInterface.AbstractValue.t -> IR.IntLit.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
type operand
= PulseBasicInterface.PathCondition.operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of PulseBasicInterface.AbstractValue.t
val eval_binop : PulseBasicInterface.AbstractValue.t -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val eval_unop : PulseBasicInterface.AbstractValue.t -> IR.Unop.t -> PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_eq_zero : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val prune_positive : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val is_known_zero : AbductiveDomain.t -> PulseBasicInterface.AbstractValue.t -> bool
val is_unsat_cheap : AbductiveDomain.t -> bool
val has_no_assumptions : AbductiveDomain.t -> bool
val and_equal_instanceof : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.AbstractValue.t -> IR.Typ.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
Module
Pulselib.PulseArithmetic
module AbductiveDomain = PulseAbductiveDomain
module AccessResult = PulseAccessResult
val and_nonnegative : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_positive : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_eq_int : PulseBasicInterface.AbstractValue.t -> IR.IntLit.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
type operand
= PulseBasicInterface.PathCondition.operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of PulseBasicInterface.AbstractValue.t
|
FunctionApplicationOperand of
{
f : PulseFormula.function_symbol;
actuals : PulseBasicInterface.AbstractValue.t list;
}
val and_equal : operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val eval_binop : PulseBasicInterface.AbstractValue.t -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val eval_unop : PulseBasicInterface.AbstractValue.t -> IR.Unop.t -> PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_eq_zero : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val prune_positive : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val is_known_zero : AbductiveDomain.t -> PulseBasicInterface.AbstractValue.t -> bool
val is_unsat_cheap : AbductiveDomain.t -> bool
val has_no_assumptions : AbductiveDomain.t -> bool
val and_equal_instanceof : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.AbstractValue.t -> IR.Typ.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
Module
PulseAttribute.Attributes
include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type rank
type elt
= t
val add : t -> elt -> t
val empty : t
val find_rank : t -> rank -> elt option
val fold : t -> init:'accum -> f:('accum -> elt -> 'accum) -> 'accum
val fold_map : t -> init:'accum -> f:('accum -> elt -> 'accum * elt) -> 'accum * t
val for_all : f:(elt -> bool) -> t -> bool
val is_empty : t -> bool
val is_singleton : t -> bool
val is_subset : t -> of_:t -> bool
val map : t -> f:(elt -> elt) -> t
val singleton : elt -> t
val elements : t -> elt list
val remove : elt -> t -> t
val mem : elt -> t -> bool
val union_prefer_left : t -> t -> t
lhs
and rhs
, keep the one from lhs
in union_prefer_left lhs rhs
val pp : ?print_rank:bool -> IStdlib.PrettyPrintable.F.formatter -> t -> unit
val get_address_of_stack_variable : t -> (IR.Var.t * IBase.Location.t * ValueHistory.t) option
val get_closure_proc_name : t -> IR.Procname.t option
val get_allocation : t -> (IR.Procname.t * Trace.t) option
val get_dynamic_type : t -> IR.Typ.t option
val is_end_of_collection : t -> bool
val get_invalid : t -> (Invalidation.t * Trace.t) option
val get_isl_abduced : t -> Trace.t option
val get_must_be_valid : t -> (Trace.t * Invalidation.must_be_valid_reason option) option
val get_written_to : t -> Trace.t option
val is_modified : t -> bool
val is_std_vector_reserved : t -> bool
val is_uninitialized : t -> bool
val get_must_be_initialized : t -> Trace.t option
val get_unreachable_at : t -> IBase.Location.t option
val isl_subset : t -> t -> bool
Attributes
.isl_equiv.val replace_isl_abduced : t -> t -> t
val add_call : IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
Module
PulseAttribute.Attributes
include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type rank
type elt
= t
val add : t -> elt -> t
val empty : t
val find_rank : t -> rank -> elt option
val fold : t -> init:'accum -> f:('accum -> elt -> 'accum) -> 'accum
val fold_map : t -> init:'accum -> f:('accum -> elt -> 'accum * elt) -> 'accum * t
val for_all : f:(elt -> bool) -> t -> bool
val is_empty : t -> bool
val is_singleton : t -> bool
val is_subset : t -> of_:t -> bool
val map : t -> f:(elt -> elt) -> t
val singleton : elt -> t
val elements : t -> elt list
val remove : elt -> t -> t
val mem : elt -> t -> bool
val union_prefer_left : t -> t -> t
lhs
and rhs
, keep the one from lhs
in union_prefer_left lhs rhs
val pp : ?print_rank:bool -> IStdlib.PrettyPrintable.F.formatter -> t -> unit
val get_address_of_stack_variable : t -> (IR.Var.t * IBase.Location.t * ValueHistory.t) option
val get_closure_proc_name : t -> IR.Procname.t option
val get_allocation : t -> (IR.Procname.t * Trace.t) option
val get_dynamic_type : t -> IR.Typ.t option
val is_end_of_collection : t -> bool
val get_invalid : t -> (Invalidation.t * Trace.t) option
val get_isl_abduced : t -> Trace.t option
val get_must_be_valid : t -> (PathContext.timestamp * Trace.t * Invalidation.must_be_valid_reason option) option
val get_written_to : t -> Trace.t option
val is_modified : t -> bool
val is_std_vector_reserved : t -> bool
val is_uninitialized : t -> bool
val get_must_be_initialized : t -> (PathContext.timestamp * Trace.t) option
val get_unreachable_at : t -> IBase.Location.t option
val isl_subset : t -> t -> bool
Attributes
.isl_equiv.val replace_isl_abduced : t -> t -> t
val add_call : PathContext.t -> IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
Module
Pulselib.PulseAttribute
module Invalidation = PulseInvalidation
module Trace = PulseTrace
module ValueHistory = PulseValueHistory
type t
=
|
AddressOfCppTemporary of IR.Var.t * ValueHistory.t
|
AddressOfStackVariable of IR.Var.t * IBase.Location.t * ValueHistory.t
|
Allocated of IR.Procname.t * Trace.t
Procname
.t is the function causing the allocation, eg malloc
|
Closure of IR.Procname.t
|
DynamicType of IR.Typ.t
|
EndOfCollection
|
Invalid of Invalidation.t * Trace.t
|
ISLAbduced of Trace.t
|
MustBeInitialized of Trace.t
|
MustBeValid of Trace.t * Invalidation.must_be_valid_reason option
|
StdVectorReserve
|
Uninitialized
|
UnreachableAt of IBase.Location.t
|
WrittenTo of Trace.t
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
Module
Pulselib.PulseAttribute
module Invalidation = PulseInvalidation
module PathContext = PulsePathContext
module Trace = PulseTrace
module ValueHistory = PulseValueHistory
type t
=
|
AddressOfCppTemporary of IR.Var.t * ValueHistory.t
|
AddressOfStackVariable of IR.Var.t * IBase.Location.t * ValueHistory.t
|
Allocated of IR.Procname.t * Trace.t
Procname
.t is the function causing the allocation, eg malloc
|
Closure of IR.Procname.t
|
DynamicType of IR.Typ.t
|
EndOfCollection
|
Invalid of Invalidation.t * Trace.t
|
ISLAbduced of Trace.t
|
MustBeInitialized of PathContext.timestamp * Trace.t
|
MustBeValid of PathContext.timestamp * Trace.t * Invalidation.must_be_valid_reason option
|
StdVectorReserve
|
Uninitialized
|
UnreachableAt of IBase.Location.t
|
WrittenTo of Trace.t
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
Module
Pulselib.PulseBaseAddressAttributes
val empty : t
val filter : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> bool) -> t -> t
val for_all : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> bool) -> t -> bool
val filter_with_discarded_addrs : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> bool) -> t -> t * PulseBasicInterface.AbstractValue.t list
val find_opt : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Attributes.t option
val add_one : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attribute.t -> t -> t
val add : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t
val allocate : IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val fold : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> 'a -> 'a) -> t -> 'a -> 'a
val check_valid : PulseBasicInterface.AbstractValue.t -> t -> (unit, PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : PulseBasicInterface.AbstractValue.t -> t -> (unit, unit) IStdlib.IStd.result
val invalidate : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val get_allocation : PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * PulseBasicInterface.Trace.t) option
val get_closure_proc_name : PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val get_invalid : PulseBasicInterface.AbstractValue.t -> t -> (PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t) option
val get_must_be_valid : PulseBasicInterface.AbstractValue.t -> t -> (PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option) option
val is_must_be_valid_or_allocated_isl : PulseBasicInterface.AbstractValue.t -> t -> bool
val get_must_be_initialized : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Trace.t option
val add_dynamic_type : IR.Typ.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val get_dynamic_type : t -> PulseBasicInterface.AbstractValue.t -> IR.Typ.t option
val std_vector_reserve : PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> t
val is_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> bool
val add_unreachable_at : PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val pp : F.formatter -> t -> unit
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val remove_must_be_valid_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val remove_isl_abduced_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val initialize : PulseBasicInterface.AbstractValue.t -> t -> t
val canonicalize : get_var_repr:(PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.AbstractValue.t) -> t -> t
get_var_repr
and remove non-canonical variables in favor of their rerpresentativeval subst_var : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.AbstractValue.t) -> t -> t
Module
Pulselib.PulseBaseAddressAttributes
val empty : t
val filter : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> bool) -> t -> t
val for_all : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> bool) -> t -> bool
val filter_with_discarded_addrs : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> bool) -> t -> t * PulseBasicInterface.AbstractValue.t list
val find_opt : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Attributes.t option
val add_one : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attribute.t -> t -> t
val add : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t
val allocate : IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val fold : (PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> 'a -> 'a) -> t -> 'a -> 'a
val check_valid : PulseBasicInterface.AbstractValue.t -> t -> (unit, PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : PulseBasicInterface.AbstractValue.t -> t -> (unit, unit) IStdlib.IStd.result
val invalidate : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val get_allocation : PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * PulseBasicInterface.Trace.t) option
val get_closure_proc_name : PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val get_invalid : PulseBasicInterface.AbstractValue.t -> t -> (PulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t) option
val get_must_be_valid : PulseBasicInterface.AbstractValue.t -> t -> (PulseBasicInterface.PathContext.timestamp * PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option) option
val is_must_be_valid_or_allocated_isl : PulseBasicInterface.AbstractValue.t -> t -> bool
val get_must_be_initialized : PulseBasicInterface.AbstractValue.t -> t -> (PulseBasicInterface.PathContext.timestamp * PulseBasicInterface.Trace.t) option
val add_dynamic_type : IR.Typ.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val get_dynamic_type : t -> PulseBasicInterface.AbstractValue.t -> IR.Typ.t option
val std_vector_reserve : PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> t
val is_end_of_collection : PulseBasicInterface.AbstractValue.t -> t -> bool
val add_unreachable_at : PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val pp : F.formatter -> t -> unit
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val remove_must_be_valid_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val remove_isl_abduced_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val initialize : PulseBasicInterface.AbstractValue.t -> t -> t
val canonicalize : get_var_repr:(PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.AbstractValue.t) -> t -> t
get_var_repr
and remove non-canonical variables in favor of their rerpresentativeval subst_var : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.AbstractValue.t) -> t -> t
Module
Pulselib.PulseBasicInterface
module AbstractValue = PulseAbstractValue
module Attribute = PulseAttribute
module Attributes = PulseAttribute.Attributes
module CallEvent = PulseCallEvent
module Diagnostic = PulseDiagnostic
module Invalidation = PulseInvalidation
module PathCondition = PulsePathCondition
module SatUnsat = PulseSatUnsat
module SkippedCalls = PulseSkippedCalls
module Trace = PulseTrace
module ValueHistory = PulseValueHistory
include SatUnsat.Types
type nonrec 'a sat_unsat_t
= 'a PulseSatUnsat.t
=
|
Unsat
|
Sat of 'a
Enforce short form usage
include sig ... end
module PulseAbstractValue = PulseAbstractValue
module PulseAttribute = PulseAttribute
module PulseCallEvent = PulseCallEvent
module PulseDiagnostic = PulseDiagnostic
module PulseInvalidation = PulseInvalidation
module PulsePathCondition = PulsePathCondition
module PulseSkippedCalls = PulseSkippedCalls
module PulseTrace = PulseTrace
module PulseValueHistory = PulseValueHistory
module PulseSatUnsat = PulseSatUnsat
Module
Pulselib.PulseBasicInterface
module AbstractValue = PulseAbstractValue
module Attribute = PulseAttribute
module Attributes = PulseAttribute.Attributes
module CallEvent = PulseCallEvent
module Diagnostic = PulseDiagnostic
module Invalidation = PulseInvalidation
module PathCondition = PulsePathCondition
module PathContext = PulsePathContext
module SatUnsat = PulseSatUnsat
module SkippedCalls = PulseSkippedCalls
module Trace = PulseTrace
module ValueHistory = PulseValueHistory
include SatUnsat.Types
type nonrec 'a sat_unsat_t
= 'a PulseSatUnsat.t
=
|
Unsat
|
Sat of 'a
Enforce short form usage
include sig ... end
module PulseAbstractValue = PulseAbstractValue
module PulseAttribute = PulseAttribute
module PulseCallEvent = PulseCallEvent
module PulseDiagnostic = PulseDiagnostic
module PulseInvalidation = PulseInvalidation
module PulsePathCondition = PulsePathCondition
module PulsePathContext = PulsePathContext
module PulseSkippedCalls = PulseSkippedCalls
module PulseTrace = PulseTrace
module PulseValueHistory = PulseValueHistory
module PulseSatUnsat = PulseSatUnsat
Module
Pulselib.PulseCallOperations
val call : IR.Tenv.t -> caller_proc_desc:IR.Procdesc.t -> callee_data:(IR.Procdesc.t * PulseSummary.t) option -> IBase.Location.t -> IR.Procname.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> PulseDomainInterface.ExecutionDomain.t PulseDomainInterface.AccessResult.t list
val unknown_call : IR.Tenv.t -> IBase.Location.t -> PulseBasicInterface.CallEvent.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> t
val conservatively_initialize_args : PulseBasicInterface.AbstractValue.t list -> t -> t
Module
Pulselib.PulseCallOperations
val call : IR.Tenv.t -> PulseBasicInterface.PathContext.t -> caller_proc_desc:IR.Procdesc.t -> callee_data:(IR.Procdesc.t * PulseSummary.t) option -> IBase.Location.t -> IR.Procname.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> PulseDomainInterface.ExecutionDomain.t PulseDomainInterface.AccessResult.t list
val unknown_call : IR.Tenv.t -> PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.CallEvent.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> t PulseDomainInterface.AccessResult.t
val conservatively_initialize_args : PulseBasicInterface.AbstractValue.t list -> t -> t
Module
Pulselib.PulseFormula
module SatUnsat = PulseSatUnsat
module Var = PulseAbstractValue
Arithmetic solver
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit
type operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of Var.t
Build formulas
type new_eq
=
|
EqZero of Var.t
|
Equal of Var.t * Var.t
type new_eqs
= new_eq list
val ttrue : t
val and_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_instanceof : Var.t -> Var.t -> IR.Typ.t -> t -> (t * new_eqs) SatUnsat.t
val and_less_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_less_than : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_unop : Var.t -> IR.Unop.t -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_binop : Var.t -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
Operations
val normalize : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> t -> (t * new_eqs) SatUnsat.t
val simplify : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> can_be_pruned:Var.Set.t -> keep:Var.Set.t -> t -> (t * Var.Set.t * new_eqs) SatUnsat.t
val and_fold_subst_variables : t -> up_to_f:t -> init:'acc -> f:('acc -> Var.t -> 'acc * Var.t) -> ('acc * t * new_eqs) SatUnsat.t
val is_known_zero : t -> Var.t -> bool
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> Var.t -> Var.t
Module
Pulselib.PulseFormula
module SatUnsat = PulseSatUnsat
module Var = PulseAbstractValue
Arithmetic solver
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit
type function_symbol
=
|
Unknown of Var.t
|
Procname of IR.Procname.t
val compare_function_symbol : function_symbol -> function_symbol -> int
type operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of Var.t
|
FunctionApplicationOperand of
{
f : function_symbol;
actuals : Var.t list;
}
Build formulas
type new_eq
=
|
EqZero of Var.t
|
Equal of Var.t * Var.t
type new_eqs
= new_eq list
val ttrue : t
val and_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_instanceof : Var.t -> Var.t -> IR.Typ.t -> t -> (t * new_eqs) SatUnsat.t
val and_less_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_less_than : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_unop : Var.t -> IR.Unop.t -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_binop : Var.t -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
Operations
val normalize : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> t -> (t * new_eqs) SatUnsat.t
val simplify : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> can_be_pruned:Var.Set.t -> keep:Var.Set.t -> t -> (t * Var.Set.t * new_eqs) SatUnsat.t
val and_fold_subst_variables : t -> up_to_f:t -> init:'acc -> f:('acc -> Var.t -> 'acc * Var.t) -> ('acc * t * new_eqs) SatUnsat.t
val is_known_zero : t -> Var.t -> bool
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> Var.t -> Var.t
Module
Pulselib.PulseInterproc
val apply_prepost : is_isl_error_prepost:bool -> IR.Procname.t -> IBase.Location.t -> callee_prepost:PulseDomainInterface.AbductiveDomain.t -> captured_vars_with_actuals:(IR.Var.t * ((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list -> formals:IR.Var.t list -> actuals:((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> PulseDomainInterface.AbductiveDomain.t -> (PulseDomainInterface.AbductiveDomain.t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) option * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) Pulselib.PulseBasicInterface.AbstractValue.Map.t) PulseDomainInterface.AccessResult.t PulseBasicInterface.SatUnsat.t
SatUnsat
.Unsat if that path in the callee is infeasiblecallee_abstract_value -> caller_abstract_value
mapping callee's abstract values to what they became in the new (caller) stateModule
Pulselib.PulseInterproc
val apply_prepost : PulseBasicInterface.PathContext.t -> is_isl_error_prepost:bool -> IR.Procname.t -> IBase.Location.t -> callee_prepost:PulseDomainInterface.AbductiveDomain.t -> captured_vars_with_actuals:(IR.Var.t * ((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list -> formals:IR.Var.t list -> actuals:((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> PulseDomainInterface.AbductiveDomain.t -> (PulseDomainInterface.AbductiveDomain.t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) option * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) Pulselib.PulseBasicInterface.AbstractValue.Map.t) PulseDomainInterface.AccessResult.t PulseBasicInterface.SatUnsat.t
SatUnsat
.Unsat if that path in the callee is infeasiblecallee_abstract_value -> caller_abstract_value
mapping callee's abstract values to what they became in the new (caller) stateModule
Pulselib.PulseInvalidation
type std_vector_function
=
|
Assign
|
Clear
|
Emplace
|
EmplaceBack
|
Insert
|
PushBack
|
Reserve
|
ShrinkToFit
val pp_std_vector_function : F.formatter -> std_vector_function -> unit
type java_iterator_function
=
|
Remove
type t
=
|
CFree
|
ConstantDereference of IR.IntLit.t
|
CppDelete
|
EndIterator
|
GoneOutOfScope of IR.Pvar.t * IR.Typ.t
|
OptionalEmpty
|
StdVector of std_vector_function
|
JavaIterator of java_iterator_function
val compare_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> int
val equal_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> bool
val pp_must_be_valid_reason : F.formatter -> must_be_valid_reason option -> unit
val issue_type_of_cause : t -> must_be_valid_reason option -> IBase.IssueType.t
Module
Pulselib.PulseInvalidation
type std_vector_function
=
|
Assign
|
Clear
|
Emplace
|
EmplaceBack
|
Insert
|
PushBack
|
Reserve
|
ShrinkToFit
val pp_std_vector_function : F.formatter -> std_vector_function -> unit
type java_iterator_function
=
|
Remove
type t
=
|
CFree
|
ConstantDereference of IR.IntLit.t
|
CppDelete
|
EndIterator
|
GoneOutOfScope of IR.Pvar.t * IR.Typ.t
|
OptionalEmpty
|
StdVector of std_vector_function
|
JavaIterator of java_iterator_function
type must_be_valid_reason
=
|
BlockCall
|
InsertionIntoCollection
|
SelfOfNonPODReturnMethod of IR.Typ.t
val compare_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> int
val equal_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> bool
val pp_must_be_valid_reason : F.formatter -> must_be_valid_reason option -> unit
val issue_type_of_cause : t -> must_be_valid_reason option -> IBase.IssueType.t
Module
Pulselib.PulseModels
type model_data
=
{
analysis_data : PulseSummary.t Absint.InterproceduralAnalysis.t;
callee_procname : IR.Procname.t;
location : IBase.Location.t;
ret : IR.Ident.t * IR.Typ.t;
}
type model
= model_data -> PulseDomainInterface.AbductiveDomain.t -> PulseDomainInterface.ExecutionDomain.t PulseDomainInterface.AccessResult.t list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
Module
Pulselib.PulseModels
type model_data
=
{
analysis_data : PulseSummary.t Absint.InterproceduralAnalysis.t;
path : PulseBasicInterface.PathContext.t;
callee_procname : IR.Procname.t;
location : IBase.Location.t;
ret : IR.Ident.t * IR.Typ.t;
}
type model
= model_data -> PulseDomainInterface.AbductiveDomain.t -> PulseDomainInterface.ExecutionDomain.t PulseDomainInterface.AccessResult.t list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
Module
PulseOperations.Closures
val check_captured_addresses : IBase.Location.t -> PulseBasicInterface.AbstractValue.t -> t -> t PulseDomainInterface.AccessResult.t
Module
PulseOperations.Closures
val check_captured_addresses : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.AbstractValue.t -> t -> t PulseDomainInterface.AccessResult.t
Module
Pulselib.PulseOperations
module Import : sig ... end
open
ing in other modules.include module type of Import
type access_mode
=
Imported types for ease of use and so we can write variants without the corresponding module prefix
type 'abductive_domain_t execution_domain_base_t
= 'abductive_domain_t PulseDomainInterface.ExecutionDomain.base_t
=
|
ContinueProgram of 'abductive_domain_t
|
ExitProgram of PulseDomainInterface.AbductiveDomain.summary
|
AbortProgram of PulseDomainInterface.AbductiveDomain.summary
|
LatentAbortProgram of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
latent_issue : PulseDomainInterface.LatentIssue.t;
}
|
LatentInvalidAccess of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
address : PulseBasicInterface.AbstractValue.t;
must_be_valid : PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option;
calling_context : (PulseBasicInterface.CallEvent.t * IBase.Location.t) list;
}
|
ISLLatentMemoryError of PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error
= 'astate PulseDomainInterface.AccessResult.error
=
|
PotentialInvalidAccess of
{
astate : 'astate;
address : PulseBasicInterface.AbstractValue.t;
must_be_valid : PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option;
}
|
PotentialInvalidAccessSummary of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
address : PulseBasicInterface.AbstractValue.t;
must_be_valid : PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option;
}
|
ReportableError of
{
astate : 'astate;
diagnostic : PulseBasicInterface.Diagnostic.t;
}
|
ReportableErrorSummary of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
diagnostic : PulseBasicInterface.Diagnostic.t;
}
|
ISLError of 'astate
Monadic syntax
include module type of IStdlib.IResult.Let_syntax
include module type of IStdlib.IStd.Result.Monad_infix
val let+ : ('ok, 'err) IStdlib.IStd.result -> ('ok -> 'okk) -> ('okk, 'err) IStdlib.IStd.result
val let* : ('ok, 'err) IStdlib.IStd.result -> ('ok -> ('okk, 'err) IStdlib.IStd.result) -> ('okk, 'err) IStdlib.IStd.result
val let<*> : 'a PulseDomainInterface.AccessResult.t -> ('a -> 'b PulseDomainInterface.AccessResult.t list) -> 'b PulseDomainInterface.AccessResult.t list
AccessResult.t
into a list of AccessResult.t
s (not really because the first type is not an AccessResult.t list
but just an AccessResult.t
)val let<+> : 'a PulseDomainInterface.AccessResult.t -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t execution_domain_base_t PulseDomainInterface.AccessResult.t list
AccessResult.t
into an analysis resultval check_addr_access : ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
address
is not known to be invalidmodule Closures : sig ... end
val eval : access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
val eval_structure_isl : access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (bool * (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t list) PulseDomainInterface.AccessResult.t
val prune : IBase.Location.t -> condition:IR.Exp.t -> t -> t PulseDomainInterface.AccessResult.t
val eval_deref : ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
eval
but evaluates *exp
.val eval_deref_isl : IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t list
val eval_access : ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
eval
but starts from an address instead of an expression, checks that it is valid, and if so dereferences it according to the access.val eval_deref_access : ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
eval_access
but does additional dereference.val eval_proc_name : IBase.Location.t -> IR.Exp.t -> t -> (t * IR.Procname.t option) PulseDomainInterface.AccessResult.t
val havoc_id : IR.Ident.t -> PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_deref_field : IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> PulseBasicInterface.ValueHistory.t -> t -> t PulseDomainInterface.AccessResult.t
val realloc_pvar : IR.Tenv.t -> IR.Pvar.t -> IR.Typ.t -> IBase.Location.t -> t -> t
val write_id : IR.Ident.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t
val write_field : IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref --.field--> obj
val write_deref_field : IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref --.field--> _ --*--> obj
val write_arr_index : IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> index:PulseBasicInterface.AbstractValue.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref[index]--> obj
val write_deref : IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref --*--> obj
val write_deref_biad_isl : IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> PulseBasicInterface.AbstractValue.t Absint.HilExp.Access.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t list
type invalidation_access
=
|
MemoryAccess of
{
pointer : PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t;
access : Pulselib.PulseDomainInterface.BaseMemory.Access.t;
hist_obj_default : PulseBasicInterface.ValueHistory.t;
}
access
edge at address pointer
|
StackAddress of IR.Var.t * PulseBasicInterface.ValueHistory.t
|
UntraceableAccess
Invalid
attributeval invalidate : invalidation_access -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
val invalidate_biad_isl : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t list
val allocate : IR.Procname.t -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t
val add_dynamic_type : IR.Typ.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val invalidate_access : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t PulseDomainInterface.AccessResult.t
val invalidate_deref_access : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t PulseDomainInterface.AccessResult.t
invalidate_access
but invalidates dereferenced address.val invalidate_array_elements : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
val shallow_copy : IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list
val remove_vars : IR.Var.t list -> IBase.Location.t -> t -> t
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.ValueHistory.t -> t -> t PulseDomainInterface.AccessResult.t
val get_captured_actuals : IBase.Location.t -> captured_vars:(IR.Var.t * IR.CapturedVar.capture_mode * IR.Typ.t) list -> actual_closure:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> (t * (IR.Var.t * ((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list) PulseDomainInterface.AccessResult.t
Module
Pulselib.PulseOperations
module Import : sig ... end
open
ing in other modules.include module type of Import
type access_mode
=
Imported types for ease of use and so we can write variants without the corresponding module prefix
type 'abductive_domain_t execution_domain_base_t
= 'abductive_domain_t PulseDomainInterface.ExecutionDomain.base_t
=
|
ContinueProgram of 'abductive_domain_t
|
ExitProgram of PulseDomainInterface.AbductiveDomain.summary
|
AbortProgram of PulseDomainInterface.AbductiveDomain.summary
|
LatentAbortProgram of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
latent_issue : PulseDomainInterface.LatentIssue.t;
}
|
LatentInvalidAccess of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
address : PulseBasicInterface.AbstractValue.t;
must_be_valid : PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option;
calling_context : (PulseBasicInterface.CallEvent.t * IBase.Location.t) list;
}
|
ISLLatentMemoryError of PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error
= 'astate PulseDomainInterface.AccessResult.error
=
|
PotentialInvalidAccess of
{
astate : 'astate;
address : PulseBasicInterface.AbstractValue.t;
must_be_valid : PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option;
}
|
PotentialInvalidAccessSummary of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
address : PulseBasicInterface.AbstractValue.t;
must_be_valid : PulseBasicInterface.Trace.t * PulseBasicInterface.Invalidation.must_be_valid_reason option;
}
|
ReportableError of
{
astate : 'astate;
diagnostic : PulseBasicInterface.Diagnostic.t;
}
|
ReportableErrorSummary of
{
astate : PulseDomainInterface.AbductiveDomain.summary;
diagnostic : PulseBasicInterface.Diagnostic.t;
}
|
ISLError of 'astate
Monadic syntax
include module type of IStdlib.IResult.Let_syntax
include module type of IStdlib.IStd.Result.Monad_infix
val let+ : ('ok, 'err) IStdlib.IStd.result -> ('ok -> 'okk) -> ('okk, 'err) IStdlib.IStd.result
val let* : ('ok, 'err) IStdlib.IStd.result -> ('ok -> ('okk, 'err) IStdlib.IStd.result) -> ('okk, 'err) IStdlib.IStd.result
val let<*> : 'a PulseDomainInterface.AccessResult.t -> ('a -> 'b PulseDomainInterface.AccessResult.t list) -> 'b PulseDomainInterface.AccessResult.t list
AccessResult.t
into a list of AccessResult.t
s (not really because the first type is not an AccessResult.t list
but just an AccessResult.t
)val let<+> : 'a PulseDomainInterface.AccessResult.t -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t execution_domain_base_t PulseDomainInterface.AccessResult.t list
AccessResult.t
into an analysis resultval check_addr_access : PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
address
is not known to be invalidmodule Closures : sig ... end
val eval : PulseBasicInterface.PathContext.t -> access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
val eval_structure_isl : PulseBasicInterface.PathContext.t -> access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (bool * (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t list) PulseDomainInterface.AccessResult.t
val prune : PulseBasicInterface.PathContext.t -> IBase.Location.t -> condition:IR.Exp.t -> t -> t PulseDomainInterface.AccessResult.t
val eval_deref : PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
eval
but evaluates *exp
.val eval_deref_isl : PulseBasicInterface.PathContext.t -> IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t list
val eval_access : PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
eval
but starts from an address instead of an expression, checks that it is valid, and if so dereferences it according to the access.val eval_deref_access : PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
eval_access
but does additional dereference.val eval_proc_name : PulseBasicInterface.PathContext.t -> IBase.Location.t -> IR.Exp.t -> t -> (t * IR.Procname.t option) PulseDomainInterface.AccessResult.t
val havoc_id : IR.Ident.t -> PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_deref_field : PulseBasicInterface.PathContext.t -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> PulseBasicInterface.ValueHistory.t -> t -> t PulseDomainInterface.AccessResult.t
val realloc_pvar : IR.Tenv.t -> IR.Pvar.t -> IR.Typ.t -> IBase.Location.t -> t -> t
val write_id : IR.Ident.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t
val write_field : PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref --.field--> obj
val write_deref_field : PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref --.field--> _ --*--> obj
val write_arr_index : PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> index:PulseBasicInterface.AbstractValue.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref[index]--> obj
val write_deref : PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
ref --*--> obj
val write_deref_biad_isl : PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> PulseBasicInterface.AbstractValue.t Absint.HilExp.Access.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t list
type invalidation_access
=
|
MemoryAccess of
{
pointer : PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t;
access : Pulselib.PulseDomainInterface.BaseMemory.Access.t;
hist_obj_default : PulseBasicInterface.ValueHistory.t;
}
access
edge at address pointer
|
StackAddress of IR.Var.t * PulseBasicInterface.ValueHistory.t
|
UntraceableAccess
Invalid
attributeval invalidate : PulseBasicInterface.PathContext.t -> invalidation_access -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
val invalidate_biad_isl : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t list
val allocate : IR.Procname.t -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t
val add_dynamic_type : IR.Typ.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
val invalidate_access : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t PulseDomainInterface.AccessResult.t
val invalidate_deref_access : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t PulseDomainInterface.AccessResult.t
invalidate_access
but invalidates dereferenced address.val invalidate_array_elements : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t
val shallow_copy : PulseBasicInterface.PathContext.t -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t
val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list
val remove_vars : IR.Var.t list -> IBase.Location.t -> t -> t
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.ValueHistory.t -> t -> t PulseDomainInterface.AccessResult.t
val get_captured_actuals : PulseBasicInterface.PathContext.t -> IBase.Location.t -> captured_vars:(IR.Var.t * IR.CapturedVar.capture_mode * IR.Typ.t) list -> actual_closure:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> (t * (IR.Var.t * ((PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list) PulseDomainInterface.AccessResult.t
Module
Pulselib.PulsePathCondition
module AbstractValue = PulseAbstractValue
module SatUnsat = PulseSatUnsat
module ValueHistory = PulseValueHistory
type new_eqs
= PulseFormula.new_eqs
Building arithmetic constraints
val and_nonnegative : AbstractValue.t -> t -> t * new_eqs
and_nonnegative v phi
is phi ∧ v≥0
val and_positive : AbstractValue.t -> t -> t * new_eqs
and_positive v phi
is phi ∧ v>0
val and_eq_int : AbstractValue.t -> IR.IntLit.t -> t -> t * new_eqs
and_eq_int v i phi
is phi ∧ v=i
val and_eq_vars : AbstractValue.t -> AbstractValue.t -> t -> t * new_eqs
val simplify : IR.Tenv.t -> can_be_pruned:AbstractValue.Set.t -> keep:AbstractValue.Set.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> (t * AbstractValue.Set.t * new_eqs) SatUnsat.t
simplify ~can_be_pruned ~keep phi
attempts to get rid of as many variables in fv phi
but not in keep
as possible, and tries to eliminate variables not in can_be_pruned
from the "pruned" part of the formulaval and_callee : (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t -> t -> callee:t -> (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t * t * new_eqs
Operations
type operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of AbstractValue.t
val pp_operand : IStdlib.IStd.Formatter.t -> operand -> unit
val eval_binop : AbstractValue.t -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val eval_unop : AbstractValue.t -> IR.Unop.t -> AbstractValue.t -> t -> t * new_eqs
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val and_eq_instanceof : AbstractValue.t -> AbstractValue.t -> IR.Typ.t -> t -> t * new_eqs
Queries
val is_known_zero : t -> AbstractValue.t -> bool
is_known_zero phi t
returns true
if phi |- t = 0
, false
if we don't know for sureval is_known_not_equal_zero : t -> AbstractValue.t -> bool
is_known_not_equal_zero phi t
returns true
if phi |- t != 0
, false
if we don't know for sureval is_unsat_cheap : t -> bool
val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t
val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t
Module
Pulselib.PulsePathCondition
module AbstractValue = PulseAbstractValue
module SatUnsat = PulseSatUnsat
module ValueHistory = PulseValueHistory
type new_eqs
= PulseFormula.new_eqs
Building arithmetic constraints
val and_nonnegative : AbstractValue.t -> t -> t * new_eqs
and_nonnegative v phi
is phi ∧ v≥0
val and_positive : AbstractValue.t -> t -> t * new_eqs
and_positive v phi
is phi ∧ v>0
val and_eq_int : AbstractValue.t -> IR.IntLit.t -> t -> t * new_eqs
and_eq_int v i phi
is phi ∧ v=i
val and_eq_vars : AbstractValue.t -> AbstractValue.t -> t -> t * new_eqs
val simplify : IR.Tenv.t -> can_be_pruned:AbstractValue.Set.t -> keep:AbstractValue.Set.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> (t * AbstractValue.Set.t * new_eqs) SatUnsat.t
simplify ~can_be_pruned ~keep phi
attempts to get rid of as many variables in fv phi
but not in keep
as possible, and tries to eliminate variables not in can_be_pruned
from the "pruned" part of the formulaval and_callee : (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t -> t -> callee:t -> (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t * t * new_eqs
Operations
type operand
= PulseFormula.operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of AbstractValue.t
|
FunctionApplicationOperand of
{
f : PulseFormula.function_symbol;
actuals : AbstractValue.t list;
}
val and_equal : operand -> operand -> t -> t * new_eqs
val eval_binop : AbstractValue.t -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val eval_unop : AbstractValue.t -> IR.Unop.t -> AbstractValue.t -> t -> t * new_eqs
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val and_eq_instanceof : AbstractValue.t -> AbstractValue.t -> IR.Typ.t -> t -> t * new_eqs
Queries
val is_known_zero : t -> AbstractValue.t -> bool
is_known_zero phi t
returns true
if phi |- t = 0
, false
if we don't know for sureval is_known_not_equal_zero : t -> AbstractValue.t -> bool
is_known_not_equal_zero phi t
returns true
if phi |- t != 0
, false
if we don't know for sureval is_unsat_cheap : t -> bool
val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t
val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t
Module
Pulselib.PulsePathContext
val t0 : timestamp
type t
=
{
timestamp : timestamp;
}
Module
Pulselib
module Pulse : sig ... end
module PulseAbductiveDomain : sig ... end
module PulseAbstractValue : sig ... end
module PulseAccessResult : sig ... end
module PulseArithmetic : sig ... end
module PulseAttribute : sig ... end
module PulseBaseAddressAttributes : sig ... end
module PulseBaseDomain : sig ... end
module PulseBaseMemory : sig ... end
module PulseBaseStack : sig ... end
module PulseBasicInterface : sig ... end
module PulseCItv : sig ... end
module PulseCallEvent : sig ... end
module PulseCallOperations : sig ... end
module PulseDiagnostic : sig ... end
module PulseDomainInterface : sig ... end
module PulseExecutionDomain : sig ... end
module PulseFormula : sig ... end
module PulseInterproc : sig ... end
module PulseInvalidation : sig ... end
module PulseLatentIssue : sig ... end
module PulseModels : sig ... end
module PulseObjectiveCSummary : sig ... end
module PulseOperations : sig ... end
module PulsePathCondition : sig ... end
module PulseReport : sig ... end
module PulseSatUnsat : sig ... end
module PulseSkippedCalls : sig ... end
module PulseSummary : sig ... end
module PulseTopl : sig ... end
module PulseTrace : sig ... end
module PulseUninitBlocklist : sig ... end
module PulseValueHistory : sig ... end
module QSafeCapped : sig ... end
module ZSafe : sig ... end
Module
Pulselib
module Pulse : sig ... end
module PulseAbductiveDomain : sig ... end
module PulseAbstractValue : sig ... end
module PulseAccessResult : sig ... end
module PulseArithmetic : sig ... end
module PulseAttribute : sig ... end
module PulseBaseAddressAttributes : sig ... end
module PulseBaseDomain : sig ... end
module PulseBaseMemory : sig ... end
module PulseBaseStack : sig ... end
module PulseBasicInterface : sig ... end
module PulseCItv : sig ... end
module PulseCallEvent : sig ... end
module PulseCallOperations : sig ... end
module PulseDiagnostic : sig ... end
module PulseDomainInterface : sig ... end
module PulseExecutionDomain : sig ... end
module PulseFormula : sig ... end
module PulseInterproc : sig ... end
module PulseInvalidation : sig ... end
module PulseLatentIssue : sig ... end
module PulseModels : sig ... end
module PulseObjectiveCSummary : sig ... end
module PulseOperations : sig ... end
module PulsePathCondition : sig ... end
module PulsePathContext : sig ... end
module PulseReport : sig ... end
module PulseSatUnsat : sig ... end
module PulseSkippedCalls : sig ... end
module PulseSummary : sig ... end
module PulseTopl : sig ... end
module PulseTrace : sig ... end
module PulseUninitBlocklist : sig ... end
module PulseValueHistory : sig ... end
module QSafeCapped : sig ... end
module ZSafe : sig ... end
Module
Pulselib__PulseAbductiveDomain.AddressAttributes
BaseAddressAttributes
but that also take care of propagating facts to the preconditionval abduce_and_add : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t
val add_one : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attribute.t -> t -> t
val add_attrs : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t
val check_valid : ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> Pulselib.PulseBasicInterface.Trace.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (t, Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : Pulselib.PulseBasicInterface.Trace.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (t, unit) IStdlib.IStd.result
val invalidate : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val replace_must_be_valid_reason : Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val allocate : IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val add_dynamic_type : IR.Typ.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val get_allocation : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * Pulselib.PulseBasicInterface.Trace.t) option
val get_closure_proc_name : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val is_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val std_vector_reserve : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val add_unreachable_at : Pulselib.PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val find_opt : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Attributes.t option
val check_valid_isl : Pulselib.PulseBasicInterface.Trace.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> ?null_noop:bool -> t -> (t, [> `ISLError of t | `InvalidAccess of Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t * t ]) IStdlib.IStd.result list
Module
Pulselib__PulseAbductiveDomain.AddressAttributes
BaseAddressAttributes
but that also take care of propagating facts to the preconditionval abduce_and_add : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t
val add_one : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attribute.t -> t -> t
val add_attrs : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t
val check_valid : Pulselib.PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> Pulselib.PulseBasicInterface.Trace.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (t, Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : Pulselib.PulseBasicInterface.PathContext.t -> Pulselib.PulseBasicInterface.Trace.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (t, unit) IStdlib.IStd.result
val invalidate : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val replace_must_be_valid_reason : Pulselib.PulseBasicInterface.PathContext.t -> Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val allocate : IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val add_dynamic_type : IR.Typ.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val get_allocation : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * Pulselib.PulseBasicInterface.Trace.t) option
val get_closure_proc_name : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val is_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val std_vector_reserve : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val add_unreachable_at : Pulselib.PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val find_opt : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Attributes.t option
val check_valid_isl : Pulselib.PulseBasicInterface.PathContext.t -> Pulselib.PulseBasicInterface.Trace.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> ?null_noop:bool -> t -> (t, [> `ISLError of t | `InvalidAccess of Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t * t ]) IStdlib.IStd.result list
Module
Pulselib__PulseAbductiveDomain.Stack
BaseStack
but that also take care of propagating facts to the preconditionval add : IR.Var.t -> BaseStack.value -> t -> t
val remove_vars : IR.Var.t list -> t -> t
val fold : (IR.Var.t -> BaseStack.value -> 'a -> 'a) -> t -> 'a -> 'a
val find_opt : IR.Var.t -> t -> BaseStack.value option
val eval : IBase.Location.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> IR.Var.t -> t -> t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)
Module
Pulselib__PulseAbductiveDomain.Stack
BaseStack
but that also take care of propagating facts to the preconditionval add : IR.Var.t -> BaseStack.value -> t -> t
val remove_vars : IR.Var.t list -> t -> t
val fold : (IR.Var.t -> BaseStack.value -> 'a -> 'a) -> t -> 'a -> 'a
val find_opt : IR.Var.t -> t -> BaseStack.value option
val eval : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> IR.Var.t -> t -> t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)
Module
Pulselib__PulseArithmetic
module AbductiveDomain = Pulselib.PulseAbductiveDomain
module AccessResult = Pulselib.PulseAccessResult
val and_nonnegative : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_positive : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_eq_int : Pulselib.PulseBasicInterface.AbstractValue.t -> IR.IntLit.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
type operand
= Pulselib.PulseBasicInterface.PathCondition.operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of Pulselib.PulseBasicInterface.AbstractValue.t
val eval_binop : Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val eval_unop : Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Unop.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_eq_zero : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val prune_positive : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val is_known_zero : AbductiveDomain.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> bool
val is_unsat_cheap : AbductiveDomain.t -> bool
val has_no_assumptions : AbductiveDomain.t -> bool
val and_equal_instanceof : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Typ.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
Module
Pulselib__PulseArithmetic
module AbductiveDomain = Pulselib.PulseAbductiveDomain
module AccessResult = Pulselib.PulseAccessResult
val and_nonnegative : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_positive : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val and_eq_int : Pulselib.PulseBasicInterface.AbstractValue.t -> IR.IntLit.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
type operand
= Pulselib.PulseBasicInterface.PathCondition.operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of Pulselib.PulseBasicInterface.AbstractValue.t
|
FunctionApplicationOperand of
{
f : Pulselib.PulseFormula.function_symbol;
actuals : Pulselib.PulseBasicInterface.AbstractValue.t list;
}
val and_equal : operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val eval_binop : Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val eval_unop : Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Unop.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
val prune_eq_zero : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val prune_positive : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
prune_binop
val is_known_zero : AbductiveDomain.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> bool
val is_unsat_cheap : AbductiveDomain.t -> bool
val has_no_assumptions : AbductiveDomain.t -> bool
val and_equal_instanceof : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Typ.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t
Module
Pulselib__PulseAttribute.Attributes
include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type rank
type elt
= t
val add : t -> elt -> t
val empty : t
val find_rank : t -> rank -> elt option
val fold : t -> init:'accum -> f:('accum -> elt -> 'accum) -> 'accum
val fold_map : t -> init:'accum -> f:('accum -> elt -> 'accum * elt) -> 'accum * t
val for_all : f:(elt -> bool) -> t -> bool
val is_empty : t -> bool
val is_singleton : t -> bool
val is_subset : t -> of_:t -> bool
val map : t -> f:(elt -> elt) -> t
val singleton : elt -> t
val elements : t -> elt list
val remove : elt -> t -> t
val mem : elt -> t -> bool
val union_prefer_left : t -> t -> t
lhs
and rhs
, keep the one from lhs
in union_prefer_left lhs rhs
val pp : ?print_rank:bool -> IStdlib.PrettyPrintable.F.formatter -> t -> unit
val get_address_of_stack_variable : t -> (IR.Var.t * IBase.Location.t * ValueHistory.t) option
val get_closure_proc_name : t -> IR.Procname.t option
val get_allocation : t -> (IR.Procname.t * Trace.t) option
val get_dynamic_type : t -> IR.Typ.t option
val is_end_of_collection : t -> bool
val get_invalid : t -> (Invalidation.t * Trace.t) option
val get_isl_abduced : t -> Trace.t option
val get_must_be_valid : t -> (Trace.t * Invalidation.must_be_valid_reason option) option
val get_written_to : t -> Trace.t option
val is_modified : t -> bool
val is_std_vector_reserved : t -> bool
val is_uninitialized : t -> bool
val get_must_be_initialized : t -> Trace.t option
val get_unreachable_at : t -> IBase.Location.t option
val isl_subset : t -> t -> bool
Attributes
.isl_equiv.val replace_isl_abduced : t -> t -> t
val add_call : IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
Module
Pulselib__PulseAttribute.Attributes
include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type rank
type elt
= t
val add : t -> elt -> t
val empty : t
val find_rank : t -> rank -> elt option
val fold : t -> init:'accum -> f:('accum -> elt -> 'accum) -> 'accum
val fold_map : t -> init:'accum -> f:('accum -> elt -> 'accum * elt) -> 'accum * t
val for_all : f:(elt -> bool) -> t -> bool
val is_empty : t -> bool
val is_singleton : t -> bool
val is_subset : t -> of_:t -> bool
val map : t -> f:(elt -> elt) -> t
val singleton : elt -> t
val elements : t -> elt list
val remove : elt -> t -> t
val mem : elt -> t -> bool
val union_prefer_left : t -> t -> t
lhs
and rhs
, keep the one from lhs
in union_prefer_left lhs rhs
val pp : ?print_rank:bool -> IStdlib.PrettyPrintable.F.formatter -> t -> unit
val get_address_of_stack_variable : t -> (IR.Var.t * IBase.Location.t * ValueHistory.t) option
val get_closure_proc_name : t -> IR.Procname.t option
val get_allocation : t -> (IR.Procname.t * Trace.t) option
val get_dynamic_type : t -> IR.Typ.t option
val is_end_of_collection : t -> bool
val get_invalid : t -> (Invalidation.t * Trace.t) option
val get_isl_abduced : t -> Trace.t option
val get_must_be_valid : t -> (PathContext.timestamp * Trace.t * Invalidation.must_be_valid_reason option) option
val get_written_to : t -> Trace.t option
val is_modified : t -> bool
val is_std_vector_reserved : t -> bool
val is_uninitialized : t -> bool
val get_must_be_initialized : t -> (PathContext.timestamp * Trace.t) option
val get_unreachable_at : t -> IBase.Location.t option
val isl_subset : t -> t -> bool
Attributes
.isl_equiv.val replace_isl_abduced : t -> t -> t
val add_call : PathContext.t -> IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
Module
Pulselib__PulseAttribute
module Invalidation = Pulselib.PulseInvalidation
module Trace = Pulselib.PulseTrace
module ValueHistory = Pulselib.PulseValueHistory
type t
=
|
AddressOfCppTemporary of IR.Var.t * ValueHistory.t
|
AddressOfStackVariable of IR.Var.t * IBase.Location.t * ValueHistory.t
|
Allocated of IR.Procname.t * Trace.t
Procname
.t is the function causing the allocation, eg malloc
|
Closure of IR.Procname.t
|
DynamicType of IR.Typ.t
|
EndOfCollection
|
Invalid of Invalidation.t * Trace.t
|
ISLAbduced of Trace.t
|
MustBeInitialized of Trace.t
|
MustBeValid of Trace.t * Invalidation.must_be_valid_reason option
|
StdVectorReserve
|
Uninitialized
|
UnreachableAt of IBase.Location.t
|
WrittenTo of Trace.t
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
Module
Pulselib__PulseAttribute
module Invalidation = Pulselib.PulseInvalidation
module PathContext = Pulselib.PulsePathContext
module Trace = Pulselib.PulseTrace
module ValueHistory = Pulselib.PulseValueHistory
type t
=
|
AddressOfCppTemporary of IR.Var.t * ValueHistory.t
|
AddressOfStackVariable of IR.Var.t * IBase.Location.t * ValueHistory.t
|
Allocated of IR.Procname.t * Trace.t
Procname
.t is the function causing the allocation, eg malloc
|
Closure of IR.Procname.t
|
DynamicType of IR.Typ.t
|
EndOfCollection
|
Invalid of Invalidation.t * Trace.t
|
ISLAbduced of Trace.t
|
MustBeInitialized of PathContext.timestamp * Trace.t
|
MustBeValid of PathContext.timestamp * Trace.t * Invalidation.must_be_valid_reason option
|
StdVectorReserve
|
Uninitialized
|
UnreachableAt of IBase.Location.t
|
WrittenTo of Trace.t
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
Module
Pulselib__PulseBaseAddressAttributes
val empty : t
val filter : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> bool) -> t -> t
val for_all : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> bool) -> t -> bool
val filter_with_discarded_addrs : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> bool) -> t -> t * Pulselib.PulseBasicInterface.AbstractValue.t list
val find_opt : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Attributes.t option
val add_one : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attribute.t -> t -> t
val add : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t
val allocate : IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val fold : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> 'a -> 'a) -> t -> 'a -> 'a
val check_valid : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (unit, Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (unit, unit) IStdlib.IStd.result
val invalidate : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val get_allocation : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * Pulselib.PulseBasicInterface.Trace.t) option
val get_closure_proc_name : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val get_invalid : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t) option
val get_must_be_valid : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (Pulselib.PulseBasicInterface.Trace.t * Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason option) option
val is_must_be_valid_or_allocated_isl : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val get_must_be_initialized : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Trace.t option
val add_dynamic_type : IR.Typ.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val get_dynamic_type : t -> Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Typ.t option
val std_vector_reserve : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val is_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val add_unreachable_at : Pulselib.PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val pp : F.formatter -> t -> unit
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_must_be_valid_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_isl_abduced_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val initialize : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val canonicalize : get_var_repr:(Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.AbstractValue.t) -> t -> t
get_var_repr
and remove non-canonical variables in favor of their rerpresentativeval subst_var : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.AbstractValue.t) -> t -> t
Module
Pulselib__PulseBaseAddressAttributes
val empty : t
val filter : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> bool) -> t -> t
val for_all : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> bool) -> t -> bool
val filter_with_discarded_addrs : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> bool) -> t -> t * Pulselib.PulseBasicInterface.AbstractValue.t list
val find_opt : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Attributes.t option
val add_one : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attribute.t -> t -> t
val add : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t
val allocate : IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val fold : (Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> 'a -> 'a) -> t -> 'a -> 'a
val check_valid : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (unit, Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t) IStdlib.IStd.result
val check_initialized : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (unit, unit) IStdlib.IStd.result
val invalidate : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseBasicInterface.Invalidation.t -> IBase.Location.t -> t -> t
val get_allocation : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (IR.Procname.t * Pulselib.PulseBasicInterface.Trace.t) option
val get_closure_proc_name : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> IR.Procname.t option
val get_invalid : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (Pulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t) option
val get_must_be_valid : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (Pulselib.PulseBasicInterface.PathContext.timestamp * Pulselib.PulseBasicInterface.Trace.t * Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason option) option
val is_must_be_valid_or_allocated_isl : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val get_must_be_initialized : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> (Pulselib.PulseBasicInterface.PathContext.timestamp * Pulselib.PulseBasicInterface.Trace.t) option
val add_dynamic_type : IR.Typ.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val get_dynamic_type : t -> Pulselib.PulseBasicInterface.AbstractValue.t -> IR.Typ.t option
val std_vector_reserve : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val is_std_vector_reserved : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val mark_as_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val is_end_of_collection : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> bool
val add_unreachable_at : Pulselib.PulseBasicInterface.AbstractValue.t -> IBase.Location.t -> t -> t
val pp : F.formatter -> t -> unit
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_must_be_valid_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_isl_abduced_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val initialize : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val canonicalize : get_var_repr:(Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.AbstractValue.t) -> t -> t
get_var_repr
and remove non-canonical variables in favor of their rerpresentativeval subst_var : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.AbstractValue.t) -> t -> t
Module
Pulselib__PulseBasicInterface
module AbstractValue = Pulselib.PulseAbstractValue
module Attribute = Pulselib.PulseAttribute
module Attributes = Pulselib.PulseAttribute.Attributes
module CallEvent = Pulselib.PulseCallEvent
module Diagnostic = Pulselib.PulseDiagnostic
module Invalidation = Pulselib.PulseInvalidation
module PathCondition = Pulselib.PulsePathCondition
module SatUnsat = Pulselib.PulseSatUnsat
module SkippedCalls = Pulselib.PulseSkippedCalls
module Trace = Pulselib.PulseTrace
module ValueHistory = Pulselib.PulseValueHistory
include SatUnsat.Types
type nonrec 'a sat_unsat_t
= 'a Pulselib.PulseSatUnsat.t
=
|
Unsat
|
Sat of 'a
Enforce short form usage
include sig ... end
module PulseAbstractValue = Pulselib.PulseAbstractValue
module PulseAttribute = Pulselib.PulseAttribute
module PulseCallEvent = Pulselib.PulseCallEvent
module PulseDiagnostic = Pulselib.PulseDiagnostic
module PulseInvalidation = Pulselib.PulseInvalidation
module PulsePathCondition = Pulselib.PulsePathCondition
module PulseSkippedCalls = Pulselib.PulseSkippedCalls
module PulseTrace = Pulselib.PulseTrace
module PulseValueHistory = Pulselib.PulseValueHistory
module PulseSatUnsat = Pulselib.PulseSatUnsat
Module
Pulselib__PulseBasicInterface
module AbstractValue = Pulselib.PulseAbstractValue
module Attribute = Pulselib.PulseAttribute
module Attributes = Pulselib.PulseAttribute.Attributes
module CallEvent = Pulselib.PulseCallEvent
module Diagnostic = Pulselib.PulseDiagnostic
module Invalidation = Pulselib.PulseInvalidation
module PathCondition = Pulselib.PulsePathCondition
module PathContext = Pulselib.PulsePathContext
module SatUnsat = Pulselib.PulseSatUnsat
module SkippedCalls = Pulselib.PulseSkippedCalls
module Trace = Pulselib.PulseTrace
module ValueHistory = Pulselib.PulseValueHistory
include SatUnsat.Types
type nonrec 'a sat_unsat_t
= 'a Pulselib.PulseSatUnsat.t
=
|
Unsat
|
Sat of 'a
Enforce short form usage
include sig ... end
module PulseAbstractValue = Pulselib.PulseAbstractValue
module PulseAttribute = Pulselib.PulseAttribute
module PulseCallEvent = Pulselib.PulseCallEvent
module PulseDiagnostic = Pulselib.PulseDiagnostic
module PulseInvalidation = Pulselib.PulseInvalidation
module PulsePathCondition = Pulselib.PulsePathCondition
module PulsePathContext = Pulselib.PulsePathContext
module PulseSkippedCalls = Pulselib.PulseSkippedCalls
module PulseTrace = Pulselib.PulseTrace
module PulseValueHistory = Pulselib.PulseValueHistory
module PulseSatUnsat = Pulselib.PulseSatUnsat
Module
Pulselib__PulseCallOperations
val call : IR.Tenv.t -> caller_proc_desc:IR.Procdesc.t -> callee_data:(IR.Procdesc.t * Pulselib.PulseSummary.t) option -> IBase.Location.t -> IR.Procname.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseDomainInterface.AccessResult.t list
val unknown_call : IR.Tenv.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.CallEvent.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> t
val conservatively_initialize_args : Pulselib.PulseBasicInterface.AbstractValue.t list -> t -> t
Module
Pulselib__PulseCallOperations
val call : IR.Tenv.t -> Pulselib.PulseBasicInterface.PathContext.t -> caller_proc_desc:IR.Procdesc.t -> callee_data:(IR.Procdesc.t * Pulselib.PulseSummary.t) option -> IBase.Location.t -> IR.Procname.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseDomainInterface.AccessResult.t list
val unknown_call : IR.Tenv.t -> Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.CallEvent.t -> ret:(IR.Ident.t * IR.Typ.t) -> actuals:((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> formals_opt:(IR.Pvar.t * IR.Typ.t) list option -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val conservatively_initialize_args : Pulselib.PulseBasicInterface.AbstractValue.t list -> t -> t
Module
Pulselib__PulseFormula
module SatUnsat = Pulselib.PulseSatUnsat
module Var = Pulselib.PulseAbstractValue
Arithmetic solver
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit
type operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of Var.t
Build formulas
type new_eq
=
|
EqZero of Var.t
|
Equal of Var.t * Var.t
type new_eqs
= new_eq list
val ttrue : t
val and_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_instanceof : Var.t -> Var.t -> IR.Typ.t -> t -> (t * new_eqs) SatUnsat.t
val and_less_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_less_than : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_unop : Var.t -> IR.Unop.t -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_binop : Var.t -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
Operations
val normalize : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> t -> (t * new_eqs) SatUnsat.t
val simplify : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> can_be_pruned:Var.Set.t -> keep:Var.Set.t -> t -> (t * Var.Set.t * new_eqs) SatUnsat.t
val and_fold_subst_variables : t -> up_to_f:t -> init:'acc -> f:('acc -> Var.t -> 'acc * Var.t) -> ('acc * t * new_eqs) SatUnsat.t
val is_known_zero : t -> Var.t -> bool
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> Var.t -> Var.t
Module
Pulselib__PulseFormula
module SatUnsat = Pulselib.PulseSatUnsat
module Var = Pulselib.PulseAbstractValue
Arithmetic solver
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit
type function_symbol
=
|
Unknown of Var.t
|
Procname of IR.Procname.t
val compare_function_symbol : function_symbol -> function_symbol -> int
type operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of Var.t
|
FunctionApplicationOperand of
{
f : function_symbol;
actuals : Var.t list;
}
Build formulas
type new_eq
=
|
EqZero of Var.t
|
Equal of Var.t * Var.t
type new_eqs
= new_eq list
val ttrue : t
val and_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_instanceof : Var.t -> Var.t -> IR.Typ.t -> t -> (t * new_eqs) SatUnsat.t
val and_less_equal : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_less_than : operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_unop : Var.t -> IR.Unop.t -> operand -> t -> (t * new_eqs) SatUnsat.t
val and_equal_binop : Var.t -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> (t * new_eqs) SatUnsat.t
Operations
val normalize : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> t -> (t * new_eqs) SatUnsat.t
val simplify : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> can_be_pruned:Var.Set.t -> keep:Var.Set.t -> t -> (t * Var.Set.t * new_eqs) SatUnsat.t
val and_fold_subst_variables : t -> up_to_f:t -> init:'acc -> f:('acc -> Var.t -> 'acc * Var.t) -> ('acc * t * new_eqs) SatUnsat.t
val is_known_zero : t -> Var.t -> bool
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> Var.t -> Var.t
Module
Pulselib__PulseInterproc
val apply_prepost : is_isl_error_prepost:bool -> IR.Procname.t -> IBase.Location.t -> callee_prepost:Pulselib.PulseDomainInterface.AbductiveDomain.t -> captured_vars_with_actuals:(IR.Var.t * ((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list -> formals:IR.Var.t list -> actuals:((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> Pulselib.PulseDomainInterface.AbductiveDomain.t -> (Pulselib.PulseDomainInterface.AbductiveDomain.t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) option * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) Pulselib.PulseBasicInterface.AbstractValue.Map.t) Pulselib.PulseDomainInterface.AccessResult.t Pulselib.PulseBasicInterface.SatUnsat.t
SatUnsat
.Unsat if that path in the callee is infeasiblecallee_abstract_value -> caller_abstract_value
mapping callee's abstract values to what they became in the new (caller) stateModule
Pulselib__PulseInterproc
val apply_prepost : Pulselib.PulseBasicInterface.PathContext.t -> is_isl_error_prepost:bool -> IR.Procname.t -> IBase.Location.t -> callee_prepost:Pulselib.PulseDomainInterface.AbductiveDomain.t -> captured_vars_with_actuals:(IR.Var.t * ((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list -> formals:IR.Var.t list -> actuals:((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t) list -> Pulselib.PulseDomainInterface.AbductiveDomain.t -> (Pulselib.PulseDomainInterface.AbductiveDomain.t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) option * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) Pulselib.PulseBasicInterface.AbstractValue.Map.t) Pulselib.PulseDomainInterface.AccessResult.t Pulselib.PulseBasicInterface.SatUnsat.t
SatUnsat
.Unsat if that path in the callee is infeasiblecallee_abstract_value -> caller_abstract_value
mapping callee's abstract values to what they became in the new (caller) stateModule
Pulselib__PulseInvalidation
type std_vector_function
=
|
Assign
|
Clear
|
Emplace
|
EmplaceBack
|
Insert
|
PushBack
|
Reserve
|
ShrinkToFit
val pp_std_vector_function : F.formatter -> std_vector_function -> unit
type java_iterator_function
=
|
Remove
type t
=
|
CFree
|
ConstantDereference of IR.IntLit.t
|
CppDelete
|
EndIterator
|
GoneOutOfScope of IR.Pvar.t * IR.Typ.t
|
OptionalEmpty
|
StdVector of std_vector_function
|
JavaIterator of java_iterator_function
val compare_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> int
val equal_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> bool
val pp_must_be_valid_reason : F.formatter -> must_be_valid_reason option -> unit
val issue_type_of_cause : t -> must_be_valid_reason option -> IBase.IssueType.t
Module
Pulselib__PulseInvalidation
type std_vector_function
=
|
Assign
|
Clear
|
Emplace
|
EmplaceBack
|
Insert
|
PushBack
|
Reserve
|
ShrinkToFit
val pp_std_vector_function : F.formatter -> std_vector_function -> unit
type java_iterator_function
=
|
Remove
type t
=
|
CFree
|
ConstantDereference of IR.IntLit.t
|
CppDelete
|
EndIterator
|
GoneOutOfScope of IR.Pvar.t * IR.Typ.t
|
OptionalEmpty
|
StdVector of std_vector_function
|
JavaIterator of java_iterator_function
type must_be_valid_reason
=
|
BlockCall
|
InsertionIntoCollection
|
SelfOfNonPODReturnMethod of IR.Typ.t
val compare_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> int
val equal_must_be_valid_reason : must_be_valid_reason -> must_be_valid_reason -> bool
val pp_must_be_valid_reason : F.formatter -> must_be_valid_reason option -> unit
val issue_type_of_cause : t -> must_be_valid_reason option -> IBase.IssueType.t
Module
Pulselib__PulseModels
type model_data
=
{
analysis_data : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t;
callee_procname : IR.Procname.t;
location : IBase.Location.t;
ret : IR.Ident.t * IR.Typ.t;
}
type model
= model_data -> Pulselib.PulseDomainInterface.AbductiveDomain.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseDomainInterface.AccessResult.t list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
Module
Pulselib__PulseModels
type model_data
=
{
analysis_data : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t;
path : Pulselib.PulseBasicInterface.PathContext.t;
callee_procname : IR.Procname.t;
location : IBase.Location.t;
ret : IR.Ident.t * IR.Typ.t;
}
type model
= model_data -> Pulselib.PulseDomainInterface.AbductiveDomain.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseDomainInterface.AccessResult.t list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
Module
Pulselib__PulseOperations.Closures
val check_captured_addresses : IBase.Location.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
Module
Pulselib__PulseOperations.Closures
val check_captured_addresses : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
Module
Pulselib__PulseOperations
module Import : sig ... end
open
ing in other modules.include module type of Import
type access_mode
=
Imported types for ease of use and so we can write variants without the corresponding module prefix
type 'abductive_domain_t execution_domain_base_t
= 'abductive_domain_t Pulselib.PulseDomainInterface.ExecutionDomain.base_t
=
|
ContinueProgram of 'abductive_domain_t
|
ExitProgram of Pulselib.PulseDomainInterface.AbductiveDomain.summary
|
AbortProgram of Pulselib.PulseDomainInterface.AbductiveDomain.summary
|
LatentAbortProgram of
{
astate : Pulselib.PulseDomainInterface.AbductiveDomain.summary;
latent_issue : Pulselib.PulseDomainInterface.LatentIssue.t;
}
|
LatentInvalidAccess of
{
astate : Pulselib.PulseDomainInterface.AbductiveDomain.summary;
address : Pulselib.PulseBasicInterface.AbstractValue.t;
must_be_valid : Pulselib.PulseBasicInterface.Trace.t * Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason option;
calling_context : (Pulselib.PulseBasicInterface.CallEvent.t * IBase.Location.t) list;
}
|
ISLLatentMemoryError of Pulselib.PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error
= 'astate Pulselib.PulseDomainInterface.AccessResult.error
=
|
PotentialInvalidAccess of
{
astate : 'astate;
address : Pulselib.PulseBasicInterface.AbstractValue.t;
must_be_valid : Pulselib.PulseBasicInterface.Trace.t * Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason option;
}
|
PotentialInvalidAccessSummary of
{
}
|
ReportableError of
{
astate : 'astate;
diagnostic : Pulselib.PulseBasicInterface.Diagnostic.t;
}
|
ReportableErrorSummary of
{
astate : Pulselib.PulseDomainInterface.AbductiveDomain.summary;
diagnostic : Pulselib.PulseBasicInterface.Diagnostic.t;
}
|
ISLError of 'astate
Monadic syntax
include module type of IStdlib.IResult.Let_syntax
include module type of IStdlib.IStd.Result.Monad_infix
val let+ : ('ok, 'err) IStdlib.IStd.result -> ('ok -> 'okk) -> ('okk, 'err) IStdlib.IStd.result
val let* : ('ok, 'err) IStdlib.IStd.result -> ('ok -> ('okk, 'err) IStdlib.IStd.result) -> ('okk, 'err) IStdlib.IStd.result
val let<*> : 'a Pulselib.PulseDomainInterface.AccessResult.t -> ('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t list) -> 'b Pulselib.PulseDomainInterface.AccessResult.t list
AccessResult.t
into a list of AccessResult.t
s (not really because the first type is not an AccessResult.t list
but just an AccessResult.t
)val let<+> : 'a Pulselib.PulseDomainInterface.AccessResult.t -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t execution_domain_base_t Pulselib.PulseDomainInterface.AccessResult.t list
AccessResult.t
into an analysis resultval check_addr_access : ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
address
is not known to be invalidmodule Closures : sig ... end
val eval : access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
val eval_structure_isl : access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (bool * (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t list) Pulselib.PulseDomainInterface.AccessResult.t
val prune : IBase.Location.t -> condition:IR.Exp.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val eval_deref : ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
eval
but evaluates *exp
.val eval_deref_isl : IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t list
val eval_access : ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
eval
but starts from an address instead of an expression, checks that it is valid, and if so dereferences it according to the access.val eval_deref_access : ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
eval_access
but does additional dereference.val eval_proc_name : IBase.Location.t -> IR.Exp.t -> t -> (t * IR.Procname.t option) Pulselib.PulseDomainInterface.AccessResult.t
val havoc_id : IR.Ident.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_deref_field : IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val realloc_pvar : IR.Tenv.t -> IR.Pvar.t -> IR.Typ.t -> IBase.Location.t -> t -> t
val write_id : IR.Ident.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t
val write_field : IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref --.field--> obj
val write_deref_field : IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref --.field--> _ --*--> obj
val write_arr_index : IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> index:Pulselib.PulseBasicInterface.AbstractValue.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref[index]--> obj
val write_deref : IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref --*--> obj
val write_deref_biad_isl : IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseBasicInterface.AbstractValue.t Absint.HilExp.Access.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t list
type invalidation_access
=
|
MemoryAccess of
{
pointer : Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t;
access : Pulselib.PulseDomainInterface.BaseMemory.Access.t;
hist_obj_default : Pulselib.PulseBasicInterface.ValueHistory.t;
}
access
edge at address pointer
|
StackAddress of IR.Var.t * Pulselib.PulseBasicInterface.ValueHistory.t
|
UntraceableAccess
Invalid
attributeval invalidate : invalidation_access -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val invalidate_biad_isl : IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t list
val allocate : IR.Procname.t -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t
val add_dynamic_type : IR.Typ.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val invalidate_access : IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val invalidate_deref_access : IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
invalidate_access
but invalidates dereferenced address.val invalidate_array_elements : IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val shallow_copy : IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list
val remove_vars : IR.Var.t list -> IBase.Location.t -> t -> t
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val get_captured_actuals : IBase.Location.t -> captured_vars:(IR.Var.t * IR.CapturedVar.capture_mode * IR.Typ.t) list -> actual_closure:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> (t * (IR.Var.t * ((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list) Pulselib.PulseDomainInterface.AccessResult.t
Module
Pulselib__PulseOperations
module Import : sig ... end
open
ing in other modules.include module type of Import
type access_mode
=
Imported types for ease of use and so we can write variants without the corresponding module prefix
type 'abductive_domain_t execution_domain_base_t
= 'abductive_domain_t Pulselib.PulseDomainInterface.ExecutionDomain.base_t
=
|
ContinueProgram of 'abductive_domain_t
|
ExitProgram of Pulselib.PulseDomainInterface.AbductiveDomain.summary
|
AbortProgram of Pulselib.PulseDomainInterface.AbductiveDomain.summary
|
LatentAbortProgram of
{
astate : Pulselib.PulseDomainInterface.AbductiveDomain.summary;
latent_issue : Pulselib.PulseDomainInterface.LatentIssue.t;
}
|
LatentInvalidAccess of
{
astate : Pulselib.PulseDomainInterface.AbductiveDomain.summary;
address : Pulselib.PulseBasicInterface.AbstractValue.t;
must_be_valid : Pulselib.PulseBasicInterface.Trace.t * Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason option;
calling_context : (Pulselib.PulseBasicInterface.CallEvent.t * IBase.Location.t) list;
}
|
ISLLatentMemoryError of Pulselib.PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error
= 'astate Pulselib.PulseDomainInterface.AccessResult.error
=
|
PotentialInvalidAccess of
{
astate : 'astate;
address : Pulselib.PulseBasicInterface.AbstractValue.t;
must_be_valid : Pulselib.PulseBasicInterface.Trace.t * Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason option;
}
|
PotentialInvalidAccessSummary of
{
}
|
ReportableError of
{
astate : 'astate;
diagnostic : Pulselib.PulseBasicInterface.Diagnostic.t;
}
|
ReportableErrorSummary of
{
astate : Pulselib.PulseDomainInterface.AbductiveDomain.summary;
diagnostic : Pulselib.PulseBasicInterface.Diagnostic.t;
}
|
ISLError of 'astate
Monadic syntax
include module type of IStdlib.IResult.Let_syntax
include module type of IStdlib.IStd.Result.Monad_infix
val let+ : ('ok, 'err) IStdlib.IStd.result -> ('ok -> 'okk) -> ('okk, 'err) IStdlib.IStd.result
val let* : ('ok, 'err) IStdlib.IStd.result -> ('ok -> ('okk, 'err) IStdlib.IStd.result) -> ('okk, 'err) IStdlib.IStd.result
val let<*> : 'a Pulselib.PulseDomainInterface.AccessResult.t -> ('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t list) -> 'b Pulselib.PulseDomainInterface.AccessResult.t list
AccessResult.t
into a list of AccessResult.t
s (not really because the first type is not an AccessResult.t list
but just an AccessResult.t
)val let<+> : 'a Pulselib.PulseDomainInterface.AccessResult.t -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t execution_domain_base_t Pulselib.PulseDomainInterface.AccessResult.t list
AccessResult.t
into an analysis resultval check_addr_access : Pulselib.PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
address
is not known to be invalidmodule Closures : sig ... end
val eval : Pulselib.PulseBasicInterface.PathContext.t -> access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
val eval_structure_isl : Pulselib.PulseBasicInterface.PathContext.t -> access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (bool * (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t list) Pulselib.PulseDomainInterface.AccessResult.t
val prune : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> condition:IR.Exp.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val eval_deref : Pulselib.PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
eval
but evaluates *exp
.val eval_deref_isl : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t list
val eval_access : Pulselib.PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
eval
but starts from an address instead of an expression, checks that it is valid, and if so dereferences it according to the access.val eval_deref_access : Pulselib.PulseBasicInterface.PathContext.t -> ?must_be_valid_reason:Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason -> access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
eval_access
but does additional dereference.val eval_proc_name : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> IR.Exp.t -> t -> (t * IR.Procname.t option) Pulselib.PulseDomainInterface.AccessResult.t
val havoc_id : IR.Ident.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_deref_field : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val realloc_pvar : IR.Tenv.t -> IR.Pvar.t -> IR.Typ.t -> IBase.Location.t -> t -> t
val write_id : IR.Ident.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t
val write_field : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref --.field--> obj
val write_deref_field : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref --.field--> _ --*--> obj
val write_arr_index : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> index:Pulselib.PulseBasicInterface.AbstractValue.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref[index]--> obj
val write_deref : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
ref --*--> obj
val write_deref_biad_isl : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseBasicInterface.AbstractValue.t Absint.HilExp.Access.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t list
type invalidation_access
=
|
MemoryAccess of
{
pointer : Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t;
access : Pulselib.PulseDomainInterface.BaseMemory.Access.t;
hist_obj_default : Pulselib.PulseBasicInterface.ValueHistory.t;
}
access
edge at address pointer
|
StackAddress of IR.Var.t * Pulselib.PulseBasicInterface.ValueHistory.t
|
UntraceableAccess
Invalid
attributeval invalidate : Pulselib.PulseBasicInterface.PathContext.t -> invalidation_access -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val invalidate_biad_isl : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t list
val allocate : IR.Procname.t -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t
val add_dynamic_type : IR.Typ.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val invalidate_access : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val invalidate_deref_access : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
invalidate_access
but invalidates dereferenced address.val invalidate_array_elements : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val shallow_copy : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) Pulselib.PulseDomainInterface.AccessResult.t
val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list
val remove_vars : IR.Var.t list -> IBase.Location.t -> t -> t
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val get_captured_actuals : Pulselib.PulseBasicInterface.PathContext.t -> IBase.Location.t -> captured_vars:(IR.Var.t * IR.CapturedVar.capture_mode * IR.Typ.t) list -> actual_closure:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> (t * (IR.Var.t * ((Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) * IR.Typ.t)) list) Pulselib.PulseDomainInterface.AccessResult.t
Module
Pulselib__PulsePathCondition
module AbstractValue = Pulselib.PulseAbstractValue
module SatUnsat = Pulselib.PulseSatUnsat
module ValueHistory = Pulselib.PulseValueHistory
type new_eqs
= Pulselib.PulseFormula.new_eqs
Building arithmetic constraints
val and_nonnegative : AbstractValue.t -> t -> t * new_eqs
and_nonnegative v phi
is phi ∧ v≥0
val and_positive : AbstractValue.t -> t -> t * new_eqs
and_positive v phi
is phi ∧ v>0
val and_eq_int : AbstractValue.t -> IR.IntLit.t -> t -> t * new_eqs
and_eq_int v i phi
is phi ∧ v=i
val and_eq_vars : AbstractValue.t -> AbstractValue.t -> t -> t * new_eqs
val simplify : IR.Tenv.t -> can_be_pruned:AbstractValue.Set.t -> keep:AbstractValue.Set.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> (t * AbstractValue.Set.t * new_eqs) SatUnsat.t
simplify ~can_be_pruned ~keep phi
attempts to get rid of as many variables in fv phi
but not in keep
as possible, and tries to eliminate variables not in can_be_pruned
from the "pruned" part of the formulaval and_callee : (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t -> t -> callee:t -> (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t * t * new_eqs
Operations
type operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of AbstractValue.t
val pp_operand : IStdlib.IStd.Formatter.t -> operand -> unit
val eval_binop : AbstractValue.t -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val eval_unop : AbstractValue.t -> IR.Unop.t -> AbstractValue.t -> t -> t * new_eqs
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val and_eq_instanceof : AbstractValue.t -> AbstractValue.t -> IR.Typ.t -> t -> t * new_eqs
Queries
val is_known_zero : t -> AbstractValue.t -> bool
is_known_zero phi t
returns true
if phi |- t = 0
, false
if we don't know for sureval is_known_not_equal_zero : t -> AbstractValue.t -> bool
is_known_not_equal_zero phi t
returns true
if phi |- t != 0
, false
if we don't know for sureval is_unsat_cheap : t -> bool
val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t
val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t
Module
Pulselib__PulsePathCondition
module AbstractValue = Pulselib.PulseAbstractValue
module SatUnsat = Pulselib.PulseSatUnsat
module ValueHistory = Pulselib.PulseValueHistory
type new_eqs
= Pulselib.PulseFormula.new_eqs
Building arithmetic constraints
val and_nonnegative : AbstractValue.t -> t -> t * new_eqs
and_nonnegative v phi
is phi ∧ v≥0
val and_positive : AbstractValue.t -> t -> t * new_eqs
and_positive v phi
is phi ∧ v>0
val and_eq_int : AbstractValue.t -> IR.IntLit.t -> t -> t * new_eqs
and_eq_int v i phi
is phi ∧ v=i
val and_eq_vars : AbstractValue.t -> AbstractValue.t -> t -> t * new_eqs
val simplify : IR.Tenv.t -> can_be_pruned:AbstractValue.Set.t -> keep:AbstractValue.Set.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> (t * AbstractValue.Set.t * new_eqs) SatUnsat.t
simplify ~can_be_pruned ~keep phi
attempts to get rid of as many variables in fv phi
but not in keep
as possible, and tries to eliminate variables not in can_be_pruned
from the "pruned" part of the formulaval and_callee : (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t -> t -> callee:t -> (AbstractValue.t * ValueHistory.t) AbstractValue.Map.t * t * new_eqs
Operations
type operand
= Pulselib.PulseFormula.operand
=
|
LiteralOperand of IR.IntLit.t
|
AbstractValueOperand of AbstractValue.t
|
FunctionApplicationOperand of
{
f : Pulselib.PulseFormula.function_symbol;
actuals : AbstractValue.t list;
}
val and_equal : operand -> operand -> t -> t * new_eqs
val eval_binop : AbstractValue.t -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val eval_unop : AbstractValue.t -> IR.Unop.t -> AbstractValue.t -> t -> t * new_eqs
val prune_binop : negated:bool -> IR.Binop.t -> operand -> operand -> t -> t * new_eqs
val and_eq_instanceof : AbstractValue.t -> AbstractValue.t -> IR.Typ.t -> t -> t * new_eqs
Queries
val is_known_zero : t -> AbstractValue.t -> bool
is_known_zero phi t
returns true
if phi |- t = 0
, false
if we don't know for sureval is_known_not_equal_zero : t -> AbstractValue.t -> bool
is_known_not_equal_zero phi t
returns true
if phi |- t != 0
, false
if we don't know for sureval is_unsat_cheap : t -> bool
val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs
val has_no_assumptions : t -> bool
val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t
val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t