From eace6140f5825f496bf8773248d2a7d7e34ae654 Mon Sep 17 00:00:00 2001 From: Daiva Naudziuniene Date: Wed, 9 Jun 2021 02:31:28 -0700 Subject: [PATCH] [website] Add documentation for Nil Messaging of non-POD return type issue Reviewed By: jvillard Differential Revision: D28964438 fbshipit-source-id: 1579cc7d2 --- .../issues/NIL_MESSAGING_TO_NON_POD.md | 24 +++++++++++++++++ infer/src/base/IssueType.ml | 4 +-- website/docs/all-issue-types.md | 26 ++++++++++++++++++- website/docs/checker-uninit.md | 2 ++ website/static/man/next/infer-analyze.1.html | 14 +++++----- website/static/man/next/infer-report.1.html | 2 +- website/static/man/next/infer.1.html | 19 ++++++++------ .../PairNoJoin/argument-1-Domain1/index.html | 2 ++ .../PairNoJoin/argument-2-Domain2/index.html | 2 ++ .../AbstractDomain/PairNoJoin/index.html | 2 ++ .../infer/Absint/AbstractDomain/index.html | 2 +- .../Absint/TaskSchedulerTypes/index.html | 2 +- .../PairNoJoin/argument-1-Domain1/index.html | 2 ++ .../PairNoJoin/argument-2-Domain2/index.html | 2 ++ .../PairNoJoin/index.html | 2 ++ .../infer/Absint__AbstractDomain/index.html | 2 +- .../Absint__TaskSchedulerTypes/index.html | 2 +- .../infer/Concurrency/RacerDModels/index.html | 2 +- .../Concurrency__RacerDModels/index.html | 2 +- .../infer/ErlangFrontend/ErlangAst/index.html | 2 +- .../ErlangTranslator/index.html | 2 +- .../ErlangFrontend__ErlangAst/index.html | 2 +- .../index.html | 2 +- .../odoc/next/infer/IBase/Config/index.html | 2 +- .../RestartSchedulerException/index.html | 2 ++ .../next/infer/IBase/SourceFile/index.html | 2 +- .../static/odoc/next/infer/IBase/index.html | 2 +- .../odoc/next/infer/IBase__Config/index.html | 2 +- .../.dune-keep | 0 .../index.html | 2 ++ .../next/infer/IBase__SourceFile/index.html | 2 +- .../odoc/next/infer/IR/BuiltinDecl/index.html | 2 +- .../next/infer/IR/ErlangTypeName/index.html | 2 ++ .../odoc/next/infer/IR/Procdesc/index.html | 2 +- .../odoc/next/infer/IR/Procname/index.html | 2 +- .../static/odoc/next/infer/IR/Typ/index.html | 2 +- website/static/odoc/next/infer/IR/index.html | 2 +- .../next/infer/IR__BuiltinDecl/index.html | 2 +- .../next/infer/IR__ErlangTypeName/.dune-keep | 0 .../next/infer/IR__ErlangTypeName/index.html | 2 ++ .../odoc/next/infer/IR__Procdesc/index.html | 2 +- .../odoc/next/infer/IR__Procname/index.html | 2 +- .../static/odoc/next/infer/IR__Typ/index.html | 2 +- .../next/infer/Integration/Driver/index.html | 2 +- .../next/infer/Integration__Driver/index.html | 2 +- .../OpenSource/FbThreadSafety/index.html | 2 +- .../OpenSource__FbThreadSafety/index.html | 2 +- .../AddressAttributes/index.html | 2 +- .../PulseAbductiveDomain/Stack/index.html | 2 +- .../infer/Pulselib/PulseArithmetic/index.html | 2 +- .../PulseAttribute/Attributes/index.html | 2 +- .../infer/Pulselib/PulseAttribute/index.html | 2 +- .../PulseBaseAddressAttributes/index.html | 2 +- .../Pulselib/PulseBasicInterface/index.html | 2 +- .../Pulselib/PulseCallOperations/index.html | 2 +- .../infer/Pulselib/PulseFormula/index.html | 2 +- .../infer/Pulselib/PulseInterproc/index.html | 2 +- .../Pulselib/PulseInvalidation/index.html | 2 +- .../infer/Pulselib/PulseModels/index.html | 2 +- .../PulseOperations/Closures/index.html | 2 +- .../infer/Pulselib/PulseOperations/index.html | 2 +- .../Pulselib/PulsePathCondition/index.html | 2 +- .../Pulselib/PulsePathContext/index.html | 2 ++ .../odoc/next/infer/Pulselib/index.html | 2 +- .../AddressAttributes/index.html | 2 +- .../Stack/index.html | 2 +- .../Pulselib__PulseArithmetic/index.html | 2 +- .../Attributes/index.html | 2 +- .../infer/Pulselib__PulseAttribute/index.html | 2 +- .../index.html | 2 +- .../Pulselib__PulseBasicInterface/index.html | 2 +- .../Pulselib__PulseCallOperations/index.html | 2 +- .../infer/Pulselib__PulseFormula/index.html | 2 +- .../infer/Pulselib__PulseInterproc/index.html | 2 +- .../Pulselib__PulseInvalidation/index.html | 2 +- .../infer/Pulselib__PulseModels/index.html | 2 +- .../Closures/index.html | 2 +- .../Pulselib__PulseOperations/index.html | 2 +- .../Pulselib__PulsePathCondition/index.html | 2 +- .../Pulselib__PulsePathContext/.dune-keep | 0 .../Pulselib__PulsePathContext/index.html | 2 ++ 81 files changed, 154 insertions(+), 79 deletions(-) create mode 100644 infer/documentation/issues/NIL_MESSAGING_TO_NON_POD.md create mode 100644 website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-1-Domain1/index.html create mode 100644 website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-2-Domain2/index.html create mode 100644 website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/index.html create mode 100644 website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/argument-1-Domain1/index.html create mode 100644 website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/argument-2-Domain2/index.html create mode 100644 website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/index.html create mode 100644 website/static/odoc/next/infer/IBase/RestartSchedulerException/index.html create mode 100644 website/static/odoc/next/infer/IBase__RestartSchedulerException/.dune-keep create mode 100644 website/static/odoc/next/infer/IBase__RestartSchedulerException/index.html create mode 100644 website/static/odoc/next/infer/IR/ErlangTypeName/index.html create mode 100644 website/static/odoc/next/infer/IR__ErlangTypeName/.dune-keep create mode 100644 website/static/odoc/next/infer/IR__ErlangTypeName/index.html create mode 100644 website/static/odoc/next/infer/Pulselib/PulsePathContext/index.html create mode 100644 website/static/odoc/next/infer/Pulselib__PulsePathContext/.dune-keep create mode 100644 website/static/odoc/next/infer/Pulselib__PulsePathContext/index.html diff --git a/infer/documentation/issues/NIL_MESSAGING_TO_NON_POD.md b/infer/documentation/issues/NIL_MESSAGING_TO_NON_POD.md new file mode 100644 index 000000000..d77532750 --- /dev/null +++ b/infer/documentation/issues/NIL_MESSAGING_TO_NON_POD.md @@ -0,0 +1,24 @@ +In Objective-C, calling a method on `nil` (or in Objective-C terms, sending a message to `nil`) does not crash, +it simply returns a falsy value (nil/0/false). However, sending a message that returns +a non-POD C++ type (POD being ["Plain Old Data"](https://en.cppreference.com/w/cpp/named_req/PODType), essentially +anything that cannot be compiled as a C-style struct) to `nil` causes undefined behaviour. + +```objectivec +std::shared_ptr callMethodReturnsnonPOD() { + SomeObject* obj = getObjectOrNil(); + std::shared_ptr d = [obj returnsnonPOD]; // UB + return d; +} +``` + +To fix the above issue, we need to check if `obj` is +not `nil` before calling the `returnsnonPOD` method: + +```objectivec +std::shared_ptr callMethodReturnsnonPOD(bool b) { + SomeObject* obj = getObjectOrNil(b); + if (obj == nil) { return std::make_shared(0); } + std::shared_ptr d = [obj returnsnonPOD]; + return d; +} +``` diff --git a/infer/src/base/IssueType.ml b/infer/src/base/IssueType.ml index 4cb6f0572..9d2133261 100644 --- a/infer/src/base/IssueType.ml +++ b/infer/src/base/IssueType.ml @@ -801,9 +801,7 @@ let nil_insertion_into_collection = let nil_messaging_to_non_pod = register ~id:"NIL_MESSAGING_TO_NON_POD" Error Pulse - ~user_documentation: - "Calling a method that returns a C++ non-POD object on the nil object is undefined behavior \ - in Objective-C++." + ~user_documentation:[%blob "../../documentation/issues/NIL_MESSAGING_TO_NON_POD.md"] let null_dereference = diff --git a/website/docs/all-issue-types.md b/website/docs/all-issue-types.md index ea6f19ddc..4eb6bec73 100644 --- a/website/docs/all-issue-types.md +++ b/website/docs/all-issue-types.md @@ -1315,7 +1315,31 @@ Inserting nil into a collection is an error in Objective-C. Reported as "Nil Messaging To Non Pod" by [pulse](/docs/next/checker-pulse). -Calling a method that returns a C++ non-POD object on the nil object is undefined behavior in Objective-C++. +In Objective-C, calling a method on `nil` (or in Objective-C terms, sending a message to `nil`) does not crash, +it simply returns a falsy value (nil/0/false). However, sending a message that returns +a non-POD C++ type (POD being ["Plain Old Data"](https://en.cppreference.com/w/cpp/named_req/PODType), essentially +anything that cannot be compiled as a C-style struct) to `nil` causes undefined behaviour. + +```objectivec +std::shared_ptr callMethodReturnsnonPOD() { + SomeObject* obj = getObjectOrNil(); + std::shared_ptr d = [obj returnsnonPOD]; // UB + return d; +} +``` + +To fix the above issue, we need to check if `obj` is +not `nil` before calling the `returnsnonPOD` method: + +```objectivec +std::shared_ptr callMethodReturnsnonPOD(bool b) { + SomeObject* obj = getObjectOrNil(b); + if (obj == nil) { return std::make_shared(0); } + std::shared_ptr d = [obj returnsnonPOD]; + return d; +} +``` + ## NULLPTR_DEREFERENCE Reported as "Nullptr Dereference" by [pulse](/docs/next/checker-pulse). diff --git a/website/docs/checker-uninit.md b/website/docs/checker-uninit.md index 74dd51568..5bbcd1cb5 100644 --- a/website/docs/checker-uninit.md +++ b/website/docs/checker-uninit.md @@ -5,6 +5,8 @@ description: "Warns when values are used before having been initialized." Warns when values are used before having been initialized. +**\*\*\*DEPRECATED\*\*\*** Uninitialized value checking has moved to Pulse. + Activate with `--uninit`. Supported languages: diff --git a/website/static/man/next/infer-analyze.1.html b/website/static/man/next/infer-analyze.1.html index db2b7f5f7..0847dcb8e 100644 --- a/website/static/man/next/infer-analyze.1.html +++ b/website/static/man/next/infer-analyze.1.html @@ -250,8 +250,8 @@ reporting. (Conversely: --deduplicate)

--inefficient-keyset-iterator, --linters, --liveness, --racerd, --dotnet-resource-leak, --siof, ---self-in-block, --starvation, --uninit -(Conversely: --default-checkers)

+--self-in-block, --starvation (Conversely: +--default-checkers)

--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),
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),
diff --git a/website/static/man/next/infer.1.html b/website/static/man/next/infer.1.html index 45c339d67..2db18aabd 100644 --- a/website/static/man/next/infer.1.html +++ b/website/static/man/next/infer.1.html @@ -709,8 +709,8 @@ infer-reportdiff(1).
--inefficient-keyset-iterator, --linters, --liveness, --racerd, --dotnet-resource-leak, --siof, ---self-in-block, --starvation, --uninit -(Conversely: --default-checkers)

+--self-in-block, --starvation (Conversely: +--default-checkers)

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

@@ -2244,11 +2244,11 @@ disable all other checkers (Conversely:

See also infer-analyze(1).
---no-uninit

+--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).
@@ -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 @@ + +1-Domain1 (infer.Absint.AbstractDomain.PairNoJoin.1-Domain1)

Parameter PairNoJoin.1-Domain1

include IStdlib.PrettyPrintable.PrintableType
type t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-2-Domain2/index.html b/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-2-Domain2/index.html new file mode 100644 index 000000000..4a96a68c5 --- /dev/null +++ b/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/argument-2-Domain2/index.html @@ -0,0 +1,2 @@ + +2-Domain2 (infer.Absint.AbstractDomain.PairNoJoin.2-Domain2)

Parameter PairNoJoin.2-Domain2

include IStdlib.PrettyPrintable.PrintableType
type t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/index.html b/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/index.html new file mode 100644 index 000000000..2793f56ce --- /dev/null +++ b/website/static/odoc/next/infer/Absint/AbstractDomain/PairNoJoin/index.html @@ -0,0 +1,2 @@ + +PairNoJoin (infer.Absint.AbstractDomain.PairNoJoin)

Module AbstractDomain.PairNoJoin

Parameters

Signature

include IStdlib.PrettyPrintable.PrintableType
type t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint/AbstractDomain/index.html b/website/static/odoc/next/infer/Absint/AbstractDomain/index.html index 43be96deb..41a5d6730 100644 --- a/website/static/odoc/next/infer/Absint/AbstractDomain/index.html +++ b/website/static/odoc/next/infer/Absint/AbstractDomain/index.html @@ -1,2 +1,2 @@ -AbstractDomain (infer.Absint.AbstractDomain)

Module Absint.AbstractDomain

Abstract domains and domain combinators

module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
include sig ... end
module Empty : S with type t = unit

a trivial domain

module type WithBottom = sig ... end

A domain with an explicit bottom value

module type WithTop = sig ... end

A domain with an explicit top value

module BottomLifted : functor (Domain : S) -> sig ... end

Create a domain with Bottom element from a pre-domain

module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted

Create a domain with Top element from a pre-domain

module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t

Cartesian product of two domains.

module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end

Flat abstract domain: Bottom, Top, and non-comparable elements in between

include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.tVal.tAbove.t) Types.below_above

Stacked abstract domain: tagged union of 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

Abstracts a set of Elements 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

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.

module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t

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.

module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t

Lift a set to a powerset domain ordered by superset, so the join operator is intersection

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

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

module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t

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

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

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

module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t

Similar to 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 BooleanAnd : S with type t = bool

Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches.

module BooleanOr : WithBottom with type t = bool

Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch.

module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented.

module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. join is minimum and top is zero.

\ No newline at end of file +AbstractDomain (infer.Absint.AbstractDomain)

Module Absint.AbstractDomain

Abstract domains and domain combinators

module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
include sig ... end
module Empty : S with type t = unit

a trivial domain

module type WithBottom = sig ... end

A domain with an explicit bottom value

module type WithTop = sig ... end

A domain with an explicit top value

module BottomLifted : functor (Domain : S) -> sig ... end

Create a domain with Bottom element from a pre-domain

module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted

Create a domain with Top element from a pre-domain

module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t

Cartesian product of two domains.

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

Flat abstract domain: Bottom, Top, and non-comparable elements in between

include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.tVal.tAbove.t) Types.below_above

Stacked abstract domain: tagged union of 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

Abstracts a set of Elements 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

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.

module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t

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.

module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t

Lift a set to a powerset domain ordered by superset, so the join operator is intersection

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

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

module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t

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

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

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

module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t

Similar to 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 BooleanAnd : S with type t = bool

Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches.

module BooleanOr : WithBottom with type t = bool

Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch.

module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented.

module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. join is minimum and top is zero.

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint/TaskSchedulerTypes/index.html b/website/static/odoc/next/infer/Absint/TaskSchedulerTypes/index.html index 98cd7b4a5..02463657e 100644 --- a/website/static/odoc/next/infer/Absint/TaskSchedulerTypes/index.html +++ b/website/static/odoc/next/infer/Absint/TaskSchedulerTypes/index.html @@ -1,2 +1,2 @@ -TaskSchedulerTypes (infer.Absint.TaskSchedulerTypes)

Module Absint.TaskSchedulerTypes

exception ProcnameAlreadyLocked of {
dependency_filename : string;
}

for the Restart scheduler: raise when a worker tries to analyze a procedure already being analyzed by another process

type target =
| Procname of IR.Procname.t
| File of IBase.SourceFile.t
| ProcUID of string

matches primary key of procedures and specs tables; see ResultsDatabase.ml

\ No newline at end of file +TaskSchedulerTypes (infer.Absint.TaskSchedulerTypes)

Module Absint.TaskSchedulerTypes

type target =
| Procname of IR.Procname.t
| File of IBase.SourceFile.t
| ProcUID of string

matches primary key of procedures and specs tables; see ResultsDatabase.ml

\ No newline at end of file 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..fde709f0e --- /dev/null +++ b/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/argument-1-Domain1/index.html @@ -0,0 +1,2 @@ + +1-Domain1 (infer.Absint__AbstractDomain.PairNoJoin.1-Domain1)

Parameter PairNoJoin.1-Domain1

include IStdlib.PrettyPrintable.PrintableType
type t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/argument-2-Domain2/index.html b/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/argument-2-Domain2/index.html new file mode 100644 index 000000000..80b8e5e96 --- /dev/null +++ b/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/argument-2-Domain2/index.html @@ -0,0 +1,2 @@ + +2-Domain2 (infer.Absint__AbstractDomain.PairNoJoin.2-Domain2)

Parameter PairNoJoin.2-Domain2

include IStdlib.PrettyPrintable.PrintableType
type t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/index.html b/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/index.html new file mode 100644 index 000000000..6f4c7775d --- /dev/null +++ b/website/static/odoc/next/infer/Absint__AbstractDomain/PairNoJoin/index.html @@ -0,0 +1,2 @@ + +PairNoJoin (infer.Absint__AbstractDomain.PairNoJoin)

Module Absint__AbstractDomain.PairNoJoin

Parameters

Signature

include IStdlib.PrettyPrintable.PrintableType
type t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint__AbstractDomain/index.html b/website/static/odoc/next/infer/Absint__AbstractDomain/index.html index 7da859e38..5c7b69afd 100644 --- a/website/static/odoc/next/infer/Absint__AbstractDomain/index.html +++ b/website/static/odoc/next/infer/Absint__AbstractDomain/index.html @@ -1,2 +1,2 @@ -Absint__AbstractDomain (infer.Absint__AbstractDomain)

Module Absint__AbstractDomain

Abstract domains and domain combinators

module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
include sig ... end
module Empty : S with type t = unit

a trivial domain

module type WithBottom = sig ... end

A domain with an explicit bottom value

module type WithTop = sig ... end

A domain with an explicit top value

module BottomLifted : functor (Domain : S) -> sig ... end

Create a domain with Bottom element from a pre-domain

module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted

Create a domain with Top element from a pre-domain

module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t

Cartesian product of two domains.

module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end

Flat abstract domain: Bottom, Top, and non-comparable elements in between

include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.tVal.tAbove.t) Types.below_above

Stacked abstract domain: tagged union of 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

Abstracts a set of Elements 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

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.

module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t

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.

module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t

Lift a set to a powerset domain ordered by superset, so the join operator is intersection

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

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

module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t

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

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

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

module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t

Similar to 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 BooleanAnd : S with type t = bool

Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches.

module BooleanOr : WithBottom with type t = bool

Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch.

module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented.

module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. join is minimum and top is zero.

\ No newline at end of file +Absint__AbstractDomain (infer.Absint__AbstractDomain)

Module Absint__AbstractDomain

Abstract domains and domain combinators

module Types : sig ... end
module type NoJoin = sig ... end
module type S = sig ... end
include sig ... end
module Empty : S with type t = unit

a trivial domain

module type WithBottom = sig ... end

A domain with an explicit bottom value

module type WithTop = sig ... end

A domain with an explicit top value

module BottomLifted : functor (Domain : S) -> sig ... end

Create a domain with Bottom element from a pre-domain

module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted

Create a domain with Top element from a pre-domain

module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t

Cartesian product of two domains.

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

Flat abstract domain: Bottom, Top, and non-comparable elements in between

include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.tVal.tAbove.t) Types.below_above

Stacked abstract domain: tagged union of 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

Abstracts a set of Elements 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

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.

module FiniteSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t

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.

module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t

Lift a set to a powerset domain ordered by superset, so the join operator is intersection

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

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

module Map : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t

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

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

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

module SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t

Similar to 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 BooleanAnd : S with type t = bool

Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches.

module BooleanOr : WithBottom with type t = bool

Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch.

module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented.

module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. join is minimum and top is zero.

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Absint__TaskSchedulerTypes/index.html b/website/static/odoc/next/infer/Absint__TaskSchedulerTypes/index.html index 6edf7e37d..bd758189e 100644 --- a/website/static/odoc/next/infer/Absint__TaskSchedulerTypes/index.html +++ b/website/static/odoc/next/infer/Absint__TaskSchedulerTypes/index.html @@ -1,2 +1,2 @@ -Absint__TaskSchedulerTypes (infer.Absint__TaskSchedulerTypes)

Module Absint__TaskSchedulerTypes

exception ProcnameAlreadyLocked of {
dependency_filename : string;
}

for the Restart scheduler: raise when a worker tries to analyze a procedure already being analyzed by another process

type target =
| Procname of IR.Procname.t
| File of IBase.SourceFile.t
| ProcUID of string

matches primary key of procedures and specs tables; see ResultsDatabase.ml

\ No newline at end of file +Absint__TaskSchedulerTypes (infer.Absint__TaskSchedulerTypes)

Module Absint__TaskSchedulerTypes

type target =
| Procname of IR.Procname.t
| File of IBase.SourceFile.t
| ProcUID of string

matches primary key of procedures and specs tables; see ResultsDatabase.ml

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency/RacerDModels/index.html b/website/static/odoc/next/infer/Concurrency/RacerDModels/index.html index 2c2ca7423..bc420141d 100644 --- a/website/static/odoc/next/infer/Concurrency/RacerDModels/index.html +++ b/website/static/odoc/next/infer/Concurrency/RacerDModels/index.html @@ -1,2 +1,2 @@ -RacerDModels (infer.Concurrency.RacerDModels)

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

return Some (access) if this procedure accesses the contents of a container (e.g., Map.get)

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

return true if the given procname boxes a primitive type into a reference type

val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool

Methods in @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

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

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

returns true if method or overriden method in superclass is @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

check if an access to a field is thread-confined, or whether the field is volatile

val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool

should an interface call be flagged as potentially non-thread safe?

val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool

is a call on an access expression to a method of a synchronized container?

val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool

should the given procedure be treated as a constructor/initializer?

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

is the given procname a method that wraps a container into a thread-safe wrapper?

\ No newline at end of file +RacerDModels (infer.Concurrency.RacerDModels)

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

return Some (access) if this procedure accesses the contents of a container (e.g., Map.get)

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

return true if the given procname boxes a primitive type into a reference type

val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool

Methods in @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

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

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

returns true if method or overriden method in superclass is @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

check if an access to a field is thread-confined, or whether the field is volatile

val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool

should an interface call be flagged as potentially non-thread safe?

val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool

is a call on an access expression to a method of a synchronized container?

val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool

should the given procedure be treated as a constructor/initializer?

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

is the given procname a method that wraps a container into a thread-safe wrapper?

val get_litho_explanation : IR.Tenv.t -> IR.Procname.t -> string option

Get report explanation specific to Litho class methods, if applicable

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency__RacerDModels/index.html b/website/static/odoc/next/infer/Concurrency__RacerDModels/index.html index 4c4ecc484..359d0fce4 100644 --- a/website/static/odoc/next/infer/Concurrency__RacerDModels/index.html +++ b/website/static/odoc/next/infer/Concurrency__RacerDModels/index.html @@ -1,2 +1,2 @@ -Concurrency__RacerDModels (infer.Concurrency__RacerDModels)

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

return Some (access) if this procedure accesses the contents of a container (e.g., Map.get)

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

return true if the given procname boxes a primitive type into a reference type

val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool

Methods in @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

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

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

returns true if method or overriden method in superclass is @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

check if an access to a field is thread-confined, or whether the field is volatile

val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool

should an interface call be flagged as potentially non-thread safe?

val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool

is a call on an access expression to a method of a synchronized container?

val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool

should the given procedure be treated as a constructor/initializer?

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

is the given procname a method that wraps a container into a thread-safe wrapper?

\ No newline at end of file +Concurrency__RacerDModels (infer.Concurrency__RacerDModels)

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

return Some (access) if this procedure accesses the contents of a container (e.g., Map.get)

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

return true if the given procname boxes a primitive type into a reference type

val is_thread_confined_method : IR.Tenv.t -> IR.Procname.t -> bool

Methods in @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

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

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

returns true if method or overriden method in superclass is @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

check if an access to a field is thread-confined, or whether the field is volatile

val should_flag_interface_call : IR.Tenv.t -> Absint.HilExp.t list -> IR.CallFlags.t -> IR.Procname.t -> bool

should an interface call be flagged as potentially non-thread safe?

val is_synchronized_container : IR.Procname.t -> Absint.HilExp.AccessExpression.t -> IR.Tenv.t -> bool

is a call on an access expression to a method of a synchronized container?

val is_initializer : IR.Tenv.t -> IR.Procname.t -> bool

should the given procedure be treated as a constructor/initializer?

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

is the given procname a method that wraps a container into a thread-safe wrapper?

val get_litho_explanation : IR.Tenv.t -> IR.Procname.t -> string option

Get report explanation specific to Litho class methods, if applicable

\ No newline at end of file diff --git a/website/static/odoc/next/infer/ErlangFrontend/ErlangAst/index.html b/website/static/odoc/next/infer/ErlangFrontend/ErlangAst/index.html index 3349d294f..b84d9931d 100644 --- a/website/static/odoc/next/infer/ErlangFrontend/ErlangAst/index.html +++ b/website/static/odoc/next/infer/ErlangFrontend/ErlangAst/index.html @@ -1,2 +1,2 @@ -ErlangAst (infer.ErlangFrontend.ErlangAst)

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

type literal =
| Atom of string
| Char of string
| Float of float
| Int of string
| String of string

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
\ No newline at end of file +ErlangAst (infer.ErlangFrontend.ErlangAst)

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

type literal =
| Atom of string
| Char of string
| Float of float
| Int of string
| String of string

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ErlangFrontend/ErlangTranslator/index.html b/website/static/odoc/next/infer/ErlangFrontend/ErlangTranslator/index.html index 246beb4ca..4cc3a098e 100644 --- a/website/static/odoc/next/infer/ErlangFrontend/ErlangTranslator/index.html +++ b/website/static/odoc/next/infer/ErlangFrontend/ErlangTranslator/index.html @@ -1,2 +1,2 @@ -ErlangTranslator (infer.ErlangFrontend.ErlangTranslator)

Module ErlangFrontend.ErlangTranslator

val to_source_and_cfg : ErlangAst.module_ -> IBase.SourceFile.t * IR.Cfg.t
\ No newline at end of file +ErlangTranslator (infer.ErlangFrontend.ErlangTranslator)

Module ErlangFrontend.ErlangTranslator

val translate_module : ErlangAst.module_ -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ErlangFrontend__ErlangAst/index.html b/website/static/odoc/next/infer/ErlangFrontend__ErlangAst/index.html index 03ab8ca78..00736f2f0 100644 --- a/website/static/odoc/next/infer/ErlangFrontend__ErlangAst/index.html +++ b/website/static/odoc/next/infer/ErlangFrontend__ErlangAst/index.html @@ -1,2 +1,2 @@ -ErlangFrontend__ErlangAst (infer.ErlangFrontend__ErlangAst)

Module ErlangFrontend__ErlangAst

Erlang abstract forms, following https://erlang.org/doc/apps/erts/absform.html

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

type literal =
| Atom of string
| Char of string
| Float of float
| Int of string
| String of string

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
\ No newline at end of file +ErlangFrontend__ErlangAst (infer.ErlangFrontend__ErlangAst)

Module ErlangFrontend__ErlangAst

Erlang abstract forms, following https://erlang.org/doc/apps/erts/absform.html

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

type literal =
| Atom of string
| Char of string
| Float of float
| Int of string
| String of string

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ErlangFrontend__ErlangTranslator/index.html b/website/static/odoc/next/infer/ErlangFrontend__ErlangTranslator/index.html index 7b66be463..226211f26 100644 --- a/website/static/odoc/next/infer/ErlangFrontend__ErlangTranslator/index.html +++ b/website/static/odoc/next/infer/ErlangFrontend__ErlangTranslator/index.html @@ -1,2 +1,2 @@ -ErlangFrontend__ErlangTranslator (infer.ErlangFrontend__ErlangTranslator)

Module ErlangFrontend__ErlangTranslator

val to_source_and_cfg : ErlangFrontend.ErlangAst.module_ -> IBase.SourceFile.t * IR.Cfg.t
\ No newline at end of file +ErlangFrontend__ErlangTranslator (infer.ErlangFrontend__ErlangTranslator)

Module ErlangFrontend__ErlangTranslator

val translate_module : ErlangFrontend.ErlangAst.module_ -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase/Config/index.html b/website/static/odoc/next/infer/IBase/Config/index.html index c560ab421..8f9b2ff84 100644 --- a/website/static/odoc/next/infer/IBase/Config/index.html +++ b/website/static/odoc/next/infer/IBase/Config/index.html @@ -1,2 +1,2 @@ -Config (infer.IBase.Config)

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 equal_scheduler : scheduler -> scheduler -> bool
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

marker to recognize methods generated by javalib to eliminate lambdas

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

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 results_dir.

val is_in_custom_symbols : string -> string -> bool

Does named symbol match any prefix in the named custom symbol list?

val java_package_is_external : string -> bool

Check if a Java package is external to the repository

val scuba_execution_id : IStdlib.IStd.Int64.t option

a random number to (hopefully) uniquely identify this run

Global variables with initial values specified by command-line options

val clang_compilation_dbs : [ `Escaped of string | `Raw of string ] list
\ No newline at end of file +Config (infer.IBase.Config)

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 equal_scheduler : scheduler -> scheduler -> bool
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

Windows Subsystem for Linux

val ivar_attributes : string
val java_lambda_marker_infix : string

marker to recognize methods generated by javalib to eliminate lambdas

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

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 results_dir.

val is_in_custom_symbols : string -> string -> bool

Does named symbol match any prefix in the named custom symbol list?

val java_package_is_external : string -> bool

Check if a Java package is external to the repository

val scuba_execution_id : IStdlib.IStd.Int64.t option

a random number to (hopefully) uniquely identify this run

Global variables with initial values specified by command-line options

val clang_compilation_dbs : [ `Escaped of string | `Raw of string ] list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase/RestartSchedulerException/index.html b/website/static/odoc/next/infer/IBase/RestartSchedulerException/index.html new file mode 100644 index 000000000..01d97ef56 --- /dev/null +++ b/website/static/odoc/next/infer/IBase/RestartSchedulerException/index.html @@ -0,0 +1,2 @@ + +RestartSchedulerException (infer.IBase.RestartSchedulerException)

Module IBase.RestartSchedulerException

exception ProcnameAlreadyLocked of {
dependency_filename : string;
}

for the Restart scheduler: raise when a worker tries to analyze a procedure already being analyzed by another process

val is_not_restart_exception : exn -> bool

check if the exception passed is the one defined above

\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase/SourceFile/index.html b/website/static/odoc/next/infer/IBase/SourceFile/index.html index e204f7447..feb58bba3 100644 --- a/website/static/odoc/next/infer/IBase/SourceFile/index.html +++ b/website/static/odoc/next/infer/IBase/SourceFile/index.html @@ -1,2 +1,2 @@ -SourceFile (infer.IBase.SourceFile)

Module IBase.SourceFile

type t
val compare : t -> t -> int
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t

Maps from source_file

module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t

Set of source files

module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool

Is the source file the invalid source file?

val changed_sources_from_changed_files : string list -> Set.t

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

val invalid : string -> t

Invalid source file

val equal : t -> t -> bool

equality of source files

val from_abs_path : ?⁠warn_on_error:bool -> string -> t

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).

val create : ?⁠warn_on_error:bool -> string -> t

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).

val is_under_project_root : t -> bool

Returns true if the file is under the project root or the workspace directory if it exists

val of_header : ?⁠warn_on_error:bool -> t -> t option

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).

val pp : Stdlib.Format.formatter -> t -> unit

pretty print t

val to_abs_path : t -> string

get the full path of a source file

val to_rel_path : t -> string

get the relative path of a source file

val to_string : ?⁠force_relative:bool -> t -> string

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

val has_extension : t -> ext:string -> bool

returns whether the source file has provided extension

module SQLite : SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file +SourceFile (infer.IBase.SourceFile)

Module IBase.SourceFile

type t
val compare : t -> t -> int
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t

Maps from source_file

module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t

Set of source files

module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool

Is the source file the invalid source file?

val read_config_changed_files : unit -> Set.t option

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.

val invalid : string -> t

Invalid source file

val equal : t -> t -> bool

equality of source files

val from_abs_path : ?⁠warn_on_error:bool -> string -> t

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).

val create : ?⁠warn_on_error:bool -> string -> t

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).

val is_under_project_root : t -> bool

Returns true if the file is under the project root or the workspace directory if it exists

val of_header : ?⁠warn_on_error:bool -> t -> t option

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).

val pp : Stdlib.Format.formatter -> t -> unit

pretty print t

val to_abs_path : t -> string

get the full path of a source file

val to_rel_path : t -> string

get the relative path of a source file

val to_string : ?⁠force_relative:bool -> t -> string

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

val has_extension : t -> ext:string -> bool

returns whether the source file has provided extension

module SQLite : SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase/index.html b/website/static/odoc/next/infer/IBase/index.html index d1b61aee9..168dd3196 100644 --- a/website/static/odoc/next/infer/IBase/index.html +++ b/website/static/odoc/next/infer/IBase/index.html @@ -1,2 +1,2 @@ -IBase (infer.IBase)

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
\ No newline at end of file +IBase (infer.IBase)

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase__Config/index.html b/website/static/odoc/next/infer/IBase__Config/index.html index 679fe885b..78432c38d 100644 --- a/website/static/odoc/next/infer/IBase__Config/index.html +++ b/website/static/odoc/next/infer/IBase__Config/index.html @@ -1,2 +1,2 @@ -IBase__Config (infer.IBase__Config)

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 equal_scheduler : scheduler -> scheduler -> bool
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

marker to recognize methods generated by javalib to eliminate lambdas

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

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 results_dir.

val is_in_custom_symbols : string -> string -> bool

Does named symbol match any prefix in the named custom symbol list?

val java_package_is_external : string -> bool

Check if a Java package is external to the repository

val scuba_execution_id : IStdlib.IStd.Int64.t option

a random number to (hopefully) uniquely identify this run

Global variables with initial values specified by command-line options

val clang_compilation_dbs : [ `Escaped of string | `Raw of string ] list
\ No newline at end of file +IBase__Config (infer.IBase__Config)

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 equal_scheduler : scheduler -> scheduler -> bool
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

Windows Subsystem for Linux

val ivar_attributes : string
val java_lambda_marker_infix : string

marker to recognize methods generated by javalib to eliminate lambdas

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

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 results_dir.

val is_in_custom_symbols : string -> string -> bool

Does named symbol match any prefix in the named custom symbol list?

val java_package_is_external : string -> bool

Check if a Java package is external to the repository

val scuba_execution_id : IStdlib.IStd.Int64.t option

a random number to (hopefully) uniquely identify this run

Global variables with initial values specified by command-line options

val clang_compilation_dbs : [ `Escaped of string | `Raw of string ] list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase__RestartSchedulerException/.dune-keep b/website/static/odoc/next/infer/IBase__RestartSchedulerException/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/IBase__RestartSchedulerException/index.html b/website/static/odoc/next/infer/IBase__RestartSchedulerException/index.html new file mode 100644 index 000000000..b1eb0ea4e --- /dev/null +++ b/website/static/odoc/next/infer/IBase__RestartSchedulerException/index.html @@ -0,0 +1,2 @@ + +IBase__RestartSchedulerException (infer.IBase__RestartSchedulerException)

Module IBase__RestartSchedulerException

exception ProcnameAlreadyLocked of {
dependency_filename : string;
}

for the Restart scheduler: raise when a worker tries to analyze a procedure already being analyzed by another process

val is_not_restart_exception : exn -> bool

check if the exception passed is the one defined above

\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase__SourceFile/index.html b/website/static/odoc/next/infer/IBase__SourceFile/index.html index 929cef920..51e035fa5 100644 --- a/website/static/odoc/next/infer/IBase__SourceFile/index.html +++ b/website/static/odoc/next/infer/IBase__SourceFile/index.html @@ -1,2 +1,2 @@ -IBase__SourceFile (infer.IBase__SourceFile)

Module IBase__SourceFile

type t
val compare : t -> t -> int
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t

Maps from source_file

module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t

Set of source files

module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool

Is the source file the invalid source file?

val changed_sources_from_changed_files : string list -> Set.t

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

val invalid : string -> t

Invalid source file

val equal : t -> t -> bool

equality of source files

val from_abs_path : ?⁠warn_on_error:bool -> string -> t

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).

val create : ?⁠warn_on_error:bool -> string -> t

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).

val is_under_project_root : t -> bool

Returns true if the file is under the project root or the workspace directory if it exists

val of_header : ?⁠warn_on_error:bool -> t -> t option

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).

val pp : Stdlib.Format.formatter -> t -> unit

pretty print t

val to_abs_path : t -> string

get the full path of a source file

val to_rel_path : t -> string

get the relative path of a source file

val to_string : ?⁠force_relative:bool -> t -> string

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

val has_extension : t -> ext:string -> bool

returns whether the source file has provided extension

module SQLite : IBase.SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file +IBase__SourceFile (infer.IBase__SourceFile)

Module IBase__SourceFile

type t
val compare : t -> t -> int
module Map : IStdlib.IStd.Caml.Map.S with type Map.key = t

Maps from source_file

module Set : IStdlib.IStd.Caml.Set.S with type Set.elt = t

Set of source files

module Hash : IStdlib.IStd.Caml.Hashtbl.S with type Hash.key = t
val is_invalid : t -> bool

Is the source file the invalid source file?

val read_config_changed_files : unit -> Set.t option

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.

val invalid : string -> t

Invalid source file

val equal : t -> t -> bool

equality of source files

val from_abs_path : ?⁠warn_on_error:bool -> string -> t

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).

val create : ?⁠warn_on_error:bool -> string -> t

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).

val is_under_project_root : t -> bool

Returns true if the file is under the project root or the workspace directory if it exists

val of_header : ?⁠warn_on_error:bool -> t -> t option

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).

val pp : Stdlib.Format.formatter -> t -> unit

pretty print t

val to_abs_path : t -> string

get the full path of a source file

val to_rel_path : t -> string

get the relative path of a source file

val to_string : ?⁠force_relative:bool -> t -> string

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

val has_extension : t -> ext:string -> bool

returns whether the source file has provided extension

module SQLite : IBase.SqliteUtils.Data with type t = t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/BuiltinDecl/index.html b/website/static/odoc/next/infer/IR/BuiltinDecl/index.html index 0c4b40820..70cd6f011 100644 --- a/website/static/odoc/next/infer/IR/BuiltinDecl/index.html +++ b/website/static/odoc/next/infer/IR/BuiltinDecl/index.html @@ -1,2 +1,2 @@ -BuiltinDecl (infer.IR.BuiltinDecl)

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

used to represent behavior that is not modeled in infer

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
\ No newline at end of file +BuiltinDecl (infer.IR.BuiltinDecl)

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

used to represent behavior that is not modeled in infer

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

all patterns in a function failed to match

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/ErlangTypeName/index.html b/website/static/odoc/next/infer/IR/ErlangTypeName/index.html new file mode 100644 index 000000000..2f4113a47 --- /dev/null +++ b/website/static/odoc/next/infer/IR/ErlangTypeName/index.html @@ -0,0 +1,2 @@ + +ErlangTypeName (infer.IR.ErlangTypeName)

Module IR.ErlangTypeName

type t =
| Any
val compare : t -> t -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/Procdesc/index.html b/website/static/odoc/next/infer/IR/Procdesc/index.html index 6ffac11ae..575685f56 100644 --- a/website/static/odoc/next/infer/IR/Procdesc/index.html +++ b/website/static/odoc/next/infer/IR/Procdesc/index.html @@ -1,2 +1,2 @@ -Procdesc (infer.IR.Procdesc)

Module IR.Procdesc

Per-procedure CFG

module NodeKey : sig ... end
module Node : sig ... end

node of the control flow graph

module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id

Map with node id keys.

module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t

Hash table with nodes as keys.

module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t

Map over nodes.

module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t

Set of nodes.

type t

proc description

val append_locals : t -> ProcAttributes.var_data list -> unit

append a list of new local variables to the existing list of local variables

val compute_distance_to_exit_node : t -> unit

Compute the distance of each node to the exit node, if not computed already

val create_node : t -> IBase.Location.t -> Node.nodekind -> Sil.instr list -> Node.t

Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc.

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

fold over all nodes and their instructions

val find_map_instrs : t -> f:(Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : ProcAttributes.t -> t

Use Cfg.create_proc_desc if you are adding a proc desc to a cfg

val get_access : t -> ProcAttributes.access

Return the visibility attribute

val get_attributes : t -> ProcAttributes.t

Get the attributes of the procedure.

val set_attributes : t -> ProcAttributes.t -> unit
val get_captured : t -> CapturedVar.t list

Return name and type of block's captured variables

val get_exit_node : t -> Node.t
val get_formals : t -> (Mangled.t * Typ.t) list

Return name and type of formal parameters

val get_pvar_formals : t -> (Pvar.t * Typ.t) list

Return pvar and type of formal parameters

val get_loc : t -> IBase.Location.t

Return loc information for the procedure

val get_locals : t -> ProcAttributes.var_data list

Return name and type and attributes of local variables

val get_nodes : t -> Node.t list
val get_proc_name : t -> Procname.t
val get_ret_type : t -> Typ.t

Return the return type of the procedure and type string

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

get a list of unique static callees excluding self

val is_defined : t -> bool

Return true iff the procedure is defined, and not just declared

val is_java_synchronized : t -> bool

Return true if the procedure signature has the Java synchronized keyword

val is_csharp_synchronized : t -> bool

Return true if the procedure is synchronized via a C# lock

val is_objc_arc_on : t -> bool

Return true iff the ObjC procedure is compiled with ARC

val iter_instrs : (Node.t -> Sil.instr -> unit) -> t -> unit

iterate over all nodes and their instructions

val replace_instrs : t -> f:(Node.t -> Sil.instr -> Sil.instr) -> bool

Map and replace the instructions to be executed. Returns true if at least one substitution occured.

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

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.

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

Like replace_instrs_using_context, but slower, and each instruction may be replaced by 0, 1, or more instructions.

val iter_nodes : (Node.t -> unit) -> t -> unit

iterate over all the nodes of a procedure

val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold over all the nodes of a procedure

val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold between two nodes or until we reach a branching structure

val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit

Set the successor nodes and exception nodes, if given, and update predecessor links

val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit

Set the successor nodes and exception nodes, and update predecessor links

val set_exit_node : t -> Node.t -> unit

Set the exit node of the procedure

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

true if pvar is a captured variable of a cpp lambda or obcj block

val is_captured_var : t -> Var.t -> bool

true if var is a captured variable of a cpp lambda or obcj block

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

per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG

val load : Procname.t -> t option
\ No newline at end of file +Procdesc (infer.IR.Procdesc)

Module IR.Procdesc

Per-procedure CFG

module NodeKey : sig ... end
module Node : sig ... end

node of the control flow graph

module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id

Map with node id keys.

module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t

Hash table with nodes as keys.

module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t

Map over nodes.

module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t

Set of nodes.

type t

proc description

val append_locals : t -> ProcAttributes.var_data list -> unit

append a list of new local variables to the existing list of local variables

val compute_distance_to_exit_node : t -> unit

Compute the distance of each node to the exit node, if not computed already

val create_node : t -> IBase.Location.t -> Node.nodekind -> Sil.instr list -> Node.t

Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc.

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

fold over all nodes and their instructions

val find_map_instrs : t -> f:(Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : ProcAttributes.t -> t

Use Cfg.create_proc_desc if you are adding a proc desc to a cfg

val get_access : t -> ProcAttributes.access

Return the visibility attribute

val get_attributes : t -> ProcAttributes.t

Get the attributes of the procedure.

val set_attributes : t -> ProcAttributes.t -> unit
val get_captured : t -> CapturedVar.t list

Return name and type of block's captured variables

val get_exit_node : t -> Node.t
val get_formals : t -> (Mangled.t * Typ.t) list

Return name and type of formal parameters

val get_pvar_formals : t -> (Pvar.t * Typ.t) list

Return pvar and type of formal parameters

val get_loc : t -> IBase.Location.t

Return loc information for the procedure

val get_locals : t -> ProcAttributes.var_data list

Return name and type and attributes of local variables

val get_nodes : t -> Node.t list
val get_proc_name : t -> Procname.t
val get_ret_type : t -> Typ.t

Return the return type of the procedure and type string

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

Return the return type from method signature: if the procedure has added return parameter, return its type

val get_start_node : t -> Node.t
val get_static_callees : t -> Procname.t list

get a list of unique static callees excluding self

val is_defined : t -> bool

Return true iff the procedure is defined, and not just declared

val is_java_synchronized : t -> bool

Return true if the procedure signature has the Java synchronized keyword

val is_csharp_synchronized : t -> bool

Return true if the procedure is synchronized via a C# lock

val is_objc_arc_on : t -> bool

Return true iff the ObjC procedure is compiled with ARC

val iter_instrs : (Node.t -> Sil.instr -> unit) -> t -> unit

iterate over all nodes and their instructions

val replace_instrs : t -> f:(Node.t -> Sil.instr -> Sil.instr) -> bool

Map and replace the instructions to be executed. Returns true if at least one substitution occured.

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

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.

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

Like replace_instrs_using_context, but slower, and each instruction may be replaced by 0, 1, or more instructions.

val iter_nodes : (Node.t -> unit) -> t -> unit

iterate over all the nodes of a procedure

val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold over all the nodes of a procedure

val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold between two nodes or until we reach a branching structure

val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit

Set the successor nodes and exception nodes, if given, and update predecessor links

val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit

Set the successor nodes and exception nodes, and update predecessor links

val set_exit_node : t -> Node.t -> unit

Set the exit node of the procedure

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

true if pvar is a captured variable of a cpp lambda or obcj block

val is_captured_var : t -> Var.t -> bool

true if var is a captured variable of a cpp lambda or obcj block

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

per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG

val load : Procname.t -> t option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/Procname/index.html b/website/static/odoc/next/infer/IR/Procname/index.html index c80be5669..def81f67e 100644 --- a/website/static/odoc/next/infer/IR/Procname/index.html +++ b/website/static/odoc/next/infer/IR/Procname/index.html @@ -1,2 +1,2 @@ -Procname (infer.IR.Procname)

Module IR.Procname

module F = Stdlib.Format
module CSharp : sig ... end

Type of csharp procedure names.

module Java : sig ... end

Type of java procedure names.

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

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: 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 compare : t -> t -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int

Similar to compare, but compares only names, except parameter types and template arguments.

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

Hash tables with proc names as keys.

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

Maps from proc names.

module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t

Sets of proc names.

module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end

One-sized cache for one procedure at a time. Returns getter and setter.

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

Create a Java procedure name.

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

Create a CSharp procedure name.

val make_objc_dealloc : Typ.Name.t -> t

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"

val make_objc_copyWithZone : is_mutable:bool -> Typ.Name.t -> t

Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable.

val empty_block : t

Empty block name.

val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t

Return the language of the procedure.

val get_method : t -> string

Return the method/function of a procname.

val is_objc_block : t -> bool

Return whether the procname is a block procname.

val is_cpp_lambda : t -> bool

Return whether the procname is a cpp lambda procname.

val is_objc_dealloc : t -> bool

Return whether the dealloc method of an Objective-C class.

val is_objc_init : t -> bool

Return whether the init method of an Objective-C class.

val is_c_method : t -> bool

Return true this is an Objective-C/C++ method name.

val is_constructor : t -> bool

Check if this is a constructor.

val is_csharp : t -> bool

Check if this is a CSharp procedure name.

val is_java : t -> bool

Check if this is a Java procedure name.

val as_java_exn : explanation:string -> t -> Java.t

Converts to a Java.t. Throws if is_java is false

val with_block_parameters : t -> Block.t list -> t

Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures.

val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool

Check if this is a special Infer undefined procedure.

val get_global_name_of_initializer : t -> string option

Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise.

val pp : Stdlib.Format.formatter -> t -> unit

Pretty print a proc name for the user to see.

val to_string : t -> string

Convert a proc name into a string for the user to see.

val describe : Stdlib.Format.formatter -> t -> unit

to use in user messages

val replace_class : t -> Typ.Name.t -> t

Replace the class name component of a procedure name. In case of Java, replace package and class name.

val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?⁠withclass:bool -> F.formatter -> t -> unit

Pretty print a proc name as an easy string for the user to see in an IDE.

val to_simplified_string : ?⁠withclass:bool -> t -> string

Convert a proc name into an easy string for the user to see in an IDE.

val from_string_c_fun : string -> t

Convert a string to a c function name.

val replace_java_inner_class_prefix_regex : string -> string

Replace "$[0-9]+" index into "$_" in Java proc name.

val hashable_name : t -> string

Convert the procedure name in a format suitable for computing the bug hash.

val pp_unique_id : F.formatter -> t -> unit

Print a proc name as a unique identifier.

val to_unique_id : t -> string

Convert a proc name into a unique identifier.

val to_filename : t -> string

Convert a proc name to a filename.

val get_qualifiers : t -> QualifiedCppName.t

get qualifiers of C/objc/C++ method/function

module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file +Procname (infer.IR.Procname)

Module IR.Procname

module F = Stdlib.Format
module CSharp : sig ... end

Type of csharp procedure names.

module Java : sig ... end

Type of java procedure names.

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

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: 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 compare : t -> t -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int

Similar to compare, but compares only names, except parameter types and template arguments.

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

Hash tables with proc names as keys.

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

Maps from proc names.

module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t

Sets of proc names.

module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end

One-sized cache for one procedure at a time. Returns getter and setter.

val make_java : class_name:Typ.Name.t -> return_type:Typ.t option -> method_name:string -> parameters:Typ.t list -> kind:Java.kind -> t

Create a Java procedure name.

val make_csharp : class_name:Typ.Name.t -> return_type:Typ.t option -> method_name:string -> parameters:Typ.t list -> kind:CSharp.kind -> t

Create a CSharp procedure name.

val make_erlang : module_name:string -> function_name:string -> arity:int -> t

Create an Erlang procedure name.

val make_objc_dealloc : Typ.Name.t -> t

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"

val make_objc_copyWithZone : is_mutable:bool -> Typ.Name.t -> t

Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable.

val empty_block : t

Empty block name.

val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t

Return the language of the procedure.

val get_method : t -> string

Return the method/function of a procname.

val is_objc_block : t -> bool

Return whether the procname is a block procname.

val is_cpp_lambda : t -> bool

Return whether the procname is a cpp lambda procname.

val is_objc_dealloc : t -> bool

Return whether the dealloc method of an Objective-C class.

val is_objc_init : t -> bool

Return whether the init method of an Objective-C class.

val is_c_method : t -> bool

Return true this is an Objective-C/C++ method name.

val is_constructor : t -> bool

Check if this is a constructor.

val is_csharp : t -> bool

Check if this is a CSharp procedure name.

val is_java : t -> bool

Check if this is a Java procedure name.

val as_java_exn : explanation:string -> t -> Java.t

Converts to a Java.t. Throws if is_java is false

val with_block_parameters : t -> Block.t list -> t

Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures.

val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool

Check if this is a special Infer undefined procedure.

val get_global_name_of_initializer : t -> string option

Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise.

val pp : Stdlib.Format.formatter -> t -> unit

Pretty print a proc name for the user to see.

val to_string : t -> string

Convert a proc name into a string for the user to see.

val describe : Stdlib.Format.formatter -> t -> unit

to use in user messages

val replace_class : t -> Typ.Name.t -> t

Replace the class name component of a procedure name. In case of Java, replace package and class name.

val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?⁠withclass:bool -> F.formatter -> t -> unit

Pretty print a proc name as an easy string for the user to see in an IDE.

val to_simplified_string : ?⁠withclass:bool -> t -> string

Convert a proc name into an easy string for the user to see in an IDE.

val from_string_c_fun : string -> t

Convert a string to a c function name.

val replace_java_inner_class_prefix_regex : string -> string

Replace "$[0-9]+" index into "$_" in Java proc name.

val hashable_name : t -> string

Convert the procedure name in a format suitable for computing the bug hash.

val pp_unique_id : F.formatter -> t -> unit

Print a proc name as a unique identifier.

val to_unique_id : t -> string

Convert a proc name into a unique identifier.

val to_filename : t -> string

Convert a proc name to a filename.

val get_qualifiers : t -> QualifiedCppName.t

get qualifiers of C/objc/C++ method/function

module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/Typ/index.html b/website/static/odoc/next/infer/IR/Typ/index.html index 707b2089b..3c336f66f 100644 --- a/website/static/odoc/next/infer/IR/Typ/index.html +++ b/website/static/odoc/next/infer/IR/Typ/index.html @@ -1,2 +1,2 @@ -Typ (infer.IR.Typ)

Module IR.Typ

module F = Stdlib.Format
module IntegerWidths : sig ... end
type ikind =
| IChar

char

| ISChar

signed char

| IUChar

unsigned char

| IBool

bool

| IInt

int

| IUInt

unsigned int

| IShort

short

| IUShort

unsigned short

| ILong

long

| IULong

unsigned long

| ILongLong

long long (or _int64 on Microsoft Visual C)

| IULongLong

unsigned long long (or unsigned _int64 on Microsoft Visual C)

| I128

__int128_t

| IU128

__uint128_t

Kinds of integers

val compare_ikind : ikind -> ikind -> int
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

Check whether the integer kind is a char

val ikind_is_unsigned : ikind -> bool

Check whether the integer kind is unsigned

type fkind =
| FFloat

float

| FDouble

double

| FLongDouble

long double

Kinds of floating-point numbers

val compare_fkind : fkind -> fkind -> int
type ptr_kind =
| Pk_pointer

C/C++, Java, Objc standard/__strong pointer

| Pk_reference

C++ reference

| Pk_objc_weak

Obj-C __weak pointer

| Pk_objc_unsafe_unretained

Obj-C __unsafe_unretained pointer

| Pk_objc_autoreleasing

Obj-C __autoreleasing pointer

kind of pointer

val compare_ptr_kind : ptr_kind -> ptr_kind -> int
val equal_ptr_kind : ptr_kind -> ptr_kind -> bool
type type_quals
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;
}

types for sil (structured) expressions

and desc =
| Tint of ikind

integer type

| Tfloat of fkind

float type

| Tvoid

void type

| Tfun

function type

| Tptr of t * ptr_kind

pointer type

| Tstruct of name

structured value type name

| TVar of string

type variable (ie. C++ template variables)

| Tarray of {
elt : t;
length : IntLit.t option;
stride : IntLit.t option;
}

array type with statically fixed length and stride

and name =
| CStruct of QualifiedCppName.t
| CUnion of QualifiedCppName.t

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"

| 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

ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying>

| 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;

WARNING: because of type substitutions performed by 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

Create Typ.t from given desc. if default is passed then use its value to set other fields such as quals

val mk_array : ?⁠default:t -> ?⁠quals:type_quals -> ?⁠length:IntLit.t -> ?⁠stride:IntLit.t -> t -> t

Create an array type from a given element type. If 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

make a pointer to t, default kind is Pk_pointer

val get_ikind_opt : t -> ikind option

Get ikind if the type is integer.

val size_t : ikind

ikind of size_t

val is_weak_pointer : t -> bool
val is_strong_pointer : t -> bool
module Name : sig ... end
val equal : t -> t -> bool

Equality for types.

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

Equality for types, but ignoring quals in it.

val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type with all the details.

val pp : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type.

val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit

Pretty print a type desc.

val pp_java : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the Java frontend

val pp_cs : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the CSharp frontend

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

Dump a type with all the details.

val d_list : t list -> unit

Dump a list of types.

val name : t -> Name.t option

The name of a type

val strip_ptr : t -> t

turn a *T into a T. fails if t is not a pointer type

val is_ptr_to_ignore_quals : t -> ptr:t -> bool

check if ptr is a pointer type to t, ignoring quals

val array_elem : t option -> t -> t

If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception

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

is t a type produced by the Java frontend?

val is_java_primitive_type : t -> bool

is t a primitive type produced by the Java frontend?

val is_java_type : t -> bool

is t a type produced by the Java frontend?

val has_block_prefix : string -> bool
val unsome : string -> t option -> t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file +Typ (infer.IR.Typ)

Module IR.Typ

module F = Stdlib.Format
module IntegerWidths : sig ... end
type ikind =
| IChar

char

| ISChar

signed char

| IUChar

unsigned char

| IBool

bool

| IInt

int

| IUInt

unsigned int

| IShort

short

| IUShort

unsigned short

| ILong

long

| IULong

unsigned long

| ILongLong

long long (or _int64 on Microsoft Visual C)

| IULongLong

unsigned long long (or unsigned _int64 on Microsoft Visual C)

| I128

__int128_t

| IU128

__uint128_t

Kinds of integers

val compare_ikind : ikind -> ikind -> int
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

Check whether the integer kind is a char

val ikind_is_unsigned : ikind -> bool

Check whether the integer kind is unsigned

type fkind =
| FFloat

float

| FDouble

double

| FLongDouble

long double

Kinds of floating-point numbers

val compare_fkind : fkind -> fkind -> int
type ptr_kind =
| Pk_pointer

C/C++, Java, Objc standard/__strong pointer

| Pk_reference

C++ reference

| Pk_objc_weak

Obj-C __weak pointer

| Pk_objc_unsafe_unretained

Obj-C __unsafe_unretained pointer

| Pk_objc_autoreleasing

Obj-C __autoreleasing pointer

kind of pointer

val compare_ptr_kind : ptr_kind -> ptr_kind -> int
val equal_ptr_kind : ptr_kind -> ptr_kind -> bool
type type_quals
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;
}

types for sil (structured) expressions

and desc =
| Tint of ikind

integer type

| Tfloat of fkind

float type

| Tvoid

void type

| Tfun

function type

| Tptr of t * ptr_kind

pointer type

| Tstruct of name

structured value type name

| TVar of string

type variable (ie. C++ template variables)

| Tarray of {
elt : t;
length : IntLit.t option;
stride : IntLit.t option;
}

array type with statically fixed length and stride

and name =
| CStruct of QualifiedCppName.t
| CUnion of QualifiedCppName.t

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"

| 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

ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying>

| 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;

WARNING: because of type substitutions performed by 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

Create Typ.t from given desc. if default is passed then use its value to set other fields such as quals

val mk_array : ?⁠default:t -> ?⁠quals:type_quals -> ?⁠length:IntLit.t -> ?⁠stride:IntLit.t -> t -> t

Create an array type from a given element type. If 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

make a pointer to t, default kind is Pk_pointer

val get_ikind_opt : t -> ikind option

Get ikind if the type is integer.

val size_t : ikind

ikind of size_t

val is_weak_pointer : t -> bool
val is_strong_pointer : t -> bool
module Name : sig ... end
val equal : t -> t -> bool

Equality for types.

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

Equality for types, but ignoring quals in it.

val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type with all the details.

val pp : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type.

val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit

Pretty print a type desc.

val pp_java : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the Java frontend

val pp_cs : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the CSharp frontend

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

Dump a type with all the details.

val d_list : t list -> unit

Dump a list of types.

val name : t -> Name.t option

The name of a type

val strip_ptr : t -> t

turn a *T into a T. fails if t is not a pointer type

val is_ptr_to_ignore_quals : t -> ptr:t -> bool

check if ptr is a pointer type to t, ignoring quals

val array_elem : t option -> t -> t

If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception

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

is t a type produced by the Java frontend?

val is_java_primitive_type : t -> bool

is t a primitive type produced by the Java frontend?

val is_java_type : t -> bool

is t a type produced by the Java frontend?

val has_block_prefix : string -> bool
val unsome : string -> t option -> t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/index.html b/website/static/odoc/next/infer/IR/index.html index 270d3c918..9228d8088 100644 --- a/website/static/odoc/next/infer/IR/index.html +++ b/website/static/odoc/next/infer/IR/index.html @@ -1,2 +1,2 @@ -IR (infer.IR)

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
\ No newline at end of file +IR (infer.IR)

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR__BuiltinDecl/index.html b/website/static/odoc/next/infer/IR__BuiltinDecl/index.html index 9c6115551..f6ccf1508 100644 --- a/website/static/odoc/next/infer/IR__BuiltinDecl/index.html +++ b/website/static/odoc/next/infer/IR__BuiltinDecl/index.html @@ -1,2 +1,2 @@ -IR__BuiltinDecl (infer.IR__BuiltinDecl)

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

used to represent behavior that is not modeled in infer

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
\ No newline at end of file +IR__BuiltinDecl (infer.IR__BuiltinDecl)

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

used to represent behavior that is not modeled in infer

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

all patterns in a function failed to match

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR__ErlangTypeName/.dune-keep b/website/static/odoc/next/infer/IR__ErlangTypeName/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/IR__ErlangTypeName/index.html b/website/static/odoc/next/infer/IR__ErlangTypeName/index.html new file mode 100644 index 000000000..bfb587b31 --- /dev/null +++ b/website/static/odoc/next/infer/IR__ErlangTypeName/index.html @@ -0,0 +1,2 @@ + +IR__ErlangTypeName (infer.IR__ErlangTypeName)

Module IR__ErlangTypeName

type t =
| Any
val compare : t -> t -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp : Stdlib.Format.formatter -> t -> unit
val to_string : t -> string
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR__Procdesc/index.html b/website/static/odoc/next/infer/IR__Procdesc/index.html index 074f64d35..26ae92b85 100644 --- a/website/static/odoc/next/infer/IR__Procdesc/index.html +++ b/website/static/odoc/next/infer/IR__Procdesc/index.html @@ -1,2 +1,2 @@ -IR__Procdesc (infer.IR__Procdesc)

Module IR__Procdesc

Per-procedure CFG

module NodeKey : sig ... end
module Node : sig ... end

node of the control flow graph

module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id

Map with node id keys.

module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t

Hash table with nodes as keys.

module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t

Map over nodes.

module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t

Set of nodes.

type t

proc description

val append_locals : t -> IR.ProcAttributes.var_data list -> unit

append a list of new local variables to the existing list of local variables

val compute_distance_to_exit_node : t -> unit

Compute the distance of each node to the exit node, if not computed already

val create_node : t -> IBase.Location.t -> Node.nodekind -> IR.Sil.instr list -> Node.t

Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc.

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

fold over all nodes and their instructions

val find_map_instrs : t -> f:(IR.Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : IR.ProcAttributes.t -> t

Use Cfg.create_proc_desc if you are adding a proc desc to a cfg

val get_access : t -> IR.ProcAttributes.access

Return the visibility attribute

val get_attributes : t -> IR.ProcAttributes.t

Get the attributes of the procedure.

val set_attributes : t -> IR.ProcAttributes.t -> unit
val get_captured : t -> IR.CapturedVar.t list

Return name and type of block's captured variables

val get_exit_node : t -> Node.t
val get_formals : t -> (IR.Mangled.t * IR.Typ.t) list

Return name and type of formal parameters

val get_pvar_formals : t -> (IR.Pvar.t * IR.Typ.t) list

Return pvar and type of formal parameters

val get_loc : t -> IBase.Location.t

Return loc information for the procedure

val get_locals : t -> IR.ProcAttributes.var_data list

Return name and type and attributes of local variables

val get_nodes : t -> Node.t list
val get_proc_name : t -> IR.Procname.t
val get_ret_type : t -> IR.Typ.t

Return the return type of the procedure and type string

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

get a list of unique static callees excluding self

val is_defined : t -> bool

Return true iff the procedure is defined, and not just declared

val is_java_synchronized : t -> bool

Return true if the procedure signature has the Java synchronized keyword

val is_csharp_synchronized : t -> bool

Return true if the procedure is synchronized via a C# lock

val is_objc_arc_on : t -> bool

Return true iff the ObjC procedure is compiled with ARC

val iter_instrs : (Node.t -> IR.Sil.instr -> unit) -> t -> unit

iterate over all nodes and their instructions

val replace_instrs : t -> f:(Node.t -> IR.Sil.instr -> IR.Sil.instr) -> bool

Map and replace the instructions to be executed. Returns true if at least one substitution occured.

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

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.

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

Like replace_instrs_using_context, but slower, and each instruction may be replaced by 0, 1, or more instructions.

val iter_nodes : (Node.t -> unit) -> t -> unit

iterate over all the nodes of a procedure

val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold over all the nodes of a procedure

val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold between two nodes or until we reach a branching structure

val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit

Set the successor nodes and exception nodes, if given, and update predecessor links

val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit

Set the successor nodes and exception nodes, and update predecessor links

val set_exit_node : t -> Node.t -> unit

Set the exit node of the procedure

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

true if pvar is a captured variable of a cpp lambda or obcj block

val is_captured_var : t -> IR.Var.t -> bool

true if var is a captured variable of a cpp lambda or obcj block

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

per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG

val load : IR.Procname.t -> t option
\ No newline at end of file +IR__Procdesc (infer.IR__Procdesc)

Module IR__Procdesc

Per-procedure CFG

module NodeKey : sig ... end
module Node : sig ... end

node of the control flow graph

module IdMap : IStdlib.PrettyPrintable.PPMap with type PPMap.key = Node.id

Map with node id keys.

module NodeHash : IStdlib.IStd.Caml.Hashtbl.S with type NodeHash.key = Node.t

Hash table with nodes as keys.

module NodeMap : IStdlib.IStd.Caml.Map.S with type NodeMap.key = Node.t

Map over nodes.

module NodeSet : IStdlib.IStd.Caml.Set.S with type NodeSet.elt = Node.t

Set of nodes.

type t

proc description

val append_locals : t -> IR.ProcAttributes.var_data list -> unit

append a list of new local variables to the existing list of local variables

val compute_distance_to_exit_node : t -> unit

Compute the distance of each node to the exit node, if not computed already

val create_node : t -> IBase.Location.t -> Node.nodekind -> IR.Sil.instr list -> Node.t

Create a new cfg node with the given location, kind, list of instructions, and add it to the procdesc.

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

fold over all nodes and their instructions

val find_map_instrs : t -> f:(IR.Sil.instr -> 'a option) -> 'a option
val from_proc_attributes : IR.ProcAttributes.t -> t

Use Cfg.create_proc_desc if you are adding a proc desc to a cfg

val get_access : t -> IR.ProcAttributes.access

Return the visibility attribute

val get_attributes : t -> IR.ProcAttributes.t

Get the attributes of the procedure.

val set_attributes : t -> IR.ProcAttributes.t -> unit
val get_captured : t -> IR.CapturedVar.t list

Return name and type of block's captured variables

val get_exit_node : t -> Node.t
val get_formals : t -> (IR.Mangled.t * IR.Typ.t) list

Return name and type of formal parameters

val get_pvar_formals : t -> (IR.Pvar.t * IR.Typ.t) list

Return pvar and type of formal parameters

val get_loc : t -> IBase.Location.t

Return loc information for the procedure

val get_locals : t -> IR.ProcAttributes.var_data list

Return name and type and attributes of local variables

val get_nodes : t -> Node.t list
val get_proc_name : t -> IR.Procname.t
val get_ret_type : t -> IR.Typ.t

Return the return type of the procedure and type string

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

Return the return type from method signature: if the procedure has added return parameter, return its type

val get_start_node : t -> Node.t
val get_static_callees : t -> IR.Procname.t list

get a list of unique static callees excluding self

val is_defined : t -> bool

Return true iff the procedure is defined, and not just declared

val is_java_synchronized : t -> bool

Return true if the procedure signature has the Java synchronized keyword

val is_csharp_synchronized : t -> bool

Return true if the procedure is synchronized via a C# lock

val is_objc_arc_on : t -> bool

Return true iff the ObjC procedure is compiled with ARC

val iter_instrs : (Node.t -> IR.Sil.instr -> unit) -> t -> unit

iterate over all nodes and their instructions

val replace_instrs : t -> f:(Node.t -> IR.Sil.instr -> IR.Sil.instr) -> bool

Map and replace the instructions to be executed. Returns true if at least one substitution occured.

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

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.

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

Like replace_instrs_using_context, but slower, and each instruction may be replaced by 0, 1, or more instructions.

val iter_nodes : (Node.t -> unit) -> t -> unit

iterate over all the nodes of a procedure

val fold_nodes : t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold over all the nodes of a procedure

val fold_slope_range : Node.t -> Node.t -> init:'accum -> f:('accum -> Node.t -> 'accum) -> 'accum

fold between two nodes or until we reach a branching structure

val set_succs : Node.t -> normal:Node.t list option -> exn:Node.t list option -> unit

Set the successor nodes and exception nodes, if given, and update predecessor links

val node_set_succs : t -> Node.t -> normal:Node.t list -> exn:Node.t list -> unit

Set the successor nodes and exception nodes, and update predecessor links

val set_exit_node : t -> Node.t -> unit

Set the exit node of the procedure

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

true if pvar is a captured variable of a cpp lambda or obcj block

val is_captured_var : t -> IR.Var.t -> bool

true if var is a captured variable of a cpp lambda or obcj block

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

per-procedure CFGs are stored in the SQLite "procedures" table as NULL if the procedure has no CFG

val load : IR.Procname.t -> t option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR__Procname/index.html b/website/static/odoc/next/infer/IR__Procname/index.html index c70e1f46e..02da3b18b 100644 --- a/website/static/odoc/next/infer/IR__Procname/index.html +++ b/website/static/odoc/next/infer/IR__Procname/index.html @@ -1,2 +1,2 @@ -IR__Procname (infer.IR__Procname)

Module IR__Procname

module F = Stdlib.Format
module CSharp : sig ... end

Type of csharp procedure names.

module Java : sig ... end

Type of java procedure names.

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

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: 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 compare : t -> t -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int

Similar to compare, but compares only names, except parameter types and template arguments.

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

Hash tables with proc names as keys.

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

Maps from proc names.

module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t

Sets of proc names.

module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end

One-sized cache for one procedure at a time. Returns getter and setter.

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

Create a Java procedure name.

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

Create a CSharp procedure name.

val make_objc_dealloc : IR.Typ.Name.t -> t

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"

val make_objc_copyWithZone : is_mutable:bool -> IR.Typ.Name.t -> t

Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable.

val empty_block : t

Empty block name.

val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t

Return the language of the procedure.

val get_method : t -> string

Return the method/function of a procname.

val is_objc_block : t -> bool

Return whether the procname is a block procname.

val is_cpp_lambda : t -> bool

Return whether the procname is a cpp lambda procname.

val is_objc_dealloc : t -> bool

Return whether the dealloc method of an Objective-C class.

val is_objc_init : t -> bool

Return whether the init method of an Objective-C class.

val is_c_method : t -> bool

Return true this is an Objective-C/C++ method name.

val is_constructor : t -> bool

Check if this is a constructor.

val is_csharp : t -> bool

Check if this is a CSharp procedure name.

val is_java : t -> bool

Check if this is a Java procedure name.

val as_java_exn : explanation:string -> t -> Java.t

Converts to a Java.t. Throws if is_java is false

val with_block_parameters : t -> Block.t list -> t

Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures.

val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool

Check if this is a special Infer undefined procedure.

val get_global_name_of_initializer : t -> string option

Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise.

val pp : Stdlib.Format.formatter -> t -> unit

Pretty print a proc name for the user to see.

val to_string : t -> string

Convert a proc name into a string for the user to see.

val describe : Stdlib.Format.formatter -> t -> unit

to use in user messages

val replace_class : t -> IR.Typ.Name.t -> t

Replace the class name component of a procedure name. In case of Java, replace package and class name.

val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?⁠withclass:bool -> F.formatter -> t -> unit

Pretty print a proc name as an easy string for the user to see in an IDE.

val to_simplified_string : ?⁠withclass:bool -> t -> string

Convert a proc name into an easy string for the user to see in an IDE.

val from_string_c_fun : string -> t

Convert a string to a c function name.

val replace_java_inner_class_prefix_regex : string -> string

Replace "$[0-9]+" index into "$_" in Java proc name.

val hashable_name : t -> string

Convert the procedure name in a format suitable for computing the bug hash.

val pp_unique_id : F.formatter -> t -> unit

Print a proc name as a unique identifier.

val to_unique_id : t -> string

Convert a proc name into a unique identifier.

val to_filename : t -> string

Convert a proc name to a filename.

val get_qualifiers : t -> IR.QualifiedCppName.t

get qualifiers of C/objc/C++ method/function

module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file +IR__Procname (infer.IR__Procname)

Module IR__Procname

module F = Stdlib.Format
module CSharp : sig ... end

Type of csharp procedure names.

module Java : sig ... end

Type of java procedure names.

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

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: 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 compare : t -> t -> int
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val block_of_procname : t -> Block.t
val equal : t -> t -> bool
val compare_name : t -> t -> int

Similar to compare, but compares only names, except parameter types and template arguments.

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

Hash tables with proc names as keys.

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

Maps from proc names.

module Set : IStdlib.PrettyPrintable.PPSet with type PPSet.elt = t

Sets of proc names.

module SQLite : sig ... end
module SQLiteList : IBase.SqliteUtils.Data with type t = t list
module UnitCache : sig ... end

One-sized cache for one procedure at a time. Returns getter and setter.

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

Create a Java procedure name.

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

Create a CSharp procedure name.

val make_erlang : module_name:string -> function_name:string -> arity:int -> t

Create an Erlang procedure name.

val make_objc_dealloc : IR.Typ.Name.t -> t

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"

val make_objc_copyWithZone : is_mutable:bool -> IR.Typ.Name.t -> t

Create an Objective-C method for copyWithZone: or mutableCopyWithZone: according to is_mutable.

val empty_block : t

Empty block name.

val get_block_type : t -> Block.block_type
val get_language : t -> IBase.Language.t

Return the language of the procedure.

val get_method : t -> string

Return the method/function of a procname.

val is_objc_block : t -> bool

Return whether the procname is a block procname.

val is_cpp_lambda : t -> bool

Return whether the procname is a cpp lambda procname.

val is_objc_dealloc : t -> bool

Return whether the dealloc method of an Objective-C class.

val is_objc_init : t -> bool

Return whether the init method of an Objective-C class.

val is_c_method : t -> bool

Return true this is an Objective-C/C++ method name.

val is_constructor : t -> bool

Check if this is a constructor.

val is_csharp : t -> bool

Check if this is a CSharp procedure name.

val is_java : t -> bool

Check if this is a Java procedure name.

val as_java_exn : explanation:string -> t -> Java.t

Converts to a Java.t. Throws if is_java is false

val with_block_parameters : t -> Block.t list -> t

Create a procedure name instantiated with block parameters from a base procedure name and a list of block procedures.

val objc_cpp_replace_method_name : t -> string -> t
val is_infer_undefined : t -> bool

Check if this is a special Infer undefined procedure.

val get_global_name_of_initializer : t -> string option

Return the name of the global for which this procedure is the initializer if this is an initializer, None otherwise.

val pp : Stdlib.Format.formatter -> t -> unit

Pretty print a proc name for the user to see.

val to_string : t -> string

Convert a proc name into a string for the user to see.

val describe : Stdlib.Format.formatter -> t -> unit

to use in user messages

val replace_class : t -> IR.Typ.Name.t -> t

Replace the class name component of a procedure name. In case of Java, replace package and class name.

val is_method_in_objc_protocol : t -> bool
val pp_simplified_string : ?⁠withclass:bool -> F.formatter -> t -> unit

Pretty print a proc name as an easy string for the user to see in an IDE.

val to_simplified_string : ?⁠withclass:bool -> t -> string

Convert a proc name into an easy string for the user to see in an IDE.

val from_string_c_fun : string -> t

Convert a string to a c function name.

val replace_java_inner_class_prefix_regex : string -> string

Replace "$[0-9]+" index into "$_" in Java proc name.

val hashable_name : t -> string

Convert the procedure name in a format suitable for computing the bug hash.

val pp_unique_id : F.formatter -> t -> unit

Print a proc name as a unique identifier.

val to_unique_id : t -> string

Convert a proc name into a unique identifier.

val to_filename : t -> string

Convert a proc name to a filename.

val get_qualifiers : t -> IR.QualifiedCppName.t

get qualifiers of C/objc/C++ method/function

module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR__Typ/index.html b/website/static/odoc/next/infer/IR__Typ/index.html index 93b26d91e..4135437ec 100644 --- a/website/static/odoc/next/infer/IR__Typ/index.html +++ b/website/static/odoc/next/infer/IR__Typ/index.html @@ -1,2 +1,2 @@ -IR__Typ (infer.IR__Typ)

Module IR__Typ

The Smallfoot Intermediate Language: Types

module F = Stdlib.Format
module IntegerWidths : sig ... end
type ikind =
| IChar

char

| ISChar

signed char

| IUChar

unsigned char

| IBool

bool

| IInt

int

| IUInt

unsigned int

| IShort

short

| IUShort

unsigned short

| ILong

long

| IULong

unsigned long

| ILongLong

long long (or _int64 on Microsoft Visual C)

| IULongLong

unsigned long long (or unsigned _int64 on Microsoft Visual C)

| I128

__int128_t

| IU128

__uint128_t

Kinds of integers

val compare_ikind : ikind -> ikind -> int
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

Check whether the integer kind is a char

val ikind_is_unsigned : ikind -> bool

Check whether the integer kind is unsigned

type fkind =
| FFloat

float

| FDouble

double

| FLongDouble

long double

Kinds of floating-point numbers

val compare_fkind : fkind -> fkind -> int
type ptr_kind =
| Pk_pointer

C/C++, Java, Objc standard/__strong pointer

| Pk_reference

C++ reference

| Pk_objc_weak

Obj-C __weak pointer

| Pk_objc_unsafe_unretained

Obj-C __unsafe_unretained pointer

| Pk_objc_autoreleasing

Obj-C __autoreleasing pointer

kind of pointer

val compare_ptr_kind : ptr_kind -> ptr_kind -> int
val equal_ptr_kind : ptr_kind -> ptr_kind -> bool
type type_quals
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;
}

types for sil (structured) expressions

and desc =
| Tint of ikind

integer type

| Tfloat of fkind

float type

| Tvoid

void type

| Tfun

function type

| Tptr of t * ptr_kind

pointer type

| Tstruct of name

structured value type name

| TVar of string

type variable (ie. C++ template variables)

| Tarray of {
elt : t;
length : IR.IntLit.t option;
stride : IR.IntLit.t option;
}

array type with statically fixed length and stride

and name =
| CStruct of IR.QualifiedCppName.t
| CUnion of IR.QualifiedCppName.t

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"

| 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

ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying>

| 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;

WARNING: because of type substitutions performed by 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

Create Typ.t from given desc. if default is passed then use its value to set other fields such as quals

val mk_array : ?⁠default:t -> ?⁠quals:type_quals -> ?⁠length:IR.IntLit.t -> ?⁠stride:IR.IntLit.t -> t -> t

Create an array type from a given element type. If 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

make a pointer to t, default kind is Pk_pointer

val get_ikind_opt : t -> ikind option

Get ikind if the type is integer.

val size_t : ikind

ikind of size_t

val is_weak_pointer : t -> bool
val is_strong_pointer : t -> bool
module Name : sig ... end
val equal : t -> t -> bool

Equality for types.

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

Equality for types, but ignoring quals in it.

val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type with all the details.

val pp : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type.

val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit

Pretty print a type desc.

val pp_java : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the Java frontend

val pp_cs : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the CSharp frontend

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

Dump a type with all the details.

val d_list : t list -> unit

Dump a list of types.

val name : t -> Name.t option

The name of a type

val strip_ptr : t -> t

turn a *T into a T. fails if t is not a pointer type

val is_ptr_to_ignore_quals : t -> ptr:t -> bool

check if ptr is a pointer type to t, ignoring quals

val array_elem : t option -> t -> t

If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception

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

is t a type produced by the Java frontend?

val is_java_primitive_type : t -> bool

is t a primitive type produced by the Java frontend?

val is_java_type : t -> bool

is t a type produced by the Java frontend?

val has_block_prefix : string -> bool
val unsome : string -> t option -> t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file +IR__Typ (infer.IR__Typ)

Module IR__Typ

The Smallfoot Intermediate Language: Types

module F = Stdlib.Format
module IntegerWidths : sig ... end
type ikind =
| IChar

char

| ISChar

signed char

| IUChar

unsigned char

| IBool

bool

| IInt

int

| IUInt

unsigned int

| IShort

short

| IUShort

unsigned short

| ILong

long

| IULong

unsigned long

| ILongLong

long long (or _int64 on Microsoft Visual C)

| IULongLong

unsigned long long (or unsigned _int64 on Microsoft Visual C)

| I128

__int128_t

| IU128

__uint128_t

Kinds of integers

val compare_ikind : ikind -> ikind -> int
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

Check whether the integer kind is a char

val ikind_is_unsigned : ikind -> bool

Check whether the integer kind is unsigned

type fkind =
| FFloat

float

| FDouble

double

| FLongDouble

long double

Kinds of floating-point numbers

val compare_fkind : fkind -> fkind -> int
type ptr_kind =
| Pk_pointer

C/C++, Java, Objc standard/__strong pointer

| Pk_reference

C++ reference

| Pk_objc_weak

Obj-C __weak pointer

| Pk_objc_unsafe_unretained

Obj-C __unsafe_unretained pointer

| Pk_objc_autoreleasing

Obj-C __autoreleasing pointer

kind of pointer

val compare_ptr_kind : ptr_kind -> ptr_kind -> int
val equal_ptr_kind : ptr_kind -> ptr_kind -> bool
type type_quals
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;
}

types for sil (structured) expressions

and desc =
| Tint of ikind

integer type

| Tfloat of fkind

float type

| Tvoid

void type

| Tfun

function type

| Tptr of t * ptr_kind

pointer type

| Tstruct of name

structured value type name

| TVar of string

type variable (ie. C++ template variables)

| Tarray of {
elt : t;
length : IR.IntLit.t option;
stride : IR.IntLit.t option;
}

array type with statically fixed length and stride

and name =
| CStruct of IR.QualifiedCppName.t
| CUnion of IR.QualifiedCppName.t

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"

| 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

ObjC class that conforms to a list of protocols, e.g. id<NSFastEnumeration, NSCopying>

| 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;

WARNING: because of type substitutions performed by 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

Create Typ.t from given desc. if default is passed then use its value to set other fields such as quals

val mk_array : ?⁠default:t -> ?⁠quals:type_quals -> ?⁠length:IR.IntLit.t -> ?⁠stride:IR.IntLit.t -> t -> t

Create an array type from a given element type. If 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

make a pointer to t, default kind is Pk_pointer

val get_ikind_opt : t -> ikind option

Get ikind if the type is integer.

val size_t : ikind

ikind of size_t

val is_weak_pointer : t -> bool
val is_strong_pointer : t -> bool
module Name : sig ... end
val equal : t -> t -> bool

Equality for types.

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

Equality for types, but ignoring quals in it.

val pp_full : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type with all the details.

val pp : IStdlib.Pp.env -> F.formatter -> t -> unit

Pretty print a type.

val pp_desc : IStdlib.Pp.env -> F.formatter -> desc -> unit

Pretty print a type desc.

val pp_java : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the Java frontend

val pp_cs : verbose:bool -> F.formatter -> t -> unit

Pretty print a Java type. Raises if type isn't produced by the CSharp frontend

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

Dump a type with all the details.

val d_list : t list -> unit

Dump a list of types.

val name : t -> Name.t option

The name of a type

val strip_ptr : t -> t

turn a *T into a T. fails if t is not a pointer type

val is_ptr_to_ignore_quals : t -> ptr:t -> bool

check if ptr is a pointer type to t, ignoring quals

val array_elem : t option -> t -> t

If an array type, return the type of the element. If not, return the default type if given, otherwise raise an exception

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

is t a type produced by the Java frontend?

val is_java_primitive_type : t -> bool

is t a primitive type produced by the Java frontend?

val is_java_type : t -> bool

is t a type produced by the Java frontend?

val has_block_prefix : string -> bool
val unsome : string -> t option -> t
module Normalizer : IStdlib.HashNormalizer.S with type t = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration/Driver/index.html b/website/static/odoc/next/infer/Integration/Driver/index.html index a99561937..2d2c28cea 100644 --- a/website/static/odoc/next/infer/Integration/Driver/index.html +++ b/website/static/odoc/next/infer/Integration/Driver/index.html @@ -1,2 +1,2 @@ -Driver (infer.Integration.Driver)

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;
}

based on the build_system and options passed to infer, we run in different driver modes

val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t

driver mode computed from the command-line arguments and settings in Config

val run_prologue : mode -> unit

prepare the environment for running the given mode

val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the capture for the given mode

val analyze_and_report : ?⁠suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the analysis for the given mode

val run_epilogue : unit -> unit

cleanup infer-out/ for Buck, generate stats, and generally post-process the results of a run

val read_config_changed_files : unit -> IBase.SourceFile.Set.t option

return the list of changed files as read from Config.changed_files_index and passed to SourceFile.changed_sources_from_changed_files

\ No newline at end of file +Driver (infer.Integration.Driver)

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;
}

based on the build_system and options passed to infer, we run in different driver modes

val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t

driver mode computed from the command-line arguments and settings in Config

val run_prologue : mode -> unit

prepare the environment for running the given mode

val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the capture for the given mode

val analyze_and_report : ?⁠suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the analysis for the given mode

val run_epilogue : unit -> unit

cleanup infer-out/ for Buck, generate stats, and generally post-process the results of a run

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration__Driver/index.html b/website/static/odoc/next/infer/Integration__Driver/index.html index 91c835c70..859bed838 100644 --- a/website/static/odoc/next/infer/Integration__Driver/index.html +++ b/website/static/odoc/next/infer/Integration__Driver/index.html @@ -1,2 +1,2 @@ -Integration__Driver (infer.Integration__Driver)

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;
}

based on the build_system and options passed to infer, we run in different driver modes

val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t

driver mode computed from the command-line arguments and settings in Config

val run_prologue : mode -> unit

prepare the environment for running the given mode

val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the capture for the given mode

val analyze_and_report : ?⁠suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the analysis for the given mode

val run_epilogue : unit -> unit

cleanup infer-out/ for Buck, generate stats, and generally post-process the results of a run

val read_config_changed_files : unit -> IBase.SourceFile.Set.t option

return the list of changed files as read from Config.changed_files_index and passed to SourceFile.changed_sources_from_changed_files

\ No newline at end of file +Integration__Driver (infer.Integration__Driver)

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;
}

based on the build_system and options passed to infer, we run in different driver modes

val is_analyze_mode : mode -> bool
val mode_from_command_line : mode IStdlib.IStd.Lazy.t

driver mode computed from the command-line arguments and settings in Config

val run_prologue : mode -> unit

prepare the environment for running the given mode

val capture : changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the capture for the given mode

val analyze_and_report : ?⁠suppress_console_report:bool -> changed_files:IBase.SourceFile.Set.t option -> mode -> unit

run the analysis for the given mode

val run_epilogue : unit -> unit

cleanup infer-out/ for Buck, generate stats, and generally post-process the results of a run

\ No newline at end of file diff --git a/website/static/odoc/next/infer/OpenSource/FbThreadSafety/index.html b/website/static/odoc/next/infer/OpenSource/FbThreadSafety/index.html index ed5cf30ab..3065350b9 100644 --- a/website/static/odoc/next/infer/OpenSource/FbThreadSafety/index.html +++ b/website/static/odoc/next/infer/OpenSource/FbThreadSafety/index.html @@ -1,2 +1,2 @@ -FbThreadSafety (infer.OpenSource.FbThreadSafety)

Module OpenSource.FbThreadSafety

val is_custom_init : 'tenv_t -> 'procname_t -> bool
val is_logging_method : 'procname_t -> bool
val get_fbthreadsafe_class_annot : 'procname_t -> 'tenv_t -> (string * string) option
val message_fbthreadsafe_class : string -> string -> string
\ No newline at end of file +FbThreadSafety (infer.OpenSource.FbThreadSafety)

Module OpenSource.FbThreadSafety

val is_custom_init : 'tenv_t -> 'procname_t -> bool
val is_logging_method : 'procname_t -> bool
\ No newline at end of file diff --git a/website/static/odoc/next/infer/OpenSource__FbThreadSafety/index.html b/website/static/odoc/next/infer/OpenSource__FbThreadSafety/index.html index f5d2897ec..14399b475 100644 --- a/website/static/odoc/next/infer/OpenSource__FbThreadSafety/index.html +++ b/website/static/odoc/next/infer/OpenSource__FbThreadSafety/index.html @@ -1,2 +1,2 @@ -OpenSource__FbThreadSafety (infer.OpenSource__FbThreadSafety)

Module OpenSource__FbThreadSafety

val is_custom_init : 'tenv_t -> 'procname_t -> bool
val is_logging_method : 'procname_t -> bool
val get_fbthreadsafe_class_annot : 'procname_t -> 'tenv_t -> (string * string) option
val message_fbthreadsafe_class : string -> string -> string
\ No newline at end of file +OpenSource__FbThreadSafety (infer.OpenSource__FbThreadSafety)

Module OpenSource__FbThreadSafety

val is_custom_init : 'tenv_t -> 'procname_t -> bool
val is_logging_method : 'procname_t -> bool
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/AddressAttributes/index.html b/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/AddressAttributes/index.html index 02b811741..7aa93c84e 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/AddressAttributes/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/AddressAttributes/index.html @@ -1,2 +1,2 @@ -AddressAttributes (infer.Pulselib.PulseAbductiveDomain.AddressAttributes)

Module PulseAbductiveDomain.AddressAttributes

attribute operations like BaseAddressAttributes but that also take care of propagating facts to the precondition

val abduce_and_add : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t

add the attributes to both the current state and, if meaningful, the pre

val add_one : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attribute.t -> t -> t

add the attribute only to the post

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 -> (tPulseBasicInterface.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
\ No newline at end of file +AddressAttributes (infer.Pulselib.PulseAbductiveDomain.AddressAttributes)

Module PulseAbductiveDomain.AddressAttributes

attribute operations like BaseAddressAttributes but that also take care of propagating facts to the precondition

val abduce_and_add : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attributes.t -> t -> t

add the attributes to both the current state and, if meaningful, the pre

val add_one : PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.Attribute.t -> t -> t

add the attribute only to the post

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 -> (tPulseBasicInterface.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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/Stack/index.html b/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/Stack/index.html index 76f3e36bd..c4bd7bbaf 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/Stack/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/Stack/index.html @@ -1,2 +1,2 @@ -Stack (infer.Pulselib.PulseAbductiveDomain.Stack)

Module PulseAbductiveDomain.Stack

stack operations like BaseStack but that also take care of propagating facts to the precondition

val 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)

return the value of the variable in the stack or create a fresh one if needed

val mem : IR.Var.t -> t -> bool
val exists : (IR.Var.t -> BaseStack.value -> bool) -> t -> bool
val keys : t -> IR.Var.t list
\ No newline at end of file +Stack (infer.Pulselib.PulseAbductiveDomain.Stack)

Module PulseAbductiveDomain.Stack

stack operations like BaseStack but that also take care of propagating facts to the precondition

val 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)

return the value of the variable in the stack or create a fresh one if needed

val mem : IR.Var.t -> t -> bool
val exists : (IR.Var.t -> BaseStack.value -> bool) -> t -> bool
val keys : t -> IR.Var.t list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseArithmetic/index.html b/website/static/odoc/next/infer/Pulselib/PulseArithmetic/index.html index f11d2f716..7da704241 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseArithmetic/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseArithmetic/index.html @@ -1,2 +1,2 @@ -PulseArithmetic (infer.Pulselib.PulseArithmetic)

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

helper function wrapping prune_binop

val prune_positive : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t

helper function wrapping 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
\ No newline at end of file +PulseArithmetic (infer.Pulselib.PulseArithmetic)

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

helper function wrapping prune_binop

val prune_positive : PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t

helper function wrapping 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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseAttribute/Attributes/index.html b/website/static/odoc/next/infer/Pulselib/PulseAttribute/Attributes/index.html index 0fac4d254..f06e36700 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseAttribute/Attributes/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseAttribute/Attributes/index.html @@ -1,2 +1,2 @@ -Attributes (infer.Pulselib.PulseAttribute.Attributes)

Module PulseAttribute.Attributes

include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type t
val compare : t -> t -> int
val equal : t -> t -> bool
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

in case an element with the same rank is present both in 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

check whether for each attr in the second list, there exists a corresponding attr in the first according to Attributes.isl_equiv.

val replace_isl_abduced : t -> t -> t

While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable

val add_call : IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
\ No newline at end of file +Attributes (infer.Pulselib.PulseAttribute.Attributes)

Module PulseAttribute.Attributes

include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type t
val compare : t -> t -> int
val equal : t -> t -> bool
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

in case an element with the same rank is present both in 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

check whether for each attr in the second list, there exists a corresponding attr in the first according to Attributes.isl_equiv.

val replace_isl_abduced : t -> t -> t

While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable

val add_call : PathContext.t -> IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseAttribute/index.html b/website/static/odoc/next/infer/Pulselib/PulseAttribute/index.html index ccf889e7e..e944465c1 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseAttribute/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseAttribute/index.html @@ -1,2 +1,2 @@ -PulseAttribute (infer.Pulselib.PulseAttribute)

Module Pulselib.PulseAttribute

module F = Stdlib.Format
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

the 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

The allocation is abduced so as the analysis could run normally

| MustBeInitialized of Trace.t
| MustBeValid of Trace.t * Invalidation.must_be_valid_reason option
| StdVectorReserve
| Uninitialized
| UnreachableAt of IBase.Location.t

temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks

| WrittenTo of Trace.t
val compare : t -> t -> int
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
\ No newline at end of file +PulseAttribute (infer.Pulselib.PulseAttribute)

Module Pulselib.PulseAttribute

module F = Stdlib.Format
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

the 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

The allocation is abduced so as the analysis could run normally

| 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

temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks

| WrittenTo of Trace.t
val compare : t -> t -> int
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseBaseAddressAttributes/index.html b/website/static/odoc/next/infer/Pulselib/PulseBaseAddressAttributes/index.html index 0983b41db..b4e82ee55 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseBaseAddressAttributes/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseBaseAddressAttributes/index.html @@ -1,2 +1,2 @@ -PulseBaseAddressAttributes (infer.Pulselib.PulseBaseAddressAttributes)

Module Pulselib.PulseBaseAddressAttributes

module F = Stdlib.Format
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
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

merge the attributes of all the variables that are equal according to get_var_repr and remove non-canonical variables in favor of their rerpresentative

val subst_var : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.AbstractValue.t) -> t -> t
\ No newline at end of file +PulseBaseAddressAttributes (infer.Pulselib.PulseBaseAddressAttributes)

Module Pulselib.PulseBaseAddressAttributes

module F = Stdlib.Format
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
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

merge the attributes of all the variables that are equal according to get_var_repr and remove non-canonical variables in favor of their rerpresentative

val subst_var : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.AbstractValue.t) -> t -> t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseBasicInterface/index.html b/website/static/odoc/next/infer/Pulselib/PulseBasicInterface/index.html index 155f4670a..8e05ecc97 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseBasicInterface/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseBasicInterface/index.html @@ -1,2 +1,2 @@ -PulseBasicInterface (infer.Pulselib.PulseBasicInterface)

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
\ No newline at end of file +PulseBasicInterface (infer.Pulselib.PulseBasicInterface)

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseCallOperations/index.html b/website/static/odoc/next/infer/Pulselib/PulseCallOperations/index.html index a95dde526..04dcaa050 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseCallOperations/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseCallOperations/index.html @@ -1,2 +1,2 @@ -PulseCallOperations (infer.Pulselib.PulseCallOperations)

Module Pulselib.PulseCallOperations

type t = PulseDomainInterface.AbductiveDomain.t
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

perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists

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

performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate

val conservatively_initialize_args : PulseBasicInterface.AbstractValue.t list -> t -> t
\ No newline at end of file +PulseCallOperations (infer.Pulselib.PulseCallOperations)

Module Pulselib.PulseCallOperations

type t = PulseDomainInterface.AbductiveDomain.t
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

perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists

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

performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate

val conservatively_initialize_args : PulseBasicInterface.AbstractValue.t list -> t -> t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseFormula/index.html b/website/static/odoc/next/infer/Pulselib/PulseFormula/index.html index d9799c915..efbbbf7bc 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseFormula/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseFormula/index.html @@ -1,2 +1,2 @@ -PulseFormula (infer.Pulselib.PulseFormula)

Module Pulselib.PulseFormula

module F = Stdlib.Format
module SatUnsat = PulseSatUnsat
module Var = PulseAbstractValue

Arithmetic solver

Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable.

type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit

only used for unit tests

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

some operations will return a set of new facts discovered that are relevant to communicate to the memory domain

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

think a bit harder about the formula

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

get the canonical representative for the variable according to the known/post equality relation

val get_both_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the both/pre+post equality relation

\ No newline at end of file +PulseFormula (infer.Pulselib.PulseFormula)

Module Pulselib.PulseFormula

module F = Stdlib.Format
module SatUnsat = PulseSatUnsat
module Var = PulseAbstractValue

Arithmetic solver

Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable.

type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit

only used for unit tests

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;
}
val pp_operand : F.formatter -> operand -> unit

Build formulas

type new_eq =
| EqZero of Var.t
| Equal of Var.t * Var.t

some operations will return a set of new facts discovered that are relevant to communicate to the memory domain

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

think a bit harder about the formula

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

get the canonical representative for the variable according to the known/post equality relation

val get_both_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the both/pre+post equality relation

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseInterproc/index.html b/website/static/odoc/next/infer/Pulselib/PulseInterproc/index.html index 0bff07437..8a98b5eef 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseInterproc/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseInterproc/index.html @@ -1,2 +1,2 @@ -PulseInterproc (infer.Pulselib.PulseInterproc)

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

result of applying one pre/post pair of a callee's summary:

  • SatUnsat.Unsat if that path in the callee is infeasible
  • otherwise, there can be an error detected
  • otherwise, the result is a new abstract state, an optional return value, and a substitution callee_abstract_value -> caller_abstract_value mapping callee's abstract values to what they became in the new (caller) state
\ No newline at end of file +PulseInterproc (infer.Pulselib.PulseInterproc)

Module 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

result of applying one pre/post pair of a callee's summary:

  • SatUnsat.Unsat if that path in the callee is infeasible
  • otherwise, there can be an error detected
  • otherwise, the result is a new abstract state, an optional return value, and a substitution callee_abstract_value -> caller_abstract_value mapping callee's abstract values to what they became in the new (caller) state
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseInvalidation/index.html b/website/static/odoc/next/infer/Pulselib/PulseInvalidation/index.html index 15dc86072..a3dbaab3b 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseInvalidation/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseInvalidation/index.html @@ -1,2 +1,2 @@ -PulseInvalidation (infer.Pulselib.PulseInvalidation)

Module Pulselib.PulseInvalidation

module F = Stdlib.Format
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 : t -> t -> int
val equal : t -> t -> bool
val isl_equiv : t -> t -> bool

check equality up to some ISL equivalences

val pp : F.formatter -> t -> unit
val describe : F.formatter -> t -> unit
type must_be_valid_reason =
| BlockCall
| InsertionIntoCollection
| SelfOfNonPODReturnMethod
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
\ No newline at end of file +PulseInvalidation (infer.Pulselib.PulseInvalidation)

Module Pulselib.PulseInvalidation

module F = Stdlib.Format
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 : t -> t -> int
val equal : t -> t -> bool
val isl_equiv : t -> t -> bool

check equality up to some ISL equivalences

val pp : F.formatter -> t -> unit
val describe : F.formatter -> t -> unit
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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseModels/index.html b/website/static/odoc/next/infer/Pulselib/PulseModels/index.html index 4e03c9032..37200ceb2 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseModels/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseModels/index.html @@ -1,2 +1,2 @@ -PulseModels (infer.Pulselib.PulseModels) \ No newline at end of file +PulseModels (infer.Pulselib.PulseModels) \ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseOperations/Closures/index.html b/website/static/odoc/next/infer/Pulselib/PulseOperations/Closures/index.html index 91dd195f6..6855017cc 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseOperations/Closures/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseOperations/Closures/index.html @@ -1,2 +1,2 @@ -Closures (infer.Pulselib.PulseOperations.Closures)

Module PulseOperations.Closures

val check_captured_addresses : IBase.Location.t -> PulseBasicInterface.AbstractValue.t -> t -> t PulseDomainInterface.AccessResult.t

assert the validity of the addresses captured by the lambda

\ No newline at end of file +Closures (infer.Pulselib.PulseOperations.Closures)

Module PulseOperations.Closures

val check_captured_addresses : PulseBasicInterface.PathContext.t -> IBase.Location.t -> PulseBasicInterface.AbstractValue.t -> t -> t PulseDomainInterface.AccessResult.t

assert the validity of the addresses captured by the lambda

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseOperations/index.html b/website/static/odoc/next/infer/Pulselib/PulseOperations/index.html index 7448fbd77..a2f48c0f2 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseOperations/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseOperations/index.html @@ -1,2 +1,2 @@ -PulseOperations (infer.Pulselib.PulseOperations)

Module Pulselib.PulseOperations

module Import : sig ... end

For opening in other modules.

include module type of Import
type access_mode =
| Read
| Write
| NoAccess

The initialized-ness of the address is not checked when it evaluates a heap address without actual memory access, for example, when evaluating &x.f we need to check initialized-ness of x, not that of x.f.

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 (>>=) : ('a'e) Core_kernel__Result.t -> ('a -> ('b'e) Core_kernel__Result.t) -> ('b'e) Core_kernel__Result.t
val (>>|) : ('a'e) Core_kernel__Result.t -> ('a -> 'b) -> ('b'e) Core_kernel__Result.t
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

monadic "bind" but not really that turns an AccessResult.t into a list of AccessResult.ts (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

monadic "map" but even less really that turns an AccessResult.t into an analysis result

type t = PulseDomainInterface.AbductiveDomain.t
val 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

Check that the address is not known to be invalid

module Closures : sig ... end
val eval : access_mode -> IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t

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.

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

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.

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

Like 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

Like 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

Like 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

Havoc dereferenced field address.

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

write the edge 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

write the edge 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

write the edge 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

write the edge 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;
}

the value was read from the heap following the access edge at address pointer

| StackAddress of IR.Var.t * PulseBasicInterface.ValueHistory.t

the value was read from the stack

| UntraceableAccess

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 Invalid attribute

val invalidate : invalidation_access -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t

record that the address is invalid

val invalidate_biad_isl : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t list

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.

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

record that what the address points via the access to is invalid

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

Like 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

record that all the array elements that address points to is invalid

val shallow_copy : IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) PulseDomainInterface.AccessResult.t

returns the address of a new cell with the same edges as the original

val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list

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

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
\ No newline at end of file +PulseOperations (infer.Pulselib.PulseOperations)

Module Pulselib.PulseOperations

module Import : sig ... end

For opening in other modules.

include module type of Import
type access_mode =
| Read
| Write
| NoAccess

The initialized-ness of the address is not checked when it evaluates a heap address without actual memory access, for example, when evaluating &x.f we need to check initialized-ness of x, not that of x.f.

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 (>>=) : ('a'e) Core_kernel__Result.t -> ('a -> ('b'e) Core_kernel__Result.t) -> ('b'e) Core_kernel__Result.t
val (>>|) : ('a'e) Core_kernel__Result.t -> ('a -> 'b) -> ('b'e) Core_kernel__Result.t
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

monadic "bind" but not really that turns an AccessResult.t into a list of AccessResult.ts (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

monadic "map" but even less really that turns an AccessResult.t into an analysis result

type t = PulseDomainInterface.AbductiveDomain.t
val 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

Check that the address is not known to be invalid

module 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

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.

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

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.

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

Like 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

Like 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

Like 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

Havoc dereferenced field address.

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

write the edge 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

write the edge 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

write the edge 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

write the edge 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;
}

the value was read from the heap following the access edge at address pointer

| StackAddress of IR.Var.t * PulseBasicInterface.ValueHistory.t

the value was read from the stack

| UntraceableAccess

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 Invalid attribute

val invalidate : PulseBasicInterface.PathContext.t -> invalidation_access -> IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t

record that the address is invalid

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

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.

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

record that what the address points via the access to is invalid

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

Like 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

record that all the array elements that address points to is invalid

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

returns the address of a new cell with the same edges as the original

val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list

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

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulsePathCondition/index.html b/website/static/odoc/next/infer/Pulselib/PulsePathCondition/index.html index e5e05e6b3..3e3c04393 100644 --- a/website/static/odoc/next/infer/Pulselib/PulsePathCondition/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulsePathCondition/index.html @@ -1,2 +1,2 @@ -PulsePathCondition (infer.Pulselib.PulsePathCondition)

Module Pulselib.PulsePathCondition

module F = Stdlib.Format
module AbstractValue = PulseAbstractValue
module SatUnsat = PulseSatUnsat
module ValueHistory = PulseValueHistory
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val true_ : t
val false_ : t
val pp : F.formatter -> t -> unit
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 formula

val 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 compare_operand : operand -> operand -> int
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 sure

val 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 sure

val is_unsat_cheap : t -> bool

whether the state contains a contradiction, call this as often as you want

val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs

whether the state contains a contradiction, only call this when you absolutely have to

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "known" part of the formula

val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula

\ No newline at end of file +PulsePathCondition (infer.Pulselib.PulsePathCondition)

Module Pulselib.PulsePathCondition

module F = Stdlib.Format
module AbstractValue = PulseAbstractValue
module SatUnsat = PulseSatUnsat
module ValueHistory = PulseValueHistory
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val true_ : t
val false_ : t
val pp : F.formatter -> t -> unit
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 formula

val 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 compare_operand : operand -> operand -> int
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 sure

val 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 sure

val is_unsat_cheap : t -> bool

whether the state contains a contradiction, call this as often as you want

val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs

whether the state contains a contradiction, only call this when you absolutely have to

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "known" part of the formula

val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulsePathContext/index.html b/website/static/odoc/next/infer/Pulselib/PulsePathContext/index.html new file mode 100644 index 000000000..565e891e4 --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib/PulsePathContext/index.html @@ -0,0 +1,2 @@ + +PulsePathContext (infer.Pulselib.PulsePathContext)

Module Pulselib.PulsePathContext

module F = Stdlib.Format
type timestamp = private int
val compare_timestamp : timestamp -> timestamp -> int
val t0 : timestamp
type t = {
timestamp : timestamp;

step number

}
val leq : lhs:t -> rhs:t -> bool
val initial : t
val post_exec_instr : t -> t

call this after each step of the symbolic execution to update the path information

val pp : F.formatter -> t -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/index.html b/website/static/odoc/next/infer/Pulselib/index.html index 23b885ccd..b1d642d8d 100644 --- a/website/static/odoc/next/infer/Pulselib/index.html +++ b/website/static/odoc/next/infer/Pulselib/index.html @@ -1,2 +1,2 @@ -Pulselib (infer.Pulselib)

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
\ No newline at end of file +Pulselib (infer.Pulselib)

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/AddressAttributes/index.html b/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/AddressAttributes/index.html index a0325728e..984586a1c 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/AddressAttributes/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/AddressAttributes/index.html @@ -1,2 +1,2 @@ -AddressAttributes (infer.Pulselib__PulseAbductiveDomain.AddressAttributes)

Module Pulselib__PulseAbductiveDomain.AddressAttributes

attribute operations like BaseAddressAttributes but that also take care of propagating facts to the precondition

val abduce_and_add : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t

add the attributes to both the current state and, if meaningful, the pre

val add_one : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attribute.t -> t -> t

add the attribute only to the post

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 -> (tPulselib.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
\ No newline at end of file +AddressAttributes (infer.Pulselib__PulseAbductiveDomain.AddressAttributes)

Module Pulselib__PulseAbductiveDomain.AddressAttributes

attribute operations like BaseAddressAttributes but that also take care of propagating facts to the precondition

val abduce_and_add : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attributes.t -> t -> t

add the attributes to both the current state and, if meaningful, the pre

val add_one : Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.Attribute.t -> t -> t

add the attribute only to the post

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 -> (tPulselib.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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/Stack/index.html b/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/Stack/index.html index 20e94adb6..147e57e85 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/Stack/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/Stack/index.html @@ -1,2 +1,2 @@ -Stack (infer.Pulselib__PulseAbductiveDomain.Stack)

Module Pulselib__PulseAbductiveDomain.Stack

stack operations like BaseStack but that also take care of propagating facts to the precondition

val 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)

return the value of the variable in the stack or create a fresh one if needed

val mem : IR.Var.t -> t -> bool
val exists : (IR.Var.t -> BaseStack.value -> bool) -> t -> bool
val keys : t -> IR.Var.t list
\ No newline at end of file +Stack (infer.Pulselib__PulseAbductiveDomain.Stack)

Module Pulselib__PulseAbductiveDomain.Stack

stack operations like BaseStack but that also take care of propagating facts to the precondition

val 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)

return the value of the variable in the stack or create a fresh one if needed

val mem : IR.Var.t -> t -> bool
val exists : (IR.Var.t -> BaseStack.value -> bool) -> t -> bool
val keys : t -> IR.Var.t list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseArithmetic/index.html b/website/static/odoc/next/infer/Pulselib__PulseArithmetic/index.html index db406c5b4..6ff73d5b5 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseArithmetic/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseArithmetic/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseArithmetic (infer.Pulselib__PulseArithmetic)

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

helper function wrapping prune_binop

val prune_positive : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t

helper function wrapping 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
\ No newline at end of file +Pulselib__PulseArithmetic (infer.Pulselib__PulseArithmetic)

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

helper function wrapping prune_binop

val prune_positive : Pulselib.PulseBasicInterface.AbstractValue.t -> AbductiveDomain.t -> AbductiveDomain.t AccessResult.t

helper function wrapping 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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseAttribute/Attributes/index.html b/website/static/odoc/next/infer/Pulselib__PulseAttribute/Attributes/index.html index e537a6cee..7167f5da2 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseAttribute/Attributes/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseAttribute/Attributes/index.html @@ -1,2 +1,2 @@ -Attributes (infer.Pulselib__PulseAttribute.Attributes)

Module Pulselib__PulseAttribute.Attributes

include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type t
val compare : t -> t -> int
val equal : t -> t -> bool
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

in case an element with the same rank is present both in 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

check whether for each attr in the second list, there exists a corresponding attr in the first according to Attributes.isl_equiv.

val replace_isl_abduced : t -> t -> t

While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable

val add_call : IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
\ No newline at end of file +Attributes (infer.Pulselib__PulseAttribute.Attributes)

Module Pulselib__PulseAttribute.Attributes

include IStdlib.PrettyPrintable.PPUniqRankSet with type elt = t
type t
val compare : t -> t -> int
val equal : t -> t -> bool
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

in case an element with the same rank is present both in 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

check whether for each attr in the second list, there exists a corresponding attr in the first according to Attributes.isl_equiv.

val replace_isl_abduced : t -> t -> t

While applying a spec, replacing ISLAbduced by Allocated and Invalidation.Cfree by Invalidation.delete, if applicable

val add_call : PathContext.t -> IR.Procname.t -> IBase.Location.t -> ValueHistory.t -> t -> t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseAttribute/index.html b/website/static/odoc/next/infer/Pulselib__PulseAttribute/index.html index cfd531d31..df6da7c1a 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseAttribute/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseAttribute/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseAttribute (infer.Pulselib__PulseAttribute)

Module Pulselib__PulseAttribute

module F = Stdlib.Format
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

the 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

The allocation is abduced so as the analysis could run normally

| MustBeInitialized of Trace.t
| MustBeValid of Trace.t * Invalidation.must_be_valid_reason option
| StdVectorReserve
| Uninitialized
| UnreachableAt of IBase.Location.t

temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks

| WrittenTo of Trace.t
val compare : t -> t -> int
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
\ No newline at end of file +Pulselib__PulseAttribute (infer.Pulselib__PulseAttribute)

Module Pulselib__PulseAttribute

module F = Stdlib.Format
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

the 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

The allocation is abduced so as the analysis could run normally

| 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

temporary marker to remember where a variable became unreachable; helps with accurately reporting leaks

| WrittenTo of Trace.t
val compare : t -> t -> int
val pp : F.formatter -> t -> unit
val is_suitable_for_pre : t -> bool
val is_suitable_for_post : t -> bool
module Attributes : sig ... end
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseBaseAddressAttributes/index.html b/website/static/odoc/next/infer/Pulselib__PulseBaseAddressAttributes/index.html index aaf859a98..809e099c4 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseBaseAddressAttributes/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseBaseAddressAttributes/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseBaseAddressAttributes (infer.Pulselib__PulseBaseAddressAttributes)

Module Pulselib__PulseBaseAddressAttributes

module F = Stdlib.Format
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
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

merge the attributes of all the variables that are equal according to get_var_repr and remove non-canonical variables in favor of their rerpresentative

val subst_var : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.AbstractValue.t) -> t -> t
\ No newline at end of file +Pulselib__PulseBaseAddressAttributes (infer.Pulselib__PulseBaseAddressAttributes)

Module Pulselib__PulseBaseAddressAttributes

module F = Stdlib.Format
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
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

merge the attributes of all the variables that are equal according to get_var_repr and remove non-canonical variables in favor of their rerpresentative

val subst_var : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.AbstractValue.t) -> t -> t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseBasicInterface/index.html b/website/static/odoc/next/infer/Pulselib__PulseBasicInterface/index.html index d088c2465..3634c2cd0 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseBasicInterface/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseBasicInterface/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseBasicInterface (infer.Pulselib__PulseBasicInterface)

Module Pulselib__PulseBasicInterface

module AbstractValue = Pulselib.PulseAbstractValue
module Attribute = Pulselib.PulseAttribute
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
\ No newline at end of file +Pulselib__PulseBasicInterface (infer.Pulselib__PulseBasicInterface)

Module Pulselib__PulseBasicInterface

module AbstractValue = Pulselib.PulseAbstractValue
module Attribute = Pulselib.PulseAttribute
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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseCallOperations/index.html b/website/static/odoc/next/infer/Pulselib__PulseCallOperations/index.html index 9b7ba2dfe..25596347c 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseCallOperations/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseCallOperations/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseCallOperations (infer.Pulselib__PulseCallOperations)

Module Pulselib__PulseCallOperations

type t = Pulselib.PulseDomainInterface.AbductiveDomain.t
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

perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists

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

performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate

val conservatively_initialize_args : Pulselib.PulseBasicInterface.AbstractValue.t list -> t -> t
\ No newline at end of file +Pulselib__PulseCallOperations (infer.Pulselib__PulseCallOperations)

Module Pulselib__PulseCallOperations

type t = Pulselib.PulseDomainInterface.AbductiveDomain.t
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

perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists

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

performs a call to a function with no summary by optimistically havoc'ing the by-ref actuals and the return value as appropriate

val conservatively_initialize_args : Pulselib.PulseBasicInterface.AbstractValue.t list -> t -> t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseFormula/index.html b/website/static/odoc/next/infer/Pulselib__PulseFormula/index.html index 4df7d3bef..e4bf25233 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseFormula/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseFormula/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseFormula (infer.Pulselib__PulseFormula)

Module Pulselib__PulseFormula

module F = Stdlib.Format
module SatUnsat = Pulselib.PulseSatUnsat

Arithmetic solver

Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable.

type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit

only used for unit tests

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

some operations will return a set of new facts discovered that are relevant to communicate to the memory domain

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

think a bit harder about the formula

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

get the canonical representative for the variable according to the known/post equality relation

val get_both_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the both/pre+post equality relation

\ No newline at end of file +Pulselib__PulseFormula (infer.Pulselib__PulseFormula)

Module Pulselib__PulseFormula

module F = Stdlib.Format
module SatUnsat = Pulselib.PulseSatUnsat

Arithmetic solver

Build formulas from SIL and tries to decide if they are (mostly un-)satisfiable.

type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val pp : F.formatter -> t -> unit
val pp_with_pp_var : (F.formatter -> Var.t -> unit) -> F.formatter -> t -> unit

only used for unit tests

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;
}
val pp_operand : F.formatter -> operand -> unit

Build formulas

type new_eq =
| EqZero of Var.t
| Equal of Var.t * Var.t

some operations will return a set of new facts discovered that are relevant to communicate to the memory domain

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

think a bit harder about the formula

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

get the canonical representative for the variable according to the known/post equality relation

val get_both_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the both/pre+post equality relation

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseInterproc/index.html b/website/static/odoc/next/infer/Pulselib__PulseInterproc/index.html index 6bcd9c98e..281ff341f 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseInterproc/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseInterproc/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseInterproc (infer.Pulselib__PulseInterproc)

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

result of applying one pre/post pair of a callee's summary:

  • SatUnsat.Unsat if that path in the callee is infeasible
  • otherwise, there can be an error detected
  • otherwise, the result is a new abstract state, an optional return value, and a substitution callee_abstract_value -> caller_abstract_value mapping callee's abstract values to what they became in the new (caller) state
\ No newline at end of file +Pulselib__PulseInterproc (infer.Pulselib__PulseInterproc)

Module 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

result of applying one pre/post pair of a callee's summary:

  • SatUnsat.Unsat if that path in the callee is infeasible
  • otherwise, there can be an error detected
  • otherwise, the result is a new abstract state, an optional return value, and a substitution callee_abstract_value -> caller_abstract_value mapping callee's abstract values to what they became in the new (caller) state
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseInvalidation/index.html b/website/static/odoc/next/infer/Pulselib__PulseInvalidation/index.html index 018ad5f7e..f2b209605 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseInvalidation/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseInvalidation/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseInvalidation (infer.Pulselib__PulseInvalidation)

Module Pulselib__PulseInvalidation

module F = Stdlib.Format
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 : t -> t -> int
val equal : t -> t -> bool
val isl_equiv : t -> t -> bool

check equality up to some ISL equivalences

val pp : F.formatter -> t -> unit
val describe : F.formatter -> t -> unit
type must_be_valid_reason =
| BlockCall
| InsertionIntoCollection
| SelfOfNonPODReturnMethod
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
\ No newline at end of file +Pulselib__PulseInvalidation (infer.Pulselib__PulseInvalidation)

Module Pulselib__PulseInvalidation

module F = Stdlib.Format
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 : t -> t -> int
val equal : t -> t -> bool
val isl_equiv : t -> t -> bool

check equality up to some ISL equivalences

val pp : F.formatter -> t -> unit
val describe : F.formatter -> t -> unit
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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseModels/index.html b/website/static/odoc/next/infer/Pulselib__PulseModels/index.html index d9a135717..87cca84fe 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseModels/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseModels/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseModels (infer.Pulselib__PulseModels) \ No newline at end of file +Pulselib__PulseModels (infer.Pulselib__PulseModels) \ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseOperations/Closures/index.html b/website/static/odoc/next/infer/Pulselib__PulseOperations/Closures/index.html index e7dd55244..6b0f1ec26 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseOperations/Closures/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseOperations/Closures/index.html @@ -1,2 +1,2 @@ -Closures (infer.Pulselib__PulseOperations.Closures)

Module Pulselib__PulseOperations.Closures

val check_captured_addresses : IBase.Location.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t

assert the validity of the addresses captured by the lambda

\ No newline at end of file +Closures (infer.Pulselib__PulseOperations.Closures)

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

assert the validity of the addresses captured by the lambda

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseOperations/index.html b/website/static/odoc/next/infer/Pulselib__PulseOperations/index.html index 22f3198f1..d9052f835 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseOperations/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseOperations/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseOperations (infer.Pulselib__PulseOperations)

Module Pulselib__PulseOperations

module Import : sig ... end

For opening in other modules.

include module type of Import
type access_mode =
| Read
| Write
| NoAccess

The initialized-ness of the address is not checked when it evaluates a heap address without actual memory access, for example, when evaluating &x.f we need to check initialized-ness of x, not that of x.f.

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 {
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;
}
| 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 (>>=) : ('a'e) Core_kernel__Result.t -> ('a -> ('b'e) Core_kernel__Result.t) -> ('b'e) Core_kernel__Result.t
val (>>|) : ('a'e) Core_kernel__Result.t -> ('a -> 'b) -> ('b'e) Core_kernel__Result.t
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

monadic "bind" but not really that turns an AccessResult.t into a list of AccessResult.ts (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

monadic "map" but even less really that turns an AccessResult.t into an analysis result

type t = Pulselib.PulseDomainInterface.AbductiveDomain.t
val 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

Check that the address is not known to be invalid

module 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

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.

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

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.

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

Like 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

Like 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

Like 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

Havoc dereferenced field address.

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

write the edge 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

write the edge 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

write the edge 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

write the edge 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;
}

the value was read from the heap following the access edge at address pointer

| StackAddress of IR.Var.t * Pulselib.PulseBasicInterface.ValueHistory.t

the value was read from the stack

| UntraceableAccess

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 Invalid attribute

val invalidate : invalidation_access -> IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t

record that the address is invalid

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

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.

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

record that what the address points via the access to is invalid

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

Like 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

record that all the array elements that address points to is invalid

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

returns the address of a new cell with the same edges as the original

val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list

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

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
\ No newline at end of file +Pulselib__PulseOperations (infer.Pulselib__PulseOperations)

Module Pulselib__PulseOperations

module Import : sig ... end

For opening in other modules.

include module type of Import
type access_mode =
| Read
| Write
| NoAccess

The initialized-ness of the address is not checked when it evaluates a heap address without actual memory access, for example, when evaluating &x.f we need to check initialized-ness of x, not that of x.f.

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 {
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;
}
| 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 (>>=) : ('a'e) Core_kernel__Result.t -> ('a -> ('b'e) Core_kernel__Result.t) -> ('b'e) Core_kernel__Result.t
val (>>|) : ('a'e) Core_kernel__Result.t -> ('a -> 'b) -> ('b'e) Core_kernel__Result.t
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

monadic "bind" but not really that turns an AccessResult.t into a list of AccessResult.ts (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

monadic "map" but even less really that turns an AccessResult.t into an analysis result

type t = Pulselib.PulseDomainInterface.AbductiveDomain.t
val 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

Check that the address is not known to be invalid

module 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

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.

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

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.

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

Like 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

Like 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

Like 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

Havoc dereferenced field address.

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

write the edge 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

write the edge 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

write the edge 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

write the edge 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;
}

the value was read from the heap following the access edge at address pointer

| StackAddress of IR.Var.t * Pulselib.PulseBasicInterface.ValueHistory.t

the value was read from the stack

| UntraceableAccess

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 Invalid attribute

val 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

record that the address is invalid

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

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.

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

record that what the address points via the access to is invalid

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

Like 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

record that all the array elements that address points to is invalid

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

returns the address of a new cell with the same edges as the original

val get_dynamic_type_unreachable_values : IR.Var.t list -> t -> (IR.Var.t * IR.Typ.t) list

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

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
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulsePathCondition/index.html b/website/static/odoc/next/infer/Pulselib__PulsePathCondition/index.html index 53eb6c47b..c6076ee40 100644 --- a/website/static/odoc/next/infer/Pulselib__PulsePathCondition/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulsePathCondition/index.html @@ -1,2 +1,2 @@ -Pulselib__PulsePathCondition (infer.Pulselib__PulsePathCondition)

Module Pulselib__PulsePathCondition

module F = Stdlib.Format
module AbstractValue = Pulselib.PulseAbstractValue
module SatUnsat = Pulselib.PulseSatUnsat
module ValueHistory = Pulselib.PulseValueHistory
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val true_ : t
val false_ : t
val pp : F.formatter -> t -> unit
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 formula

val 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 compare_operand : operand -> operand -> int
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 sure

val 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 sure

val is_unsat_cheap : t -> bool

whether the state contains a contradiction, call this as often as you want

val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs

whether the state contains a contradiction, only call this when you absolutely have to

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "known" part of the formula

val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula

\ No newline at end of file +Pulselib__PulsePathCondition (infer.Pulselib__PulsePathCondition)

Module Pulselib__PulsePathCondition

module F = Stdlib.Format
module AbstractValue = Pulselib.PulseAbstractValue
module SatUnsat = Pulselib.PulseSatUnsat
module ValueHistory = Pulselib.PulseValueHistory
type t
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val true_ : t
val false_ : t
val pp : F.formatter -> t -> unit
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 formula

val 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 compare_operand : operand -> operand -> int
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 sure

val 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 sure

val is_unsat_cheap : t -> bool

whether the state contains a contradiction, call this as often as you want

val is_unsat_expensive : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t * bool * new_eqs

whether the state contains a contradiction, only call this when you absolutely have to

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_known_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "known" part of the formula

val get_both_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation in the "both" (known + pruned) part of the formula

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulsePathContext/.dune-keep b/website/static/odoc/next/infer/Pulselib__PulsePathContext/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/Pulselib__PulsePathContext/index.html b/website/static/odoc/next/infer/Pulselib__PulsePathContext/index.html new file mode 100644 index 000000000..2c9056e60 --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib__PulsePathContext/index.html @@ -0,0 +1,2 @@ + +Pulselib__PulsePathContext (infer.Pulselib__PulsePathContext)

Module Pulselib__PulsePathContext

module F = Stdlib.Format
type timestamp = private int
val compare_timestamp : timestamp -> timestamp -> int
val t0 : timestamp
type t = {
timestamp : timestamp;

step number

}
val leq : lhs:t -> rhs:t -> bool
val initial : t
val post_exec_instr : t -> t

call this after each step of the symbolic execution to update the path information

val pp : F.formatter -> t -> unit
\ No newline at end of file