From c736015316c24b55f68ebfd62f8b5394e894c8e8 Mon Sep 17 00:00:00 2001 From: Gabriela Cunha Sampaio Date: Wed, 10 Mar 2021 03:15:03 -0800 Subject: [PATCH] [pulse] Updating Pulse website Summary: Adding more info to Pulse webpage Reviewed By: jvillard Differential Revision: D26884576 fbshipit-source-id: a6f13757f --- infer/documentation/checkers/Pulse.md | 56 +++++++++ .../issues/NULLPTR_DEREFERENCE.md | 95 ++++++++++++++ .../documentation/issues/NULL_DEREFERENCE.md | 97 --------------- infer/src/base/Checker.ml | 5 +- infer/src/base/IssueType.ml | 4 +- website/docs/all-issue-types.md | 116 ++++++++++++++++-- .../docs/checker-config-impact-analysis.md | 20 +++ website/docs/checker-pulse.md | 58 ++++++++- website/docs/checker-starvation.md | 1 + website/static/man/next/infer-report.1.html | 23 ++++ .../static/man/next/infer-reportdiff.1.html | 23 +++- website/static/man/next/infer.1.html | 38 ++++++ .../Config_impact_data_j/index.html | 2 + .../Config_impact_data_t/index.html | 2 + .../infer/ATDGenerated/Jsonbug_j/index.html | 2 +- .../infer/ATDGenerated/Jsonbug_t/index.html | 2 +- .../.dune-keep | 0 .../index.html | 2 + .../.dune-keep | 0 .../index.html | 2 + .../infer/ATDGenerated__Jsonbug_j/index.html | 2 +- .../infer/ATDGenerated__Jsonbug_t/index.html | 2 +- .../ConfigImpactAnalysis/Summary/index.html | 2 + .../UncheckedCallee/index.html | 2 + .../UncheckedCallees/index.html | 2 + .../Checkers/ConfigImpactAnalysis/index.html | 2 + .../ExternalConfigImpactData/index.html | 2 + .../Checkers__ConfigImpactAnalysis/.dune-keep | 0 .../Summary/index.html | 2 + .../UncheckedCallee/index.html | 2 + .../UncheckedCallees/index.html | 2 + .../Checkers__ConfigImpactAnalysis/index.html | 2 + .../.dune-keep | 0 .../index.html | 2 + .../ClangFrontend/CGeneral_utils/index.html | 2 +- .../ClangFrontend/CMethodSignature/index.html | 2 +- .../ClangFrontend__CGeneral_utils/index.html | 2 +- .../index.html | 2 +- .../StarvationDomain/Event/index.html | 2 +- .../Concurrency/StarvationDomain/index.html | 2 +- .../Concurrency/StarvationModels/index.html | 2 +- .../Event/index.html | 2 +- .../Concurrency__StarvationDomain/index.html | 2 +- .../Concurrency__StarvationModels/index.html | 2 +- .../odoc/next/infer/IBase/Config/index.html | 2 +- .../next/infer/IBase/IssueType/index.html | 2 +- .../IBase/ResultsDirEntryName/index.html | 2 +- .../odoc/next/infer/IBase__Config/index.html | 2 +- .../next/infer/IBase__IssueType/index.html | 2 +- .../IBase__ResultsDirEntryName/index.html | 2 +- .../next/infer/IR/ProcAttributes/index.html | 2 +- .../odoc/next/infer/IR/Procdesc/index.html | 2 +- .../next/infer/IR__ProcAttributes/index.html | 2 +- .../odoc/next/infer/IR__Procdesc/index.html | 2 +- .../ConfigImpactIssuesTest/index.html | 2 + .../infer/Integration/Differential/index.html | 2 +- .../infer/Integration/ReportDiff/index.html | 2 +- .../odoc/next/infer/Integration/index.html | 2 +- .../.dune-keep | 0 .../index.html | 2 + .../Integration__Differential/index.html | 2 +- .../infer/Integration__ReportDiff/index.html | 2 +- .../AddressAttributes/index.html | 2 +- .../Pulselib/PulseAbductiveDomain/index.html | 2 +- .../Pulselib/PulseAccessResult/index.html | 2 + .../PulseAttribute/Attributes/index.html | 2 +- .../infer/Pulselib/PulseAttribute/index.html | 2 +- .../PulseBaseAddressAttributes/index.html | 2 +- .../Pulselib/PulseDomainInterface/index.html | 2 +- .../Pulselib/PulseExecutionDomain/index.html | 2 +- .../PulseFormula/DynamicTypes/index.html | 2 + .../infer/Pulselib/PulseFormula/index.html | 2 +- .../infer/Pulselib/PulseInterproc/index.html | 2 +- .../Pulselib/PulseLatentIssue/index.html | 2 +- .../infer/Pulselib/PulseModels/index.html | 2 +- .../PulseObjectiveCSummary/index.html | 2 + .../PulseOperations/Closures/index.html | 2 +- .../PulseOperations/Import/index.html | 2 +- .../infer/Pulselib/PulseOperations/index.html | 2 +- .../Pulselib/PulsePathCondition/index.html | 2 +- .../infer/Pulselib/PulseReport/index.html | 2 +- .../infer/Pulselib/PulseSummary/index.html | 2 +- .../next/infer/Pulselib/PulseTopl/index.html | 2 +- .../odoc/next/infer/Pulselib/index.html | 2 +- .../AddressAttributes/index.html | 2 +- .../Pulselib__PulseAbductiveDomain/index.html | 2 +- .../Pulselib__PulseAccessResult/.dune-keep | 0 .../Pulselib__PulseAccessResult/index.html | 2 + .../Attributes/index.html | 2 +- .../infer/Pulselib__PulseAttribute/index.html | 2 +- .../index.html | 2 +- .../Pulselib__PulseDomainInterface/index.html | 2 +- .../Pulselib__PulseExecutionDomain/index.html | 2 +- .../DynamicTypes/index.html | 2 + .../infer/Pulselib__PulseFormula/index.html | 2 +- .../infer/Pulselib__PulseInterproc/index.html | 2 +- .../Pulselib__PulseLatentIssue/index.html | 2 +- .../infer/Pulselib__PulseModels/index.html | 2 +- .../.dune-keep | 0 .../index.html | 2 + .../Closures/index.html | 2 +- .../Import/index.html | 2 +- .../Pulselib__PulseOperations/index.html | 2 +- .../Pulselib__PulsePathCondition/index.html | 2 +- .../infer/Pulselib__PulseReport/index.html | 2 +- .../infer/Pulselib__PulseSummary/index.html | 2 +- .../next/infer/Pulselib__PulseTopl/index.html | 2 +- .../UnitTests/DifferentialTests/index.html | 2 +- .../UnitTests__DifferentialTests/index.html | 2 +- 109 files changed, 537 insertions(+), 179 deletions(-) create mode 100644 infer/documentation/checkers/Pulse.md delete mode 100644 infer/documentation/issues/NULL_DEREFERENCE.md create mode 100644 website/docs/checker-config-impact-analysis.md create mode 100644 website/static/odoc/next/infer/ATDGenerated/Config_impact_data_j/index.html create mode 100644 website/static/odoc/next/infer/ATDGenerated/Config_impact_data_t/index.html create mode 100644 website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/.dune-keep create mode 100644 website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/index.html create mode 100644 website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/.dune-keep create mode 100644 website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/index.html create mode 100644 website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/Summary/index.html create mode 100644 website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallee/index.html create mode 100644 website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallees/index.html create mode 100644 website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/index.html create mode 100644 website/static/odoc/next/infer/Checkers/ExternalConfigImpactData/index.html create mode 100644 website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/.dune-keep create mode 100644 website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/Summary/index.html create mode 100644 website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallee/index.html create mode 100644 website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallees/index.html create mode 100644 website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/index.html create mode 100644 website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/.dune-keep create mode 100644 website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/index.html create mode 100644 website/static/odoc/next/infer/Integration/ConfigImpactIssuesTest/index.html create mode 100644 website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/.dune-keep create mode 100644 website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/index.html create mode 100644 website/static/odoc/next/infer/Pulselib/PulseAccessResult/index.html create mode 100644 website/static/odoc/next/infer/Pulselib/PulseFormula/DynamicTypes/index.html create mode 100644 website/static/odoc/next/infer/Pulselib/PulseObjectiveCSummary/index.html create mode 100644 website/static/odoc/next/infer/Pulselib__PulseAccessResult/.dune-keep create mode 100644 website/static/odoc/next/infer/Pulselib__PulseAccessResult/index.html create mode 100644 website/static/odoc/next/infer/Pulselib__PulseFormula/DynamicTypes/index.html create mode 100644 website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/.dune-keep create mode 100644 website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/index.html diff --git a/infer/documentation/checkers/Pulse.md b/infer/documentation/checkers/Pulse.md new file mode 100644 index 000000000..d47cc2361 --- /dev/null +++ b/infer/documentation/checkers/Pulse.md @@ -0,0 +1,56 @@ +### What is Infer:Pulse? +Pulse is an interprocedural memory safety analysis. Pulse can detect, for instance, [Null dereferences](/docs/next/all-issue-types#nullptr_dereference) in Java. Errors are only reported when all conditions on the erroneous path are true regardless of input. Pulse should gradually replace the original [biabduction](/docs/next/checker-biabduction) analysis of Infer. An example of a Null dereference found by Pulse is given below. + +```java +class Person { + Person emergencyContact; + String address; + + Person getEmergencyContact() { + return this.emergencyContact; + } +} + +class Registry { + void create() { + Person p = new Person(); + Person c = p.getEmergencyContact(); + // Null dereference here + System.out.println(c.address); + } + + void printContact(Person p) { + // No null dereference, as we don't know anything about `p` + System.out.println(p.getEmergencyContact().address); + } +} +``` + +How to run pulse for Java: +```bash +infer run --pulse -- javac Test.java +``` + +Pulse reports a Null dereference on this file on `create()`, as it tries to access the field `address` of object `c`, and `c` has value `null`. In contrast, Pulse gives no report for `printContact(Person p)`, as we cannot be sure that `p.getEmergencyContact()` will return `null`. Pulse then labels this error as latent and only reports if there is a call to `printContact(Person p)` satisfying the condition for Null dereference. + +### Pulse x Nullsafe + +[Nullsafe](/docs/next/checker-eradicate) is a type checker for `@Nullable` annotations for Java. Classes following the Nullsafe discipline are annotated with `@Nullsafe`. + +Consider the classes `Person` and `Registry` from the previous example. Assuming that class `Person` is annotated with `@Nullsafe`. In this case, we also annotate `getEmergencyContact()` with `@Nullable`, to make explicit that this method can return the `null` value. There is still the risk that classes depending on `Person` have Null dereferences. In this case, Pulse would report a Null dereference on `Registry`. It could also be the case that class `Registry` is annotated with `@Nullsafe`. By default Pulse reports on `@Nullsafe` files too, see the `--pulse-nullsafe-report-npe` option (Facebook-specific: Pulse does not report on `@Nullsafe` files). + +```java +@Nullsafe(Nullsafe.Mode.LOCAL) +class Person { + Person emergencyContact; + String address; + + @Nullable Person getEmergencyContact() { + return this.emergencyContact; + } +} + +class Registry { + ... // Pulse reports here +} +``` diff --git a/infer/documentation/issues/NULLPTR_DEREFERENCE.md b/infer/documentation/issues/NULLPTR_DEREFERENCE.md index 8b1378917..86f984485 100644 --- a/infer/documentation/issues/NULLPTR_DEREFERENCE.md +++ b/infer/documentation/issues/NULLPTR_DEREFERENCE.md @@ -1 +1,96 @@ +Infer reports null dereference bugs in Java, C and Objective-C. The issue is +about a pointer that can be `null` and it is dereferenced. This leads to a crash +in all the above languages. + +### Null dereference in Java + +Many of Infer's reports of potential NPE's come from code of the form + +```java + p = foo(); // foo() might return null + stuff(); + p.goo(); // dereferencing p, potential NPE +``` + +If you see code of this form, then you have several options. + + If you are unsure whether or not foo() will return null , you should +ideally i. Change the code to ensure that foo() can not return null ii. Add a +check for whether p is null, and do something other than dereferencing p when it +is null. + +Sometimes, in case ii it is not obvious what you should do when p is null. One +possibility (a last option) is to throw an exception, failing early. This can be +done using checkNotNull as in the following code: + +```java + // code idiom for failing early + + import static com.google.common.base.Preconditions.checkNotNull; + + //... intervening code + + p = checkNotNull(foo()); // foo() might return null + stuff(); + p.goo(); // dereferencing p, potential NPE +``` + +The call checkNotNull(foo()) will never return null; in case foo() returns null +it fails early by throwing an NPE. + + If you are absolutely sure that foo() will not be null , then if you +land your diff this case will no longer be reported after your diff makes it to +master. + +### Null dereference in C + +Here is an example of an inter-procedural null dereference bug in C: + +```c +struct Person { + int age; + int height; + int weight; +}; +int get_age(struct Person *who) { + return who->age; +} +int null_pointer_interproc() { + struct Person *joe = 0; + return get_age(joe); +} +``` + +### Null dereference in Objective-C + +In Objective-C, null dereferences are less common than in Java, but they still +happen and their cause can be hidden. In general, passing a message to nil does +not cause a crash and returns `nil`, but dereferencing a pointer directly does +cause a crash as well as calling a `nil` block.C + +```objectivec +-(void) foo:(void (^)())callback { + callback(); +} + +-(void) bar { + [self foo:nil]; //crash +} +``` + +Moreover, there are functions from the libraries that do not allow `nil` to be +passed as argument. Here are some examples: + +```objectivec +-(void) foo { + NSString *str = nil; + NSArray *animals = @[@"horse", str, @"dolphin"]; //crash +} + +-(void) bar { + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //can return NULL + ... + CFRelease(colorSpace); //crashes if called with NULL +} +``` diff --git a/infer/documentation/issues/NULL_DEREFERENCE.md b/infer/documentation/issues/NULL_DEREFERENCE.md deleted file mode 100644 index 4e3eb681a..000000000 --- a/infer/documentation/issues/NULL_DEREFERENCE.md +++ /dev/null @@ -1,97 +0,0 @@ -Infer reports null dereference bugs in C, Objective-C and Java. The issue is -about a pointer that can be `null` and it is dereferenced. This leads to a crash -in all the above languages. - -### Null dereference in C - -Here is an example of an inter-procedural null dereference bug in C: - -```c -struct Person { - int age; - int height; - int weight; -}; -int get_age(struct Person *who) { - return who->age; -} -int null_pointer_interproc() { - struct Person *joe = 0; - return get_age(joe); -} -``` - -### Null dereference in Objective-C - -In Objective-C, null dereferences are less common than in Java, but they still -happen and their cause can be hidden. In general, passing a message to nil does -not cause a crash and returns `nil`, but dereferencing a pointer directly does -cause a crash as well as calling a `nil` block.C - -```objectivec --(void) foo:(void (^)())callback { - callback(); -} - --(void) bar { - [self foo:nil]; //crash -} -``` - -Moreover, there are functions from the libraries that do not allow `nil` to be -passed as argument. Here are some examples: - -```objectivec --(void) foo { - NSString *str = nil; - NSArray *animals = @[@"horse", str, @"dolphin"]; //crash -} - --(void) bar { - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //can return NULL - ... - CFRelease(colorSpace); //crashes if called with NULL -} -``` - -### Null dereference in Java - -Many of Infer's reports of potential NPE's come from code of the form - -```java - p = foo(); // foo() might return null - stuff(); - p.goo(); // dereferencing p, potential NPE -``` - -If you see code of this form, then you have several options. - - If you are unsure whether or not foo() will return null , you should -ideally i. Change the code to ensure that foo() can not return null ii. Add a -check for whether p is null, and do something other than dereferencing p when it -is null. - -Sometimes, in case ii it is not obvious what you should do when p is null. One -possibility (a last option) is to throw an exception, failing early. This can be -done using checkNotNull as in the following code: - -```java - // code idiom for failing early - - import static com.google.common.base.Preconditions.checkNotNull; - - //... intervening code - - p = checkNotNull(foo()); // foo() might return null - stuff(); - p.goo(); // dereferencing p, potential NPE -``` - -The call checkNotNull(foo()) will never return null; in case foo() returns null -it fails early by throwing an NPE. - - If you are absolutely sure that foo() will not be null , then if you -land your diff this case will no longer be reported after your diff makes it to -master. In the future we might include analysis directives (hey, analyzer, p is -not null!) like in Hack that tell the analyzer the information that you know, -but that is for later. diff --git a/infer/src/base/Checker.ml b/infer/src/base/Checker.ml index a5459a1bd..f8769ee39 100644 --- a/infer/src/base/Checker.ml +++ b/infer/src/base/Checker.ml @@ -305,8 +305,9 @@ let config_unsafe checker = ; activates= [] } | Pulse -> { id= "pulse" - ; kind= UserFacing {title= "Pulse"; markdown_body= ""} - ; support= (function Clang -> Support | Java -> ExperimentalSupport | CIL -> NoSupport) + ; kind= + UserFacing {title= "Pulse"; markdown_body= [%blob "../../documentation/checkers/Pulse.md"]} + ; support= (function Clang | Java -> Support | CIL -> NoSupport) ; short_documentation= "Memory and lifetime analysis." ; cli_flags= Some {deprecated= ["-ownership"]; show_in_help= true} ; enabled_by_default= false diff --git a/infer/src/base/IssueType.ml b/infer/src/base/IssueType.ml index 060f7ea6c..863bd0cb8 100644 --- a/infer/src/base/IssueType.ml +++ b/infer/src/base/IssueType.ml @@ -791,12 +791,12 @@ let mutable_local_variable_in_component_file = let null_dereference = register ~id:"NULL_DEREFERENCE" Error Biabduction - ~user_documentation:[%blob "../../documentation/issues/NULL_DEREFERENCE.md"] + ~user_documentation:[%blob "../../documentation/issues/NULLPTR_DEREFERENCE.md"] let nullptr_dereference = register ~id:"NULLPTR_DEREFERENCE" Error Pulse - ~user_documentation:"See [NULL_DEREFERENCE](#null_dereference)." + ~user_documentation:[%blob "../../documentation/issues/NULLPTR_DEREFERENCE.md"] let optional_empty_access = diff --git a/website/docs/all-issue-types.md b/website/docs/all-issue-types.md index d34586962..9ee1f30e1 100644 --- a/website/docs/all-issue-types.md +++ b/website/docs/all-issue-types.md @@ -1138,6 +1138,11 @@ void invariant_hoist(int size) { } ``` +## IPC_ON_UI_THREAD + +Reported as "Ipc On Ui Thread" by [starvation](/docs/next/checker-starvation). + +A blocking `Binder` IPC call occurs on the UI thread. ## IVAR_NOT_NULL_CHECKED Reported as "Ivar Not Null Checked" by [biabduction](/docs/next/checker-biabduction). @@ -1301,15 +1306,51 @@ Reported as "Mutable Local Variable In Component File" by [linters](/docs/next/c Reported as "Nullptr Dereference" by [pulse](/docs/next/checker-pulse). -See [NULL_DEREFERENCE](#null_dereference). -## NULL_DEREFERENCE -Reported as "Null Dereference" by [biabduction](/docs/next/checker-biabduction). - -Infer reports null dereference bugs in C, Objective-C and Java. The issue is +Infer reports null dereference bugs in Java, C and Objective-C. The issue is about a pointer that can be `null` and it is dereferenced. This leads to a crash in all the above languages. +### Null dereference in Java + +Many of Infer's reports of potential NPE's come from code of the form + +```java + p = foo(); // foo() might return null + stuff(); + p.goo(); // dereferencing p, potential NPE +``` + +If you see code of this form, then you have several options. + + If you are unsure whether or not foo() will return null , you should +ideally i. Change the code to ensure that foo() can not return null ii. Add a +check for whether p is null, and do something other than dereferencing p when it +is null. + +Sometimes, in case ii it is not obvious what you should do when p is null. One +possibility (a last option) is to throw an exception, failing early. This can be +done using checkNotNull as in the following code: + +```java + // code idiom for failing early + + import static com.google.common.base.Preconditions.checkNotNull; + + //... intervening code + + p = checkNotNull(foo()); // foo() might return null + stuff(); + p.goo(); // dereferencing p, potential NPE +``` + +The call checkNotNull(foo()) will never return null; in case foo() returns null +it fails early by throwing an NPE. + + If you are absolutely sure that foo() will not be null , then if you +land your diff this case will no longer be reported after your diff makes it to +master. + ### Null dereference in C Here is an example of an inter-procedural null dereference bug in C: @@ -1362,6 +1403,15 @@ passed as argument. Here are some examples: } ``` +## NULL_DEREFERENCE + +Reported as "Null Dereference" by [biabduction](/docs/next/checker-biabduction). + + +Infer reports null dereference bugs in Java, C and Objective-C. The issue is +about a pointer that can be `null` and it is dereferenced. This leads to a crash +in all the above languages. + ### Null dereference in Java Many of Infer's reports of potential NPE's come from code of the form @@ -1400,9 +1450,59 @@ it fails early by throwing an NPE. If you are absolutely sure that foo() will not be null , then if you land your diff this case will no longer be reported after your diff makes it to -master. In the future we might include analysis directives (hey, analyzer, p is -not null!) like in Hack that tell the analyzer the information that you know, -but that is for later. +master. + +### Null dereference in C + +Here is an example of an inter-procedural null dereference bug in C: + +```c +struct Person { + int age; + int height; + int weight; +}; +int get_age(struct Person *who) { + return who->age; +} +int null_pointer_interproc() { + struct Person *joe = 0; + return get_age(joe); +} +``` + +### Null dereference in Objective-C + +In Objective-C, null dereferences are less common than in Java, but they still +happen and their cause can be hidden. In general, passing a message to nil does +not cause a crash and returns `nil`, but dereferencing a pointer directly does +cause a crash as well as calling a `nil` block.C + +```objectivec +-(void) foo:(void (^)())callback { + callback(); +} + +-(void) bar { + [self foo:nil]; //crash +} +``` + +Moreover, there are functions from the libraries that do not allow `nil` to be +passed as argument. Here are some examples: + +```objectivec +-(void) foo { + NSString *str = nil; + NSArray *animals = @[@"horse", str, @"dolphin"]; //crash +} + +-(void) bar { + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //can return NULL + ... + CFRelease(colorSpace); //crashes if called with NULL +} +``` ## OPTIONAL_EMPTY_ACCESS diff --git a/website/docs/checker-config-impact-analysis.md b/website/docs/checker-config-impact-analysis.md new file mode 100644 index 000000000..51a2e49c3 --- /dev/null +++ b/website/docs/checker-config-impact-analysis.md @@ -0,0 +1,20 @@ +--- +title: "Config Impact Analysis" +description: "[EXPERIMENTAL] Collects function that are called without config checks." +--- + +[EXPERIMENTAL] Collects function that are called without config checks. + +Activate with `--config-impact-analysis`. + +Supported languages: +- C/C++/ObjC: Experimental +- Java: Experimental +- C#/.Net: Experimental + +This checker collects functions whose execution isn't gated by certain pre-defined gating functions. The set of gating functions is hardcoded and empty by default for now, so to use this checker, please modify the code directly in [FbGKInteraction.ml](https://github.com/facebook/infer/tree/master/infer/src/opensource). + +## List of Issue Types + +The following issue types are reported by this checker: +- [CONFIG_IMPACT](/docs/next/all-issue-types#config_impact) diff --git a/website/docs/checker-pulse.md b/website/docs/checker-pulse.md index 67ef73d43..0c31efb99 100644 --- a/website/docs/checker-pulse.md +++ b/website/docs/checker-pulse.md @@ -9,9 +9,65 @@ Activate with `--pulse`. Supported languages: - C/C++/ObjC: Yes -- Java: Experimental +- Java: Yes - C#/.Net: No +### What is Infer:Pulse? +Pulse is an interprocedural memory safety analysis. Pulse can detect, for instance, [Null dereferences](/docs/next/all-issue-types#nullptr_dereference) in Java. Errors are only reported when all conditions on the erroneous path are true regardless of input. Pulse should gradually replace the original [biabduction](/docs/next/checker-biabduction) analysis of Infer. An example of a Null dereference found by Pulse is given below. + +```java +class Person { + Person emergencyContact; + String address; + + Person getEmergencyContact() { + return this.emergencyContact; + } +} + +class Registry { + void create() { + Person p = new Person(); + Person c = p.getEmergencyContact(); + // Null dereference here + System.out.println(c.address); + } + + void printContact(Person p) { + // No null dereference, as we don't know anything about `p` + System.out.println(p.getEmergencyContact().address); + } +} +``` + +How to run pulse for Java: +```bash +infer run --pulse -- javac Test.java +``` + +Pulse reports a Null dereference on this file on `create()`, as it tries to access the field `address` of object `c`, and `c` has value `null`. In contrast, Pulse gives no report for `printContact(Person p)`, as we cannot be sure that `p.getEmergencyContact()` will return `null`. Pulse then labels this error as latent and only reports if there is a call to `printContact(Person p)` satisfying the condition for Null dereference. + +### Pulse x Nullsafe + +[Nullsafe](/docs/next/checker-eradicate) is a type checker for `@Nullable` annotations for Java. Classes following the Nullsafe discipline are annotated with `@Nullsafe`. + +Consider the classes `Person` and `Registry` from the previous example. Assuming that class `Person` is annotated with `@Nullsafe`. In this case, we also annotate `getEmergencyContact()` with `@Nullable`, to make explicit that this method can return the `null` value. There is still the risk that classes depending on `Person` have Null dereferences. In this case, Pulse would report a Null dereference on `Registry`. It could also be the case that class `Registry` is annotated with `@Nullsafe`. By default Pulse reports on `@Nullsafe` files too, see the `--pulse-nullsafe-report-npe` option (Facebook-specific: Pulse does not report on `@Nullsafe` files). + +```java +@Nullsafe(Nullsafe.Mode.LOCAL) +class Person { + Person emergencyContact; + String address; + + @Nullable Person getEmergencyContact() { + return this.emergencyContact; + } +} + +class Registry { + ... // Pulse reports here +} +``` ## List of Issue Types diff --git a/website/docs/checker-starvation.md b/website/docs/checker-starvation.md index 6f88cc6b5..4295b276c 100644 --- a/website/docs/checker-starvation.md +++ b/website/docs/checker-starvation.md @@ -24,6 +24,7 @@ Detect several kinds of "starvation" problems: The following issue types are reported by this checker: - [ARBITRARY_CODE_EXECUTION_UNDER_LOCK](/docs/next/all-issue-types#arbitrary_code_execution_under_lock) - [DEADLOCK](/docs/next/all-issue-types#deadlock) +- [IPC_ON_UI_THREAD](/docs/next/all-issue-types#ipc_on_ui_thread) - [LOCKLESS_VIOLATION](/docs/next/all-issue-types#lockless_violation) - [STARVATION](/docs/next/all-issue-types#starvation) - [STRICT_MODE_VIOLATION](/docs/next/all-issue-types#strict_mode_violation) diff --git a/website/static/man/next/infer-report.1.html b/website/static/man/next/infer-report.1.html index c05aecd2e..41613ae9f 100644 --- a/website/static/man/next/infer-report.1.html +++ b/website/static/man/next/infer-report.1.html @@ -94,6 +94,21 @@ used to explain why the issue was filtered.

[ConfigImpact] Specify the file containing the config data

+ +

--config-impact-issues-tests +file

+ +

Write a list of config impact +issues in a format suitable for config impact tests to +file

+ + +

--config-impact-max-callees-to-print +int

+ +

Specify the maximum number of +unchecked callees to print in the config impact checker

+

--cost-issues-tests file

@@ -301,6 +316,7 @@ INTEGER_OVERFLOW_L5 (disabled by default),
INTEGER_OVERFLOW_U5 (disabled by default),
INTERFACE_NOT_THREAD_SAFE (enabled by default),
INVARIANT_CALL (disabled by default),
+IPC_ON_UI_THREAD (enabled by default),
IVAR_NOT_NULL_CHECKED (enabled by default),
Internal_error (enabled by default),
JAVASCRIPT_INJECTION (enabled by default),
@@ -386,6 +402,13 @@ experimental and blacklisted issue types (Conversely: --filtering | -f)

+

--from-json-config-impact-report +config-impact-report.json

+ +

Load costs analysis results +from a config-impact-report file.

+ +

--from-json-costs-report costs-report.json

diff --git a/website/static/man/next/infer-reportdiff.1.html b/website/static/man/next/infer-reportdiff.1.html index ab1eb3c5a..c4c434bdb 100644 --- a/website/static/man/next/infer-reportdiff.1.html +++ b/website/static/man/next/infer-reportdiff.1.html @@ -69,7 +69,28 @@ follow the same format as normal infer reports.

-

--cost-tests-only-autoreleasepool

+

--config-impact-current +path

+ +

Config impact report of the +latest revision

+ + +

--config-impact-max-callees-to-print +int

+ +

Specify the maximum number of +unchecked callees to print in the config impact checker

+ + +

--config-impact-previous +path

+ +

Config impact report of the +base revision to use for comparison

+ + +

--cost-tests-only-autoreleasepool

Activates: [EXPERIMENTAL] Report only autoreleasepool size results in cost tests diff --git a/website/static/man/next/infer.1.html b/website/static/man/next/infer.1.html index 01bdc65f4..9c7582ee7 100644 --- a/website/static/man/next/infer.1.html +++ b/website/static/man/next/infer.1.html @@ -472,6 +472,13 @@ config-impact-analysis and disable all other checkers

See also infer-analyze(1).
+--config-impact-current
path

+ +

Config impact report of the +latest revision

+ +

See also +infer-reportdiff(1).
--config-impact-data-file
file

[ConfigImpact] Specify the file @@ -479,6 +486,28 @@ containing the config data

See also infer-report(1).
+--config-impact-issues-tests
file

+ +

Write a list of config impact +issues in a format suitable for config impact tests to +file

+ +

See also +infer-report(1).
+--config-impact-max-callees-to-print
int

+ +

Specify the maximum number of +unchecked callees to print in the config impact checker

+ +

See also infer-report(1) +and infer-reportdiff(1).
+--config-impact-previous
path

+ +

Config impact report of the +base revision to use for comparison

+ +

See also +infer-reportdiff(1).
--continue

Activates: Continue the capture @@ -828,6 +857,7 @@ INTEGER_OVERFLOW_L5 (disabled by default),
INTEGER_OVERFLOW_U5 (disabled by default),
INTERFACE_NOT_THREAD_SAFE (enabled by default),
INVARIANT_CALL (disabled by default),
+IPC_ON_UI_THREAD (enabled by default),
IVAR_NOT_NULL_CHECKED (enabled by default),
Internal_error (enabled by default),
JAVASCRIPT_INJECTION (enabled by default),
@@ -1006,6 +1036,14 @@ fragment-retains-view and disable all other checkers

See also infer-analyze(1).
+--from-json-config-impact-report
+config-impact-report.json

+ +

Load costs analysis results +from a config-impact-report file.

+ +

See also +infer-report(1).
--from-json-costs-report
costs-report.json

Load costs analysis results diff --git a/website/static/odoc/next/infer/ATDGenerated/Config_impact_data_j/index.html b/website/static/odoc/next/infer/ATDGenerated/Config_impact_data_j/index.html new file mode 100644 index 000000000..4acaff9f7 --- /dev/null +++ b/website/static/odoc/next/infer/ATDGenerated/Config_impact_data_j/index.html @@ -0,0 +1,2 @@ + +Config_impact_data_j (infer.ATDGenerated.Config_impact_data_j)

Module ATDGenerated.Config_impact_data_j

type config_item = Config_impact_data_t.config_item = {
method_name : string;
class_name : string;
}
type config_data = Config_impact_data_t.config_data
val write_config_item : Bi_outbuf.t -> config_item -> unit

Output a JSON value of type config_item.

val string_of_config_item : ?⁠len:int -> config_item -> string

Serialize a value of type config_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_item

Input JSON data of type config_item.

val config_item_of_string : string -> config_item

Deserialize JSON data of type config_item.

val write_config_data : Bi_outbuf.t -> config_data -> unit

Output a JSON value of type config_data.

val string_of_config_data : ?⁠len:int -> config_data -> string

Serialize a value of type config_data into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_data : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_data

Input JSON data of type config_data.

val config_data_of_string : string -> config_data

Deserialize JSON data of type config_data.

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

Module ATDGenerated.Config_impact_data_t

type config_item = {
method_name : string;
class_name : string;
}
type config_data = config_item list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ATDGenerated/Jsonbug_j/index.html b/website/static/odoc/next/infer/ATDGenerated/Jsonbug_j/index.html index 8cb193fcb..e51ea313f 100644 --- a/website/static/odoc/next/infer/ATDGenerated/Jsonbug_j/index.html +++ b/website/static/odoc/next/infer/ATDGenerated/Jsonbug_j/index.html @@ -1,2 +1,2 @@ -Jsonbug_j (infer.ATDGenerated.Jsonbug_j)

Module ATDGenerated.Jsonbug_j

type issue_method = Jsonbug_t.issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = Jsonbug_t.parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = Jsonbug_t.nullsafe_mode
type nullsafe_meta_issue_info = Jsonbug_t.nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = Jsonbug_t.method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = Jsonbug_t.field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = Jsonbug_t.access_level
type annotation_point_method = Jsonbug_t.annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = Jsonbug_t.annotation_point_kind
type annotation_point = Jsonbug_t.annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = Jsonbug_t.nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = Jsonbug_t.loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = Jsonbug_t.json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = Jsonbug_t.extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = Jsonbug_t.jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = Jsonbug_t.report
type hum_info = Jsonbug_t.hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = Jsonbug_t.cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = Jsonbug_t.cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = Jsonbug_t.costs_report
type config_impact_item = Jsonbug_t.config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = Jsonbug_t.config_impact_report
val write_issue_method : Bi_outbuf.t -> issue_method -> unit

Output a JSON value of type issue_method.

val string_of_issue_method : ?⁠len:int -> issue_method -> string

Serialize a value of type issue_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_issue_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> issue_method

Input JSON data of type issue_method.

val issue_method_of_string : string -> issue_method

Deserialize JSON data of type issue_method.

val write_parameter_not_nullable_info : Bi_outbuf.t -> parameter_not_nullable_info -> unit

Output a JSON value of type parameter_not_nullable_info.

val string_of_parameter_not_nullable_info : ?⁠len:int -> parameter_not_nullable_info -> string

Serialize a value of type parameter_not_nullable_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_parameter_not_nullable_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> parameter_not_nullable_info

Input JSON data of type parameter_not_nullable_info.

val parameter_not_nullable_info_of_string : string -> parameter_not_nullable_info

Deserialize JSON data of type parameter_not_nullable_info.

val write_nullsafe_mode : Bi_outbuf.t -> nullsafe_mode -> unit

Output a JSON value of type nullsafe_mode.

val string_of_nullsafe_mode : ?⁠len:int -> nullsafe_mode -> string

Serialize a value of type nullsafe_mode into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_mode : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_mode

Input JSON data of type nullsafe_mode.

val nullsafe_mode_of_string : string -> nullsafe_mode

Deserialize JSON data of type nullsafe_mode.

val write_nullsafe_meta_issue_info : Bi_outbuf.t -> nullsafe_meta_issue_info -> unit

Output a JSON value of type nullsafe_meta_issue_info.

val string_of_nullsafe_meta_issue_info : ?⁠len:int -> nullsafe_meta_issue_info -> string

Serialize a value of type nullsafe_meta_issue_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_meta_issue_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_meta_issue_info

Input JSON data of type nullsafe_meta_issue_info.

val nullsafe_meta_issue_info_of_string : string -> nullsafe_meta_issue_info

Deserialize JSON data of type nullsafe_meta_issue_info.

val write_method_info : Bi_outbuf.t -> method_info -> unit

Output a JSON value of type method_info.

val string_of_method_info : ?⁠len:int -> method_info -> string

Serialize a value of type method_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_method_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> method_info

Input JSON data of type method_info.

val method_info_of_string : string -> method_info

Deserialize JSON data of type method_info.

val write_field_name : Bi_outbuf.t -> field_name -> unit

Output a JSON value of type field_name.

val string_of_field_name : ?⁠len:int -> field_name -> string

Serialize a value of type field_name into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_field_name : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> field_name

Input JSON data of type field_name.

val field_name_of_string : string -> field_name

Deserialize JSON data of type field_name.

val write_access_level : Bi_outbuf.t -> access_level -> unit

Output a JSON value of type access_level.

val string_of_access_level : ?⁠len:int -> access_level -> string

Serialize a value of type access_level into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_access_level : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> access_level

Input JSON data of type access_level.

val access_level_of_string : string -> access_level

Deserialize JSON data of type access_level.

val write_annotation_point_method : Bi_outbuf.t -> annotation_point_method -> unit

Output a JSON value of type annotation_point_method.

val string_of_annotation_point_method : ?⁠len:int -> annotation_point_method -> string

Serialize a value of type annotation_point_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_method

Input JSON data of type annotation_point_method.

val annotation_point_method_of_string : string -> annotation_point_method

Deserialize JSON data of type annotation_point_method.

val write_annotation_point_kind : Bi_outbuf.t -> annotation_point_kind -> unit

Output a JSON value of type annotation_point_kind.

val string_of_annotation_point_kind : ?⁠len:int -> annotation_point_kind -> string

Serialize a value of type annotation_point_kind into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_kind : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_kind

Input JSON data of type annotation_point_kind.

val annotation_point_kind_of_string : string -> annotation_point_kind

Deserialize JSON data of type annotation_point_kind.

val write_annotation_point : Bi_outbuf.t -> annotation_point -> unit

Output a JSON value of type annotation_point.

val string_of_annotation_point : ?⁠len:int -> annotation_point -> string

Serialize a value of type annotation_point into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point

Input JSON data of type annotation_point.

val annotation_point_of_string : string -> annotation_point

Deserialize JSON data of type annotation_point.

val write_nullsafe_extra : Bi_outbuf.t -> nullsafe_extra -> unit

Output a JSON value of type nullsafe_extra.

val string_of_nullsafe_extra : ?⁠len:int -> nullsafe_extra -> string

Serialize a value of type nullsafe_extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_extra

Input JSON data of type nullsafe_extra.

val nullsafe_extra_of_string : string -> nullsafe_extra

Deserialize JSON data of type nullsafe_extra.

val write_loc : Bi_outbuf.t -> loc -> unit

Output a JSON value of type loc.

val string_of_loc : ?⁠len:int -> loc -> string

Serialize a value of type loc into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_loc : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> loc

Input JSON data of type loc.

val loc_of_string : string -> loc

Deserialize JSON data of type loc.

val write_json_trace_item : Bi_outbuf.t -> json_trace_item -> unit

Output a JSON value of type json_trace_item.

val string_of_json_trace_item : ?⁠len:int -> json_trace_item -> string

Serialize a value of type json_trace_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_json_trace_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> json_trace_item

Input JSON data of type json_trace_item.

val json_trace_item_of_string : string -> json_trace_item

Deserialize JSON data of type json_trace_item.

val write_extra : Bi_outbuf.t -> extra -> unit

Output a JSON value of type extra.

val string_of_extra : ?⁠len:int -> extra -> string

Serialize a value of type extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> extra

Input JSON data of type extra.

val extra_of_string : string -> extra

Deserialize JSON data of type extra.

val write_jsonbug : Bi_outbuf.t -> jsonbug -> unit

Output a JSON value of type jsonbug.

val string_of_jsonbug : ?⁠len:int -> jsonbug -> string

Serialize a value of type jsonbug into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_jsonbug : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> jsonbug

Input JSON data of type jsonbug.

val jsonbug_of_string : string -> jsonbug

Deserialize JSON data of type jsonbug.

val write_report : Bi_outbuf.t -> report -> unit

Output a JSON value of type report.

val string_of_report : ?⁠len:int -> report -> string

Serialize a value of type report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> report

Input JSON data of type report.

val report_of_string : string -> report

Deserialize JSON data of type report.

val write_hum_info : Bi_outbuf.t -> hum_info -> unit

Output a JSON value of type hum_info.

val string_of_hum_info : ?⁠len:int -> hum_info -> string

Serialize a value of type hum_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_hum_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> hum_info

Input JSON data of type hum_info.

val hum_info_of_string : string -> hum_info

Deserialize JSON data of type hum_info.

val write_cost_info : Bi_outbuf.t -> cost_info -> unit

Output a JSON value of type cost_info.

val string_of_cost_info : ?⁠len:int -> cost_info -> string

Serialize a value of type cost_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_info

Input JSON data of type cost_info.

val cost_info_of_string : string -> cost_info

Deserialize JSON data of type cost_info.

val write_cost_item : Bi_outbuf.t -> cost_item -> unit

Output a JSON value of type cost_item.

val string_of_cost_item : ?⁠len:int -> cost_item -> string

Serialize a value of type cost_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_item

Input JSON data of type cost_item.

val cost_item_of_string : string -> cost_item

Deserialize JSON data of type cost_item.

val write_costs_report : Bi_outbuf.t -> costs_report -> unit

Output a JSON value of type costs_report.

val string_of_costs_report : ?⁠len:int -> costs_report -> string

Serialize a value of type costs_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_costs_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> costs_report

Input JSON data of type costs_report.

val costs_report_of_string : string -> costs_report

Deserialize JSON data of type costs_report.

val write_config_impact_item : Bi_outbuf.t -> config_impact_item -> unit

Output a JSON value of type config_impact_item.

val string_of_config_impact_item : ?⁠len:int -> config_impact_item -> string

Serialize a value of type config_impact_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_item

Input JSON data of type config_impact_item.

val config_impact_item_of_string : string -> config_impact_item

Deserialize JSON data of type config_impact_item.

val write_config_impact_report : Bi_outbuf.t -> config_impact_report -> unit

Output a JSON value of type config_impact_report.

val string_of_config_impact_report : ?⁠len:int -> config_impact_report -> string

Serialize a value of type config_impact_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_report

Input JSON data of type config_impact_report.

val config_impact_report_of_string : string -> config_impact_report

Deserialize JSON data of type config_impact_report.

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

Module ATDGenerated.Jsonbug_j

type issue_method = Jsonbug_t.issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = Jsonbug_t.parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = Jsonbug_t.nullsafe_mode
type nullsafe_meta_issue_info = Jsonbug_t.nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = Jsonbug_t.method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = Jsonbug_t.field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = Jsonbug_t.access_level
type annotation_point_method = Jsonbug_t.annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = Jsonbug_t.annotation_point_kind
type annotation_point = Jsonbug_t.annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = Jsonbug_t.nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = Jsonbug_t.loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = Jsonbug_t.json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = Jsonbug_t.extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = Jsonbug_t.jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = Jsonbug_t.report
type item = Jsonbug_t.item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
}
type hum_info = Jsonbug_t.hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = Jsonbug_t.cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = Jsonbug_t.cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = Jsonbug_t.costs_report
type config_impact_item = Jsonbug_t.config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = Jsonbug_t.config_impact_report
val write_issue_method : Bi_outbuf.t -> issue_method -> unit

Output a JSON value of type issue_method.

val string_of_issue_method : ?⁠len:int -> issue_method -> string

Serialize a value of type issue_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_issue_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> issue_method

Input JSON data of type issue_method.

val issue_method_of_string : string -> issue_method

Deserialize JSON data of type issue_method.

val write_parameter_not_nullable_info : Bi_outbuf.t -> parameter_not_nullable_info -> unit

Output a JSON value of type parameter_not_nullable_info.

val string_of_parameter_not_nullable_info : ?⁠len:int -> parameter_not_nullable_info -> string

Serialize a value of type parameter_not_nullable_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_parameter_not_nullable_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> parameter_not_nullable_info

Input JSON data of type parameter_not_nullable_info.

val parameter_not_nullable_info_of_string : string -> parameter_not_nullable_info

Deserialize JSON data of type parameter_not_nullable_info.

val write_nullsafe_mode : Bi_outbuf.t -> nullsafe_mode -> unit

Output a JSON value of type nullsafe_mode.

val string_of_nullsafe_mode : ?⁠len:int -> nullsafe_mode -> string

Serialize a value of type nullsafe_mode into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_mode : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_mode

Input JSON data of type nullsafe_mode.

val nullsafe_mode_of_string : string -> nullsafe_mode

Deserialize JSON data of type nullsafe_mode.

val write_nullsafe_meta_issue_info : Bi_outbuf.t -> nullsafe_meta_issue_info -> unit

Output a JSON value of type nullsafe_meta_issue_info.

val string_of_nullsafe_meta_issue_info : ?⁠len:int -> nullsafe_meta_issue_info -> string

Serialize a value of type nullsafe_meta_issue_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_meta_issue_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_meta_issue_info

Input JSON data of type nullsafe_meta_issue_info.

val nullsafe_meta_issue_info_of_string : string -> nullsafe_meta_issue_info

Deserialize JSON data of type nullsafe_meta_issue_info.

val write_method_info : Bi_outbuf.t -> method_info -> unit

Output a JSON value of type method_info.

val string_of_method_info : ?⁠len:int -> method_info -> string

Serialize a value of type method_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_method_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> method_info

Input JSON data of type method_info.

val method_info_of_string : string -> method_info

Deserialize JSON data of type method_info.

val write_field_name : Bi_outbuf.t -> field_name -> unit

Output a JSON value of type field_name.

val string_of_field_name : ?⁠len:int -> field_name -> string

Serialize a value of type field_name into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_field_name : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> field_name

Input JSON data of type field_name.

val field_name_of_string : string -> field_name

Deserialize JSON data of type field_name.

val write_access_level : Bi_outbuf.t -> access_level -> unit

Output a JSON value of type access_level.

val string_of_access_level : ?⁠len:int -> access_level -> string

Serialize a value of type access_level into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_access_level : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> access_level

Input JSON data of type access_level.

val access_level_of_string : string -> access_level

Deserialize JSON data of type access_level.

val write_annotation_point_method : Bi_outbuf.t -> annotation_point_method -> unit

Output a JSON value of type annotation_point_method.

val string_of_annotation_point_method : ?⁠len:int -> annotation_point_method -> string

Serialize a value of type annotation_point_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_method

Input JSON data of type annotation_point_method.

val annotation_point_method_of_string : string -> annotation_point_method

Deserialize JSON data of type annotation_point_method.

val write_annotation_point_kind : Bi_outbuf.t -> annotation_point_kind -> unit

Output a JSON value of type annotation_point_kind.

val string_of_annotation_point_kind : ?⁠len:int -> annotation_point_kind -> string

Serialize a value of type annotation_point_kind into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_kind : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_kind

Input JSON data of type annotation_point_kind.

val annotation_point_kind_of_string : string -> annotation_point_kind

Deserialize JSON data of type annotation_point_kind.

val write_annotation_point : Bi_outbuf.t -> annotation_point -> unit

Output a JSON value of type annotation_point.

val string_of_annotation_point : ?⁠len:int -> annotation_point -> string

Serialize a value of type annotation_point into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point

Input JSON data of type annotation_point.

val annotation_point_of_string : string -> annotation_point

Deserialize JSON data of type annotation_point.

val write_nullsafe_extra : Bi_outbuf.t -> nullsafe_extra -> unit

Output a JSON value of type nullsafe_extra.

val string_of_nullsafe_extra : ?⁠len:int -> nullsafe_extra -> string

Serialize a value of type nullsafe_extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_extra

Input JSON data of type nullsafe_extra.

val nullsafe_extra_of_string : string -> nullsafe_extra

Deserialize JSON data of type nullsafe_extra.

val write_loc : Bi_outbuf.t -> loc -> unit

Output a JSON value of type loc.

val string_of_loc : ?⁠len:int -> loc -> string

Serialize a value of type loc into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_loc : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> loc

Input JSON data of type loc.

val loc_of_string : string -> loc

Deserialize JSON data of type loc.

val write_json_trace_item : Bi_outbuf.t -> json_trace_item -> unit

Output a JSON value of type json_trace_item.

val string_of_json_trace_item : ?⁠len:int -> json_trace_item -> string

Serialize a value of type json_trace_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_json_trace_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> json_trace_item

Input JSON data of type json_trace_item.

val json_trace_item_of_string : string -> json_trace_item

Deserialize JSON data of type json_trace_item.

val write_extra : Bi_outbuf.t -> extra -> unit

Output a JSON value of type extra.

val string_of_extra : ?⁠len:int -> extra -> string

Serialize a value of type extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> extra

Input JSON data of type extra.

val extra_of_string : string -> extra

Deserialize JSON data of type extra.

val write_jsonbug : Bi_outbuf.t -> jsonbug -> unit

Output a JSON value of type jsonbug.

val string_of_jsonbug : ?⁠len:int -> jsonbug -> string

Serialize a value of type jsonbug into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_jsonbug : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> jsonbug

Input JSON data of type jsonbug.

val jsonbug_of_string : string -> jsonbug

Deserialize JSON data of type jsonbug.

val write_report : Bi_outbuf.t -> report -> unit

Output a JSON value of type report.

val string_of_report : ?⁠len:int -> report -> string

Serialize a value of type report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> report

Input JSON data of type report.

val report_of_string : string -> report

Deserialize JSON data of type report.

val write_item : Bi_outbuf.t -> item -> unit

Output a JSON value of type item.

val string_of_item : ?⁠len:int -> item -> string

Serialize a value of type item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> item

Input JSON data of type item.

val item_of_string : string -> item

Deserialize JSON data of type item.

val write_hum_info : Bi_outbuf.t -> hum_info -> unit

Output a JSON value of type hum_info.

val string_of_hum_info : ?⁠len:int -> hum_info -> string

Serialize a value of type hum_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_hum_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> hum_info

Input JSON data of type hum_info.

val hum_info_of_string : string -> hum_info

Deserialize JSON data of type hum_info.

val write_cost_info : Bi_outbuf.t -> cost_info -> unit

Output a JSON value of type cost_info.

val string_of_cost_info : ?⁠len:int -> cost_info -> string

Serialize a value of type cost_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_info

Input JSON data of type cost_info.

val cost_info_of_string : string -> cost_info

Deserialize JSON data of type cost_info.

val write_cost_item : Bi_outbuf.t -> cost_item -> unit

Output a JSON value of type cost_item.

val string_of_cost_item : ?⁠len:int -> cost_item -> string

Serialize a value of type cost_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_item

Input JSON data of type cost_item.

val cost_item_of_string : string -> cost_item

Deserialize JSON data of type cost_item.

val write_costs_report : Bi_outbuf.t -> costs_report -> unit

Output a JSON value of type costs_report.

val string_of_costs_report : ?⁠len:int -> costs_report -> string

Serialize a value of type costs_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_costs_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> costs_report

Input JSON data of type costs_report.

val costs_report_of_string : string -> costs_report

Deserialize JSON data of type costs_report.

val write_config_impact_item : Bi_outbuf.t -> config_impact_item -> unit

Output a JSON value of type config_impact_item.

val string_of_config_impact_item : ?⁠len:int -> config_impact_item -> string

Serialize a value of type config_impact_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_item

Input JSON data of type config_impact_item.

val config_impact_item_of_string : string -> config_impact_item

Deserialize JSON data of type config_impact_item.

val write_config_impact_report : Bi_outbuf.t -> config_impact_report -> unit

Output a JSON value of type config_impact_report.

val string_of_config_impact_report : ?⁠len:int -> config_impact_report -> string

Serialize a value of type config_impact_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_report

Input JSON data of type config_impact_report.

val config_impact_report_of_string : string -> config_impact_report

Deserialize JSON data of type config_impact_report.

\ No newline at end of file diff --git a/website/static/odoc/next/infer/ATDGenerated/Jsonbug_t/index.html b/website/static/odoc/next/infer/ATDGenerated/Jsonbug_t/index.html index 9fca0c32c..647a10f12 100644 --- a/website/static/odoc/next/infer/ATDGenerated/Jsonbug_t/index.html +++ b/website/static/odoc/next/infer/ATDGenerated/Jsonbug_t/index.html @@ -1,2 +1,2 @@ -Jsonbug_t (infer.ATDGenerated.Jsonbug_t)

Module ATDGenerated.Jsonbug_t

type issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = [
| `Default
| `LocalTrustAll
| `LocalTrustSome
| `LocalTrustNone
| `Strict
]
type nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = [
| `Private
| `Protected
| `Public
| `Default
]
type annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = [
| `Method
| `Field
| `Param
]
type annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = jsonbug list
type hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = cost_item list
type config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = config_impact_item list
\ No newline at end of file +Jsonbug_t (infer.ATDGenerated.Jsonbug_t)

Module ATDGenerated.Jsonbug_t

type issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = [
| `Default
| `LocalTrustAll
| `LocalTrustSome
| `LocalTrustNone
| `Strict
]
type nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = [
| `Private
| `Protected
| `Public
| `Default
]
type annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = [
| `Method
| `Field
| `Param
]
type annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = jsonbug list
type item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
}
type hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = cost_item list
type config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = config_impact_item list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/.dune-keep b/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/index.html b/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/index.html new file mode 100644 index 000000000..46ffda1ee --- /dev/null +++ b/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_j/index.html @@ -0,0 +1,2 @@ + +ATDGenerated__Config_impact_data_j (infer.ATDGenerated__Config_impact_data_j)

Module ATDGenerated__Config_impact_data_j

type config_item = ATDGenerated.Config_impact_data_t.config_item = {
method_name : string;
class_name : string;
}
type config_data = ATDGenerated.Config_impact_data_t.config_data
val write_config_item : Bi_outbuf.t -> config_item -> unit

Output a JSON value of type config_item.

val string_of_config_item : ?⁠len:int -> config_item -> string

Serialize a value of type config_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_item

Input JSON data of type config_item.

val config_item_of_string : string -> config_item

Deserialize JSON data of type config_item.

val write_config_data : Bi_outbuf.t -> config_data -> unit

Output a JSON value of type config_data.

val string_of_config_data : ?⁠len:int -> config_data -> string

Serialize a value of type config_data into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_data : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_data

Input JSON data of type config_data.

val config_data_of_string : string -> config_data

Deserialize JSON data of type config_data.

\ No newline at end of file diff --git a/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/.dune-keep b/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/index.html b/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/index.html new file mode 100644 index 000000000..114892ef4 --- /dev/null +++ b/website/static/odoc/next/infer/ATDGenerated__Config_impact_data_t/index.html @@ -0,0 +1,2 @@ + +ATDGenerated__Config_impact_data_t (infer.ATDGenerated__Config_impact_data_t)

Module ATDGenerated__Config_impact_data_t

type config_item = {
method_name : string;
class_name : string;
}
type config_data = config_item list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ATDGenerated__Jsonbug_j/index.html b/website/static/odoc/next/infer/ATDGenerated__Jsonbug_j/index.html index 814378912..ed8c26193 100644 --- a/website/static/odoc/next/infer/ATDGenerated__Jsonbug_j/index.html +++ b/website/static/odoc/next/infer/ATDGenerated__Jsonbug_j/index.html @@ -1,2 +1,2 @@ -ATDGenerated__Jsonbug_j (infer.ATDGenerated__Jsonbug_j)

Module ATDGenerated__Jsonbug_j

type issue_method = ATDGenerated.Jsonbug_t.issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = ATDGenerated.Jsonbug_t.parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = ATDGenerated.Jsonbug_t.nullsafe_mode
type nullsafe_meta_issue_info = ATDGenerated.Jsonbug_t.nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = ATDGenerated.Jsonbug_t.method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = ATDGenerated.Jsonbug_t.field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = ATDGenerated.Jsonbug_t.access_level
type annotation_point_method = ATDGenerated.Jsonbug_t.annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = ATDGenerated.Jsonbug_t.annotation_point_kind
type annotation_point = ATDGenerated.Jsonbug_t.annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = ATDGenerated.Jsonbug_t.nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = ATDGenerated.Jsonbug_t.loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = ATDGenerated.Jsonbug_t.json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = ATDGenerated.Jsonbug_t.extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = ATDGenerated.Jsonbug_t.jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = ATDGenerated.Jsonbug_t.report
type hum_info = ATDGenerated.Jsonbug_t.hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = ATDGenerated.Jsonbug_t.cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = ATDGenerated.Jsonbug_t.cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = ATDGenerated.Jsonbug_t.costs_report
type config_impact_item = ATDGenerated.Jsonbug_t.config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = ATDGenerated.Jsonbug_t.config_impact_report
val write_issue_method : Bi_outbuf.t -> issue_method -> unit

Output a JSON value of type issue_method.

val string_of_issue_method : ?⁠len:int -> issue_method -> string

Serialize a value of type issue_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_issue_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> issue_method

Input JSON data of type issue_method.

val issue_method_of_string : string -> issue_method

Deserialize JSON data of type issue_method.

val write_parameter_not_nullable_info : Bi_outbuf.t -> parameter_not_nullable_info -> unit

Output a JSON value of type parameter_not_nullable_info.

val string_of_parameter_not_nullable_info : ?⁠len:int -> parameter_not_nullable_info -> string

Serialize a value of type parameter_not_nullable_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_parameter_not_nullable_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> parameter_not_nullable_info

Input JSON data of type parameter_not_nullable_info.

val parameter_not_nullable_info_of_string : string -> parameter_not_nullable_info

Deserialize JSON data of type parameter_not_nullable_info.

val write_nullsafe_mode : Bi_outbuf.t -> nullsafe_mode -> unit

Output a JSON value of type nullsafe_mode.

val string_of_nullsafe_mode : ?⁠len:int -> nullsafe_mode -> string

Serialize a value of type nullsafe_mode into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_mode : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_mode

Input JSON data of type nullsafe_mode.

val nullsafe_mode_of_string : string -> nullsafe_mode

Deserialize JSON data of type nullsafe_mode.

val write_nullsafe_meta_issue_info : Bi_outbuf.t -> nullsafe_meta_issue_info -> unit

Output a JSON value of type nullsafe_meta_issue_info.

val string_of_nullsafe_meta_issue_info : ?⁠len:int -> nullsafe_meta_issue_info -> string

Serialize a value of type nullsafe_meta_issue_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_meta_issue_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_meta_issue_info

Input JSON data of type nullsafe_meta_issue_info.

val nullsafe_meta_issue_info_of_string : string -> nullsafe_meta_issue_info

Deserialize JSON data of type nullsafe_meta_issue_info.

val write_method_info : Bi_outbuf.t -> method_info -> unit

Output a JSON value of type method_info.

val string_of_method_info : ?⁠len:int -> method_info -> string

Serialize a value of type method_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_method_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> method_info

Input JSON data of type method_info.

val method_info_of_string : string -> method_info

Deserialize JSON data of type method_info.

val write_field_name : Bi_outbuf.t -> field_name -> unit

Output a JSON value of type field_name.

val string_of_field_name : ?⁠len:int -> field_name -> string

Serialize a value of type field_name into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_field_name : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> field_name

Input JSON data of type field_name.

val field_name_of_string : string -> field_name

Deserialize JSON data of type field_name.

val write_access_level : Bi_outbuf.t -> access_level -> unit

Output a JSON value of type access_level.

val string_of_access_level : ?⁠len:int -> access_level -> string

Serialize a value of type access_level into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_access_level : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> access_level

Input JSON data of type access_level.

val access_level_of_string : string -> access_level

Deserialize JSON data of type access_level.

val write_annotation_point_method : Bi_outbuf.t -> annotation_point_method -> unit

Output a JSON value of type annotation_point_method.

val string_of_annotation_point_method : ?⁠len:int -> annotation_point_method -> string

Serialize a value of type annotation_point_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_method

Input JSON data of type annotation_point_method.

val annotation_point_method_of_string : string -> annotation_point_method

Deserialize JSON data of type annotation_point_method.

val write_annotation_point_kind : Bi_outbuf.t -> annotation_point_kind -> unit

Output a JSON value of type annotation_point_kind.

val string_of_annotation_point_kind : ?⁠len:int -> annotation_point_kind -> string

Serialize a value of type annotation_point_kind into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_kind : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_kind

Input JSON data of type annotation_point_kind.

val annotation_point_kind_of_string : string -> annotation_point_kind

Deserialize JSON data of type annotation_point_kind.

val write_annotation_point : Bi_outbuf.t -> annotation_point -> unit

Output a JSON value of type annotation_point.

val string_of_annotation_point : ?⁠len:int -> annotation_point -> string

Serialize a value of type annotation_point into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point

Input JSON data of type annotation_point.

val annotation_point_of_string : string -> annotation_point

Deserialize JSON data of type annotation_point.

val write_nullsafe_extra : Bi_outbuf.t -> nullsafe_extra -> unit

Output a JSON value of type nullsafe_extra.

val string_of_nullsafe_extra : ?⁠len:int -> nullsafe_extra -> string

Serialize a value of type nullsafe_extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_extra

Input JSON data of type nullsafe_extra.

val nullsafe_extra_of_string : string -> nullsafe_extra

Deserialize JSON data of type nullsafe_extra.

val write_loc : Bi_outbuf.t -> loc -> unit

Output a JSON value of type loc.

val string_of_loc : ?⁠len:int -> loc -> string

Serialize a value of type loc into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_loc : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> loc

Input JSON data of type loc.

val loc_of_string : string -> loc

Deserialize JSON data of type loc.

val write_json_trace_item : Bi_outbuf.t -> json_trace_item -> unit

Output a JSON value of type json_trace_item.

val string_of_json_trace_item : ?⁠len:int -> json_trace_item -> string

Serialize a value of type json_trace_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_json_trace_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> json_trace_item

Input JSON data of type json_trace_item.

val json_trace_item_of_string : string -> json_trace_item

Deserialize JSON data of type json_trace_item.

val write_extra : Bi_outbuf.t -> extra -> unit

Output a JSON value of type extra.

val string_of_extra : ?⁠len:int -> extra -> string

Serialize a value of type extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> extra

Input JSON data of type extra.

val extra_of_string : string -> extra

Deserialize JSON data of type extra.

val write_jsonbug : Bi_outbuf.t -> jsonbug -> unit

Output a JSON value of type jsonbug.

val string_of_jsonbug : ?⁠len:int -> jsonbug -> string

Serialize a value of type jsonbug into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_jsonbug : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> jsonbug

Input JSON data of type jsonbug.

val jsonbug_of_string : string -> jsonbug

Deserialize JSON data of type jsonbug.

val write_report : Bi_outbuf.t -> report -> unit

Output a JSON value of type report.

val string_of_report : ?⁠len:int -> report -> string

Serialize a value of type report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> report

Input JSON data of type report.

val report_of_string : string -> report

Deserialize JSON data of type report.

val write_hum_info : Bi_outbuf.t -> hum_info -> unit

Output a JSON value of type hum_info.

val string_of_hum_info : ?⁠len:int -> hum_info -> string

Serialize a value of type hum_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_hum_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> hum_info

Input JSON data of type hum_info.

val hum_info_of_string : string -> hum_info

Deserialize JSON data of type hum_info.

val write_cost_info : Bi_outbuf.t -> cost_info -> unit

Output a JSON value of type cost_info.

val string_of_cost_info : ?⁠len:int -> cost_info -> string

Serialize a value of type cost_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_info

Input JSON data of type cost_info.

val cost_info_of_string : string -> cost_info

Deserialize JSON data of type cost_info.

val write_cost_item : Bi_outbuf.t -> cost_item -> unit

Output a JSON value of type cost_item.

val string_of_cost_item : ?⁠len:int -> cost_item -> string

Serialize a value of type cost_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_item

Input JSON data of type cost_item.

val cost_item_of_string : string -> cost_item

Deserialize JSON data of type cost_item.

val write_costs_report : Bi_outbuf.t -> costs_report -> unit

Output a JSON value of type costs_report.

val string_of_costs_report : ?⁠len:int -> costs_report -> string

Serialize a value of type costs_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_costs_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> costs_report

Input JSON data of type costs_report.

val costs_report_of_string : string -> costs_report

Deserialize JSON data of type costs_report.

val write_config_impact_item : Bi_outbuf.t -> config_impact_item -> unit

Output a JSON value of type config_impact_item.

val string_of_config_impact_item : ?⁠len:int -> config_impact_item -> string

Serialize a value of type config_impact_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_item

Input JSON data of type config_impact_item.

val config_impact_item_of_string : string -> config_impact_item

Deserialize JSON data of type config_impact_item.

val write_config_impact_report : Bi_outbuf.t -> config_impact_report -> unit

Output a JSON value of type config_impact_report.

val string_of_config_impact_report : ?⁠len:int -> config_impact_report -> string

Serialize a value of type config_impact_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_report

Input JSON data of type config_impact_report.

val config_impact_report_of_string : string -> config_impact_report

Deserialize JSON data of type config_impact_report.

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

Module ATDGenerated__Jsonbug_j

type issue_method = ATDGenerated.Jsonbug_t.issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = ATDGenerated.Jsonbug_t.parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = ATDGenerated.Jsonbug_t.nullsafe_mode
type nullsafe_meta_issue_info = ATDGenerated.Jsonbug_t.nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = ATDGenerated.Jsonbug_t.method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = ATDGenerated.Jsonbug_t.field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = ATDGenerated.Jsonbug_t.access_level
type annotation_point_method = ATDGenerated.Jsonbug_t.annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = ATDGenerated.Jsonbug_t.annotation_point_kind
type annotation_point = ATDGenerated.Jsonbug_t.annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = ATDGenerated.Jsonbug_t.nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = ATDGenerated.Jsonbug_t.loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = ATDGenerated.Jsonbug_t.json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = ATDGenerated.Jsonbug_t.extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = ATDGenerated.Jsonbug_t.jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = ATDGenerated.Jsonbug_t.report
type item = ATDGenerated.Jsonbug_t.item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
}
type hum_info = ATDGenerated.Jsonbug_t.hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = ATDGenerated.Jsonbug_t.cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = ATDGenerated.Jsonbug_t.cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = ATDGenerated.Jsonbug_t.costs_report
type config_impact_item = ATDGenerated.Jsonbug_t.config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = ATDGenerated.Jsonbug_t.config_impact_report
val write_issue_method : Bi_outbuf.t -> issue_method -> unit

Output a JSON value of type issue_method.

val string_of_issue_method : ?⁠len:int -> issue_method -> string

Serialize a value of type issue_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_issue_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> issue_method

Input JSON data of type issue_method.

val issue_method_of_string : string -> issue_method

Deserialize JSON data of type issue_method.

val write_parameter_not_nullable_info : Bi_outbuf.t -> parameter_not_nullable_info -> unit

Output a JSON value of type parameter_not_nullable_info.

val string_of_parameter_not_nullable_info : ?⁠len:int -> parameter_not_nullable_info -> string

Serialize a value of type parameter_not_nullable_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_parameter_not_nullable_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> parameter_not_nullable_info

Input JSON data of type parameter_not_nullable_info.

val parameter_not_nullable_info_of_string : string -> parameter_not_nullable_info

Deserialize JSON data of type parameter_not_nullable_info.

val write_nullsafe_mode : Bi_outbuf.t -> nullsafe_mode -> unit

Output a JSON value of type nullsafe_mode.

val string_of_nullsafe_mode : ?⁠len:int -> nullsafe_mode -> string

Serialize a value of type nullsafe_mode into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_mode : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_mode

Input JSON data of type nullsafe_mode.

val nullsafe_mode_of_string : string -> nullsafe_mode

Deserialize JSON data of type nullsafe_mode.

val write_nullsafe_meta_issue_info : Bi_outbuf.t -> nullsafe_meta_issue_info -> unit

Output a JSON value of type nullsafe_meta_issue_info.

val string_of_nullsafe_meta_issue_info : ?⁠len:int -> nullsafe_meta_issue_info -> string

Serialize a value of type nullsafe_meta_issue_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_meta_issue_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_meta_issue_info

Input JSON data of type nullsafe_meta_issue_info.

val nullsafe_meta_issue_info_of_string : string -> nullsafe_meta_issue_info

Deserialize JSON data of type nullsafe_meta_issue_info.

val write_method_info : Bi_outbuf.t -> method_info -> unit

Output a JSON value of type method_info.

val string_of_method_info : ?⁠len:int -> method_info -> string

Serialize a value of type method_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_method_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> method_info

Input JSON data of type method_info.

val method_info_of_string : string -> method_info

Deserialize JSON data of type method_info.

val write_field_name : Bi_outbuf.t -> field_name -> unit

Output a JSON value of type field_name.

val string_of_field_name : ?⁠len:int -> field_name -> string

Serialize a value of type field_name into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_field_name : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> field_name

Input JSON data of type field_name.

val field_name_of_string : string -> field_name

Deserialize JSON data of type field_name.

val write_access_level : Bi_outbuf.t -> access_level -> unit

Output a JSON value of type access_level.

val string_of_access_level : ?⁠len:int -> access_level -> string

Serialize a value of type access_level into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_access_level : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> access_level

Input JSON data of type access_level.

val access_level_of_string : string -> access_level

Deserialize JSON data of type access_level.

val write_annotation_point_method : Bi_outbuf.t -> annotation_point_method -> unit

Output a JSON value of type annotation_point_method.

val string_of_annotation_point_method : ?⁠len:int -> annotation_point_method -> string

Serialize a value of type annotation_point_method into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_method : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_method

Input JSON data of type annotation_point_method.

val annotation_point_method_of_string : string -> annotation_point_method

Deserialize JSON data of type annotation_point_method.

val write_annotation_point_kind : Bi_outbuf.t -> annotation_point_kind -> unit

Output a JSON value of type annotation_point_kind.

val string_of_annotation_point_kind : ?⁠len:int -> annotation_point_kind -> string

Serialize a value of type annotation_point_kind into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point_kind : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point_kind

Input JSON data of type annotation_point_kind.

val annotation_point_kind_of_string : string -> annotation_point_kind

Deserialize JSON data of type annotation_point_kind.

val write_annotation_point : Bi_outbuf.t -> annotation_point -> unit

Output a JSON value of type annotation_point.

val string_of_annotation_point : ?⁠len:int -> annotation_point -> string

Serialize a value of type annotation_point into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_annotation_point : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> annotation_point

Input JSON data of type annotation_point.

val annotation_point_of_string : string -> annotation_point

Deserialize JSON data of type annotation_point.

val write_nullsafe_extra : Bi_outbuf.t -> nullsafe_extra -> unit

Output a JSON value of type nullsafe_extra.

val string_of_nullsafe_extra : ?⁠len:int -> nullsafe_extra -> string

Serialize a value of type nullsafe_extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_nullsafe_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> nullsafe_extra

Input JSON data of type nullsafe_extra.

val nullsafe_extra_of_string : string -> nullsafe_extra

Deserialize JSON data of type nullsafe_extra.

val write_loc : Bi_outbuf.t -> loc -> unit

Output a JSON value of type loc.

val string_of_loc : ?⁠len:int -> loc -> string

Serialize a value of type loc into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_loc : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> loc

Input JSON data of type loc.

val loc_of_string : string -> loc

Deserialize JSON data of type loc.

val write_json_trace_item : Bi_outbuf.t -> json_trace_item -> unit

Output a JSON value of type json_trace_item.

val string_of_json_trace_item : ?⁠len:int -> json_trace_item -> string

Serialize a value of type json_trace_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_json_trace_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> json_trace_item

Input JSON data of type json_trace_item.

val json_trace_item_of_string : string -> json_trace_item

Deserialize JSON data of type json_trace_item.

val write_extra : Bi_outbuf.t -> extra -> unit

Output a JSON value of type extra.

val string_of_extra : ?⁠len:int -> extra -> string

Serialize a value of type extra into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_extra : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> extra

Input JSON data of type extra.

val extra_of_string : string -> extra

Deserialize JSON data of type extra.

val write_jsonbug : Bi_outbuf.t -> jsonbug -> unit

Output a JSON value of type jsonbug.

val string_of_jsonbug : ?⁠len:int -> jsonbug -> string

Serialize a value of type jsonbug into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_jsonbug : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> jsonbug

Input JSON data of type jsonbug.

val jsonbug_of_string : string -> jsonbug

Deserialize JSON data of type jsonbug.

val write_report : Bi_outbuf.t -> report -> unit

Output a JSON value of type report.

val string_of_report : ?⁠len:int -> report -> string

Serialize a value of type report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> report

Input JSON data of type report.

val report_of_string : string -> report

Deserialize JSON data of type report.

val write_item : Bi_outbuf.t -> item -> unit

Output a JSON value of type item.

val string_of_item : ?⁠len:int -> item -> string

Serialize a value of type item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> item

Input JSON data of type item.

val item_of_string : string -> item

Deserialize JSON data of type item.

val write_hum_info : Bi_outbuf.t -> hum_info -> unit

Output a JSON value of type hum_info.

val string_of_hum_info : ?⁠len:int -> hum_info -> string

Serialize a value of type hum_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_hum_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> hum_info

Input JSON data of type hum_info.

val hum_info_of_string : string -> hum_info

Deserialize JSON data of type hum_info.

val write_cost_info : Bi_outbuf.t -> cost_info -> unit

Output a JSON value of type cost_info.

val string_of_cost_info : ?⁠len:int -> cost_info -> string

Serialize a value of type cost_info into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_info : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_info

Input JSON data of type cost_info.

val cost_info_of_string : string -> cost_info

Deserialize JSON data of type cost_info.

val write_cost_item : Bi_outbuf.t -> cost_item -> unit

Output a JSON value of type cost_item.

val string_of_cost_item : ?⁠len:int -> cost_item -> string

Serialize a value of type cost_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_cost_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> cost_item

Input JSON data of type cost_item.

val cost_item_of_string : string -> cost_item

Deserialize JSON data of type cost_item.

val write_costs_report : Bi_outbuf.t -> costs_report -> unit

Output a JSON value of type costs_report.

val string_of_costs_report : ?⁠len:int -> costs_report -> string

Serialize a value of type costs_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_costs_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> costs_report

Input JSON data of type costs_report.

val costs_report_of_string : string -> costs_report

Deserialize JSON data of type costs_report.

val write_config_impact_item : Bi_outbuf.t -> config_impact_item -> unit

Output a JSON value of type config_impact_item.

val string_of_config_impact_item : ?⁠len:int -> config_impact_item -> string

Serialize a value of type config_impact_item into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_item : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_item

Input JSON data of type config_impact_item.

val config_impact_item_of_string : string -> config_impact_item

Deserialize JSON data of type config_impact_item.

val write_config_impact_report : Bi_outbuf.t -> config_impact_report -> unit

Output a JSON value of type config_impact_report.

val string_of_config_impact_report : ?⁠len:int -> config_impact_report -> string

Serialize a value of type config_impact_report into a JSON string.

parameter len

specifies the initial length of the buffer used internally. Default: 1024.

val read_config_impact_report : Yojson.Safe.lexer_state -> Stdlib.Lexing.lexbuf -> config_impact_report

Input JSON data of type config_impact_report.

val config_impact_report_of_string : string -> config_impact_report

Deserialize JSON data of type config_impact_report.

\ No newline at end of file diff --git a/website/static/odoc/next/infer/ATDGenerated__Jsonbug_t/index.html b/website/static/odoc/next/infer/ATDGenerated__Jsonbug_t/index.html index ebd25f078..64bc1363f 100644 --- a/website/static/odoc/next/infer/ATDGenerated__Jsonbug_t/index.html +++ b/website/static/odoc/next/infer/ATDGenerated__Jsonbug_t/index.html @@ -1,2 +1,2 @@ -ATDGenerated__Jsonbug_t (infer.ATDGenerated__Jsonbug_t)

Module ATDGenerated__Jsonbug_t

type issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = [
| `Default
| `LocalTrustAll
| `LocalTrustSome
| `LocalTrustNone
| `Strict
]
type nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = [
| `Private
| `Protected
| `Public
| `Default
]
type annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = [
| `Method
| `Field
| `Param
]
type annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = jsonbug list
type hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = cost_item list
type config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = config_impact_item list
\ No newline at end of file +ATDGenerated__Jsonbug_t (infer.ATDGenerated__Jsonbug_t)

Module ATDGenerated__Jsonbug_t

type issue_method = {
name : string;
params : string list;
}
type parameter_not_nullable_info = {
class_name : string;
package_name : string option;
method_info : issue_method;
param_index : int;
}
type nullsafe_mode = [
| `Default
| `LocalTrustAll
| `LocalTrustSome
| `LocalTrustNone
| `Strict
]
type nullsafe_meta_issue_info = {
num_issues : int;
curr_nullsafe_mode : nullsafe_mode;
can_be_promoted_to : nullsafe_mode option;
}
type method_info = {
class_name : string;
package : string;
method_name : string;
call_line : int;
}
type field_name = {
class_name : string;
package_name : string option;
field : string;
}
type access_level = [
| `Private
| `Protected
| `Public
| `Default
]
type annotation_point_method = {
method_name : string;
params : string list;
access_level : access_level;
}
type annotation_point_kind = [
| `Method
| `Field
| `Param
]
type annotation_point = {
id : string;
kind : annotation_point_kind;
method_info : annotation_point_method option;
field_name : string option;
param_num : int option;
num_violations : int;
dependent_point_ids : string list;
}
type nullsafe_extra = {
class_name : string;
package : string option;
method_info : issue_method option;
field : field_name option;
inconsistent_param_index : int option;
parameter_not_nullable_info : parameter_not_nullable_info option;
nullable_methods : method_info list option;
unvetted_3rd_party : string list option;
meta_issue_info : nullsafe_meta_issue_info option;
annotation_graph : annotation_point list option;
}
type loc = {
file : string;
lnum : int;
cnum : int;
enum : int;
}
type json_trace_item = {
level : int;
filename : string;
line_number : int;
column_number : int;
description : string;
}
type extra = {
cost_polynomial : string option;
cost_degree : int option;
nullsafe_extra : nullsafe_extra option;
}
type jsonbug = {
bug_type : string;
doc_url : string option;
qualifier : string;
severity : string;
line : int;
column : int;
procedure : string;
procedure_start_line : int;
file : string;
bug_trace : json_trace_item list;
key : string;
node_key : string option;
hash : string;
dotty : string option;
infer_source_loc : loc option;
bug_type_hum : string;
linters_def_file : string option;
traceview_id : int option;
censored_reason : string option;
access : string option;
extras : extra option;
}
type report = jsonbug list
type item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
}
type hum_info = {
hum_polynomial : string;
hum_degree : string;
big_o : string;
}
type cost_info = {
polynomial_version : int;
polynomial : string;
degree : int option;
hum : hum_info;
trace : json_trace_item list;
}
type cost_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
is_on_ui_thread : bool;
exec_cost : cost_info;
autoreleasepool_size : cost_info;
}
type costs_report = cost_item list
type config_impact_item = {
hash : string;
loc : loc;
procedure_name : string;
procedure_id : string;
unchecked_callees : string;
}
type config_impact_report = config_impact_item list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/Summary/index.html b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/Summary/index.html new file mode 100644 index 000000000..0dc6db09b --- /dev/null +++ b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/Summary/index.html @@ -0,0 +1,2 @@ + +Summary (infer.Checkers.ConfigImpactAnalysis.Summary)

Module ConfigImpactAnalysis.Summary

type t
val pp : Stdlib.Format.formatter -> t -> unit
val get_unchecked_callees : t -> UncheckedCallees.t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallee/index.html b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallee/index.html new file mode 100644 index 000000000..35d39e5e9 --- /dev/null +++ b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallee/index.html @@ -0,0 +1,2 @@ + +UncheckedCallee (infer.Checkers.ConfigImpactAnalysis.UncheckedCallee)

Module ConfigImpactAnalysis.UncheckedCallee

type t
val make_err_trace : t -> Absint.Errlog.loc_trace
val pp_without_location_list : Stdlib.Format.formatter -> t list -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallees/index.html b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallees/index.html new file mode 100644 index 000000000..9f3646b76 --- /dev/null +++ b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/UncheckedCallees/index.html @@ -0,0 +1,2 @@ + +UncheckedCallees (infer.Checkers.ConfigImpactAnalysis.UncheckedCallees)

Module ConfigImpactAnalysis.UncheckedCallees

include Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = UncheckedCallee.t
type elt = UncheckedCallee.t
type t
val empty : t
val is_empty : t -> bool
val mem : elt -> t -> bool
val add : elt -> t -> t
val singleton : elt -> t
val remove : elt -> t -> t
val union : t -> t -> t
val inter : t -> t -> t
val disjoint : t -> t -> bool
val diff : t -> t -> t
val compare : t -> t -> int
val equal : t -> t -> bool
val subset : t -> t -> bool
val iter : (elt -> unit) -> t -> unit
val map : (elt -> elt) -> t -> t
val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
val for_all : (elt -> bool) -> t -> bool
val exists : (elt -> bool) -> t -> bool
val filter : (elt -> bool) -> t -> t
val filter_map : (elt -> elt option) -> t -> t
val partition : (elt -> bool) -> t -> t * t
val cardinal : t -> int
val elements : t -> elt list
val min_elt : t -> elt
val min_elt_opt : t -> elt option
val max_elt : t -> elt
val max_elt_opt : t -> elt option
val choose : t -> elt
val choose_opt : t -> elt option
val split : elt -> t -> t * bool * t
val find : elt -> t -> elt
val find_opt : elt -> t -> elt option
val find_first : (elt -> bool) -> t -> elt
val find_first_opt : (elt -> bool) -> t -> elt option
val find_last : (elt -> bool) -> t -> elt
val find_last_opt : (elt -> bool) -> t -> elt option
val of_list : elt list -> t
val to_seq_from : elt -> t -> elt Stdlib.Seq.t
val to_seq : t -> elt Stdlib.Seq.t
val add_seq : elt Stdlib.Seq.t -> t -> t
val of_seq : elt Stdlib.Seq.t -> t
val is_singleton_or_more : t -> elt IStdlib.IContainer.singleton_or_more
val pp_element : IStdlib.PrettyPrintable.F.formatter -> elt -> unit
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool
val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val bottom : t
val is_bottom : t -> bool
val encode : t -> string
val decode : string -> t
val pp_without_location : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/index.html b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/index.html new file mode 100644 index 000000000..e4a4acb8d --- /dev/null +++ b/website/static/odoc/next/infer/Checkers/ConfigImpactAnalysis/index.html @@ -0,0 +1,2 @@ + +ConfigImpactAnalysis (infer.Checkers.ConfigImpactAnalysis)

Module Checkers.ConfigImpactAnalysis

module UncheckedCallee : sig ... end
module UncheckedCallees : sig ... end
module Summary : sig ... end
val checker : Summary.t Absint.InterproceduralAnalysis.t -> Summary.t option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers/ExternalConfigImpactData/index.html b/website/static/odoc/next/infer/Checkers/ExternalConfigImpactData/index.html new file mode 100644 index 000000000..d5be7457f --- /dev/null +++ b/website/static/odoc/next/infer/Checkers/ExternalConfigImpactData/index.html @@ -0,0 +1,2 @@ + +ExternalConfigImpactData (infer.Checkers.ExternalConfigImpactData)

Module Checkers.ExternalConfigImpactData

val is_in_config_data_file : IR.Procname.t -> bool
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/.dune-keep b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/Summary/index.html b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/Summary/index.html new file mode 100644 index 000000000..e76d0de3d --- /dev/null +++ b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/Summary/index.html @@ -0,0 +1,2 @@ + +Summary (infer.Checkers__ConfigImpactAnalysis.Summary)

Module Checkers__ConfigImpactAnalysis.Summary

type t
val pp : Stdlib.Format.formatter -> t -> unit
val get_unchecked_callees : t -> UncheckedCallees.t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallee/index.html b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallee/index.html new file mode 100644 index 000000000..8e02e3f2f --- /dev/null +++ b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallee/index.html @@ -0,0 +1,2 @@ + +UncheckedCallee (infer.Checkers__ConfigImpactAnalysis.UncheckedCallee)

Module Checkers__ConfigImpactAnalysis.UncheckedCallee

type t
val make_err_trace : t -> Absint.Errlog.loc_trace
val pp_without_location_list : Stdlib.Format.formatter -> t list -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallees/index.html b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallees/index.html new file mode 100644 index 000000000..416d6adf6 --- /dev/null +++ b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/UncheckedCallees/index.html @@ -0,0 +1,2 @@ + +UncheckedCallees (infer.Checkers__ConfigImpactAnalysis.UncheckedCallees)

Module Checkers__ConfigImpactAnalysis.UncheckedCallees

include Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = UncheckedCallee.t
type elt = UncheckedCallee.t
type t
val empty : t
val is_empty : t -> bool
val mem : elt -> t -> bool
val add : elt -> t -> t
val singleton : elt -> t
val remove : elt -> t -> t
val union : t -> t -> t
val inter : t -> t -> t
val disjoint : t -> t -> bool
val diff : t -> t -> t
val compare : t -> t -> int
val equal : t -> t -> bool
val subset : t -> t -> bool
val iter : (elt -> unit) -> t -> unit
val map : (elt -> elt) -> t -> t
val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a
val for_all : (elt -> bool) -> t -> bool
val exists : (elt -> bool) -> t -> bool
val filter : (elt -> bool) -> t -> t
val filter_map : (elt -> elt option) -> t -> t
val partition : (elt -> bool) -> t -> t * t
val cardinal : t -> int
val elements : t -> elt list
val min_elt : t -> elt
val min_elt_opt : t -> elt option
val max_elt : t -> elt
val max_elt_opt : t -> elt option
val choose : t -> elt
val choose_opt : t -> elt option
val split : elt -> t -> t * bool * t
val find : elt -> t -> elt
val find_opt : elt -> t -> elt option
val find_first : (elt -> bool) -> t -> elt
val find_first_opt : (elt -> bool) -> t -> elt option
val find_last : (elt -> bool) -> t -> elt
val find_last_opt : (elt -> bool) -> t -> elt option
val of_list : elt list -> t
val to_seq_from : elt -> t -> elt Stdlib.Seq.t
val to_seq : t -> elt Stdlib.Seq.t
val add_seq : elt Stdlib.Seq.t -> t -> t
val of_seq : elt Stdlib.Seq.t -> t
val is_singleton_or_more : t -> elt IStdlib.IContainer.singleton_or_more
val pp_element : IStdlib.PrettyPrintable.F.formatter -> elt -> unit
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool
val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val bottom : t
val is_bottom : t -> bool
val encode : t -> string
val decode : string -> t
val pp_without_location : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/index.html b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/index.html new file mode 100644 index 000000000..719a379b4 --- /dev/null +++ b/website/static/odoc/next/infer/Checkers__ConfigImpactAnalysis/index.html @@ -0,0 +1,2 @@ + +Checkers__ConfigImpactAnalysis (infer.Checkers__ConfigImpactAnalysis)

Module Checkers__ConfigImpactAnalysis

module UncheckedCallee : sig ... end
module UncheckedCallees : sig ... end
module Summary : sig ... end
val checker : Summary.t Absint.InterproceduralAnalysis.t -> Summary.t option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/.dune-keep b/website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/index.html b/website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/index.html new file mode 100644 index 000000000..f2780f4e1 --- /dev/null +++ b/website/static/odoc/next/infer/Checkers__ExternalConfigImpactData/index.html @@ -0,0 +1,2 @@ + +Checkers__ExternalConfigImpactData (infer.Checkers__ExternalConfigImpactData)

Module Checkers__ExternalConfigImpactData

val is_in_config_data_file : IR.Procname.t -> bool
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ClangFrontend/CGeneral_utils/index.html b/website/static/odoc/next/infer/ClangFrontend/CGeneral_utils/index.html index fa840b918..86e3b2fd9 100644 --- a/website/static/odoc/next/infer/ClangFrontend/CGeneral_utils/index.html +++ b/website/static/odoc/next/infer/ClangFrontend/CGeneral_utils/index.html @@ -1,2 +1,2 @@ -CGeneral_utils (infer.ClangFrontend.CGeneral_utils)

Module ClangFrontend.CGeneral_utils

type var_info = ATDGenerated.Clang_ast_t.decl_info * ATDGenerated.Clang_ast_t.qual_type * ATDGenerated.Clang_ast_t.var_decl_info * bool
val add_no_duplicates_fields : IR.Struct.field -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_fields : IR.Struct.field list -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_methods : IR.Procname.t list -> IR.Procname.t list -> IR.Procname.t list
val swap_elements_list : 'a list -> 'a list
val list_range : int -> int -> int list
val mk_class_field_name : IR.Typ.Name.t -> string -> IR.Fieldname.t
val get_var_name_mangled : ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> string * IR.Mangled.t
val mk_sil_global_var : CFrontend_config.translation_unit_context -> ?⁠mk_name:(string -> IR.Mangled.t -> IR.Mangled.t) -> ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> ATDGenerated.Clang_ast_t.qual_type -> IR.Pvar.t
val mk_sil_var : CFrontend_config.translation_unit_context -> ATDGenerated.Clang_ast_t.named_decl_info -> var_info option -> IR.Procname.t -> IR.Procname.t -> IR.Pvar.t
val is_cpp_translation : CFrontend_config.translation_unit_context -> bool

true if the current language is C++ or ObjC++

val is_objc_extension : CFrontend_config.translation_unit_context -> bool

true if the current language is ObjC or ObjC++

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

Module ClangFrontend.CGeneral_utils

type var_info = ATDGenerated.Clang_ast_t.decl_info * ATDGenerated.Clang_ast_t.qual_type * ATDGenerated.Clang_ast_t.var_decl_info * bool
val add_no_duplicates_fields : IR.Struct.field -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_fields : IR.Struct.field list -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_methods : IR.Procname.t list -> IR.Procname.t list -> IR.Procname.t list
val swap_elements_list : 'a list -> 'a list
val list_range : int -> int -> int list
val mk_class_field_name : IR.Typ.Name.t -> string -> IR.Fieldname.t
val get_var_name_mangled : ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> string * IR.Mangled.t
val mk_sil_global_var : CFrontend_config.translation_unit_context -> ?⁠mk_name:(string -> IR.Mangled.t -> IR.Mangled.t) -> ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> ATDGenerated.Clang_ast_t.qual_type -> IR.Pvar.t
val mk_sil_var : CFrontend_config.translation_unit_context -> ATDGenerated.Clang_ast_t.named_decl_info -> var_info option -> IR.Procname.t -> IR.Procname.t -> IR.Pvar.t
val is_cpp_translation : CFrontend_config.translation_unit_context -> bool

true if the current language is C++ or ObjC++

val is_objc_extension : CFrontend_config.translation_unit_context -> bool

true if the current language is ObjC or ObjC++

val is_type_pod : ATDGenerated.Clang_ast_t.qual_type -> bool
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ClangFrontend/CMethodSignature/index.html b/website/static/odoc/next/infer/ClangFrontend/CMethodSignature/index.html index 53a8a7ccb..74f826e66 100644 --- a/website/static/odoc/next/infer/ClangFrontend/CMethodSignature/index.html +++ b/website/static/odoc/next/infer/ClangFrontend/CMethodSignature/index.html @@ -1,2 +1,2 @@ -CMethodSignature (infer.ClangFrontend.CMethodSignature)

Module ClangFrontend.CMethodSignature

type param_type = {
annot : IR.Annot.Item.t;
is_no_escape_block_arg : bool;
is_pointer_to_const : bool;
name : IR.Mangled.t;
typ : IR.Typ.t;
}
type t = {
name : IR.Procname.t;
access : ATDGenerated.Clang_ast_t.access_specifier;
class_param : param_type option;
params : param_type list;
ret_type : IR.Typ.t * IR.Annot.Item.t;
has_added_return_param : bool;
attributes : ATDGenerated.Clang_ast_t.attribute list;
loc : ATDGenerated.Clang_ast_t.source_range;
method_kind : IR.ClangMethodKind.t;
is_cpp_virtual : bool;
passed_as_noescape_block_to : IR.Procname.t option;
is_no_return : bool;
is_variadic : bool;
pointer_to_parent : ATDGenerated.Clang_ast_t.pointer option;
pointer_to_property_opt : ATDGenerated.Clang_ast_t.pointer option;
return_param_typ : IR.Typ.t option;
}
val is_getter : t -> bool
val is_setter : t -> bool
val mk : IR.Procname.t -> param_type option -> param_type list -> (IR.Typ.t * IR.Annot.Item.t) -> ?⁠has_added_return_param:bool -> ATDGenerated.Clang_ast_t.attribute list -> ATDGenerated.Clang_ast_t.source_range -> IR.ClangMethodKind.t -> ?⁠is_cpp_virtual:bool -> ?⁠passed_as_noescape_block_to:IR.Procname.t option -> ?⁠is_no_return:bool -> ?⁠is_variadic:bool -> ATDGenerated.Clang_ast_t.pointer option -> ATDGenerated.Clang_ast_t.pointer option -> IR.Typ.t option -> ATDGenerated.Clang_ast_t.access_specifier -> t
val pp : Stdlib.Format.formatter -> t -> unit
val mk_param_type : ?⁠is_pointer_to_const:bool -> ?⁠annot:IR.Annot.Item.t -> ?⁠is_no_escape_block_arg:bool -> IR.Mangled.t -> IR.Typ.t -> param_type
\ No newline at end of file +CMethodSignature (infer.ClangFrontend.CMethodSignature)

Module ClangFrontend.CMethodSignature

type param_type = {
annot : IR.Annot.Item.t;
is_no_escape_block_arg : bool;
is_pointer_to_const : bool;
name : IR.Mangled.t;
typ : IR.Typ.t;
}
type t = {
name : IR.Procname.t;
access : ATDGenerated.Clang_ast_t.access_specifier;
class_param : param_type option;
params : param_type list;
ret_type : IR.Typ.t * IR.Annot.Item.t;
has_added_return_param : bool;
is_ret_type_pod : bool;
attributes : ATDGenerated.Clang_ast_t.attribute list;
loc : ATDGenerated.Clang_ast_t.source_range;
method_kind : IR.ClangMethodKind.t;
is_cpp_virtual : bool;
passed_as_noescape_block_to : IR.Procname.t option;
is_no_return : bool;
is_variadic : bool;
pointer_to_parent : ATDGenerated.Clang_ast_t.pointer option;
pointer_to_property_opt : ATDGenerated.Clang_ast_t.pointer option;
return_param_typ : IR.Typ.t option;
}
val is_getter : t -> bool
val is_setter : t -> bool
val mk : IR.Procname.t -> param_type option -> param_type list -> (IR.Typ.t * IR.Annot.Item.t) -> ?⁠has_added_return_param:bool -> ?⁠is_ret_type_pod:bool -> ATDGenerated.Clang_ast_t.attribute list -> ATDGenerated.Clang_ast_t.source_range -> IR.ClangMethodKind.t -> ?⁠is_cpp_virtual:bool -> ?⁠passed_as_noescape_block_to:IR.Procname.t option -> ?⁠is_no_return:bool -> ?⁠is_variadic:bool -> ATDGenerated.Clang_ast_t.pointer option -> ATDGenerated.Clang_ast_t.pointer option -> IR.Typ.t option -> ATDGenerated.Clang_ast_t.access_specifier -> t
val pp : Stdlib.Format.formatter -> t -> unit
val mk_param_type : ?⁠is_pointer_to_const:bool -> ?⁠annot:IR.Annot.Item.t -> ?⁠is_no_escape_block_arg:bool -> IR.Mangled.t -> IR.Typ.t -> param_type
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ClangFrontend__CGeneral_utils/index.html b/website/static/odoc/next/infer/ClangFrontend__CGeneral_utils/index.html index f36483cba..41d621624 100644 --- a/website/static/odoc/next/infer/ClangFrontend__CGeneral_utils/index.html +++ b/website/static/odoc/next/infer/ClangFrontend__CGeneral_utils/index.html @@ -1,2 +1,2 @@ -ClangFrontend__CGeneral_utils (infer.ClangFrontend__CGeneral_utils)

Module ClangFrontend__CGeneral_utils

type var_info = ATDGenerated.Clang_ast_t.decl_info * ATDGenerated.Clang_ast_t.qual_type * ATDGenerated.Clang_ast_t.var_decl_info * bool
val add_no_duplicates_fields : IR.Struct.field -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_fields : IR.Struct.field list -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_methods : IR.Procname.t list -> IR.Procname.t list -> IR.Procname.t list
val swap_elements_list : 'a list -> 'a list
val list_range : int -> int -> int list
val mk_class_field_name : IR.Typ.Name.t -> string -> IR.Fieldname.t
val get_var_name_mangled : ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> string * IR.Mangled.t
val mk_sil_global_var : ClangFrontend.CFrontend_config.translation_unit_context -> ?⁠mk_name:(string -> IR.Mangled.t -> IR.Mangled.t) -> ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> ATDGenerated.Clang_ast_t.qual_type -> IR.Pvar.t
val mk_sil_var : ClangFrontend.CFrontend_config.translation_unit_context -> ATDGenerated.Clang_ast_t.named_decl_info -> var_info option -> IR.Procname.t -> IR.Procname.t -> IR.Pvar.t
val is_cpp_translation : ClangFrontend.CFrontend_config.translation_unit_context -> bool

true if the current language is C++ or ObjC++

val is_objc_extension : ClangFrontend.CFrontend_config.translation_unit_context -> bool

true if the current language is ObjC or ObjC++

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

Module ClangFrontend__CGeneral_utils

type var_info = ATDGenerated.Clang_ast_t.decl_info * ATDGenerated.Clang_ast_t.qual_type * ATDGenerated.Clang_ast_t.var_decl_info * bool
val add_no_duplicates_fields : IR.Struct.field -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_fields : IR.Struct.field list -> IR.Struct.field list -> IR.Struct.field list
val append_no_duplicates_methods : IR.Procname.t list -> IR.Procname.t list -> IR.Procname.t list
val swap_elements_list : 'a list -> 'a list
val list_range : int -> int -> int list
val mk_class_field_name : IR.Typ.Name.t -> string -> IR.Fieldname.t
val get_var_name_mangled : ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> string * IR.Mangled.t
val mk_sil_global_var : ClangFrontend.CFrontend_config.translation_unit_context -> ?⁠mk_name:(string -> IR.Mangled.t -> IR.Mangled.t) -> ATDGenerated.Clang_ast_t.decl_info -> ATDGenerated.Clang_ast_t.named_decl_info -> ATDGenerated.Clang_ast_t.var_decl_info -> ATDGenerated.Clang_ast_t.qual_type -> IR.Pvar.t
val mk_sil_var : ClangFrontend.CFrontend_config.translation_unit_context -> ATDGenerated.Clang_ast_t.named_decl_info -> var_info option -> IR.Procname.t -> IR.Procname.t -> IR.Pvar.t
val is_cpp_translation : ClangFrontend.CFrontend_config.translation_unit_context -> bool

true if the current language is C++ or ObjC++

val is_objc_extension : ClangFrontend.CFrontend_config.translation_unit_context -> bool

true if the current language is ObjC or ObjC++

val is_type_pod : ATDGenerated.Clang_ast_t.qual_type -> bool
\ No newline at end of file diff --git a/website/static/odoc/next/infer/ClangFrontend__CMethodSignature/index.html b/website/static/odoc/next/infer/ClangFrontend__CMethodSignature/index.html index 9f0c93977..bde4f72cc 100644 --- a/website/static/odoc/next/infer/ClangFrontend__CMethodSignature/index.html +++ b/website/static/odoc/next/infer/ClangFrontend__CMethodSignature/index.html @@ -1,2 +1,2 @@ -ClangFrontend__CMethodSignature (infer.ClangFrontend__CMethodSignature)

Module ClangFrontend__CMethodSignature

type param_type = {
annot : IR.Annot.Item.t;
is_no_escape_block_arg : bool;
is_pointer_to_const : bool;
name : IR.Mangled.t;
typ : IR.Typ.t;
}
type t = {
name : IR.Procname.t;
access : ATDGenerated.Clang_ast_t.access_specifier;
class_param : param_type option;
params : param_type list;
ret_type : IR.Typ.t * IR.Annot.Item.t;
has_added_return_param : bool;
attributes : ATDGenerated.Clang_ast_t.attribute list;
loc : ATDGenerated.Clang_ast_t.source_range;
method_kind : IR.ClangMethodKind.t;
is_cpp_virtual : bool;
passed_as_noescape_block_to : IR.Procname.t option;
is_no_return : bool;
is_variadic : bool;
pointer_to_parent : ATDGenerated.Clang_ast_t.pointer option;
pointer_to_property_opt : ATDGenerated.Clang_ast_t.pointer option;
return_param_typ : IR.Typ.t option;
}
val is_getter : t -> bool
val is_setter : t -> bool
val mk : IR.Procname.t -> param_type option -> param_type list -> (IR.Typ.t * IR.Annot.Item.t) -> ?⁠has_added_return_param:bool -> ATDGenerated.Clang_ast_t.attribute list -> ATDGenerated.Clang_ast_t.source_range -> IR.ClangMethodKind.t -> ?⁠is_cpp_virtual:bool -> ?⁠passed_as_noescape_block_to:IR.Procname.t option -> ?⁠is_no_return:bool -> ?⁠is_variadic:bool -> ATDGenerated.Clang_ast_t.pointer option -> ATDGenerated.Clang_ast_t.pointer option -> IR.Typ.t option -> ATDGenerated.Clang_ast_t.access_specifier -> t
val pp : Stdlib.Format.formatter -> t -> unit
val mk_param_type : ?⁠is_pointer_to_const:bool -> ?⁠annot:IR.Annot.Item.t -> ?⁠is_no_escape_block_arg:bool -> IR.Mangled.t -> IR.Typ.t -> param_type
\ No newline at end of file +ClangFrontend__CMethodSignature (infer.ClangFrontend__CMethodSignature)

Module ClangFrontend__CMethodSignature

type param_type = {
annot : IR.Annot.Item.t;
is_no_escape_block_arg : bool;
is_pointer_to_const : bool;
name : IR.Mangled.t;
typ : IR.Typ.t;
}
type t = {
name : IR.Procname.t;
access : ATDGenerated.Clang_ast_t.access_specifier;
class_param : param_type option;
params : param_type list;
ret_type : IR.Typ.t * IR.Annot.Item.t;
has_added_return_param : bool;
is_ret_type_pod : bool;
attributes : ATDGenerated.Clang_ast_t.attribute list;
loc : ATDGenerated.Clang_ast_t.source_range;
method_kind : IR.ClangMethodKind.t;
is_cpp_virtual : bool;
passed_as_noescape_block_to : IR.Procname.t option;
is_no_return : bool;
is_variadic : bool;
pointer_to_parent : ATDGenerated.Clang_ast_t.pointer option;
pointer_to_property_opt : ATDGenerated.Clang_ast_t.pointer option;
return_param_typ : IR.Typ.t option;
}
val is_getter : t -> bool
val is_setter : t -> bool
val mk : IR.Procname.t -> param_type option -> param_type list -> (IR.Typ.t * IR.Annot.Item.t) -> ?⁠has_added_return_param:bool -> ?⁠is_ret_type_pod:bool -> ATDGenerated.Clang_ast_t.attribute list -> ATDGenerated.Clang_ast_t.source_range -> IR.ClangMethodKind.t -> ?⁠is_cpp_virtual:bool -> ?⁠passed_as_noescape_block_to:IR.Procname.t option -> ?⁠is_no_return:bool -> ?⁠is_variadic:bool -> ATDGenerated.Clang_ast_t.pointer option -> ATDGenerated.Clang_ast_t.pointer option -> IR.Typ.t option -> ATDGenerated.Clang_ast_t.access_specifier -> t
val pp : Stdlib.Format.formatter -> t -> unit
val mk_param_type : ?⁠is_pointer_to_const:bool -> ?⁠annot:IR.Annot.Item.t -> ?⁠is_no_escape_block_arg:bool -> IR.Mangled.t -> IR.Typ.t -> param_type
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency/StarvationDomain/Event/index.html b/website/static/odoc/next/infer/Concurrency/StarvationDomain/Event/index.html index 41a442560..54ce4ce07 100644 --- a/website/static/odoc/next/infer/Concurrency/StarvationDomain/Event/index.html +++ b/website/static/odoc/next/infer/Concurrency/StarvationDomain/Event/index.html @@ -1,2 +1,2 @@ -Event (infer.Concurrency.StarvationDomain.Event)

Module StarvationDomain.Event

type t =
| LockAcquire of {
locks : Lock.t list;
thread : ThreadDomain.t;
}
| MayBlock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| MonitorWait of {
lock : Lock.t;
thread : ThreadDomain.t;
}
| MustNotOccurUnderLock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| StrictModeCall of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
val compare : t -> t -> int
val describe : F.formatter -> t -> unit
val get_acquired_locks : t -> Lock.t list
\ No newline at end of file +Event (infer.Concurrency.StarvationDomain.Event)

Module StarvationDomain.Event

type t =
| Ipc of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| LockAcquire of {
locks : Lock.t list;
thread : ThreadDomain.t;
}
| MayBlock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| MonitorWait of {
lock : Lock.t;
thread : ThreadDomain.t;
}
| MustNotOccurUnderLock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| StrictModeCall of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
val compare : t -> t -> int
val describe : F.formatter -> t -> unit
val get_acquired_locks : t -> Lock.t list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency/StarvationDomain/index.html b/website/static/odoc/next/infer/Concurrency/StarvationDomain/index.html index d9de8b1bd..55b650224 100644 --- a/website/static/odoc/next/infer/Concurrency/StarvationDomain/index.html +++ b/website/static/odoc/next/infer/Concurrency/StarvationDomain/index.html @@ -1,2 +1,2 @@ -StarvationDomain (infer.Concurrency.StarvationDomain)

Module Concurrency.StarvationDomain

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

Domain for thread-type. The main goals are

module Lock : sig ... end

Abstract address for a lock. There are two notions of equality:

module VarDomain : sig ... end
module Event : sig ... end
module Acquisition : sig ... end

a lock acquisition with location information

module Acquisitions : sig ... end

A set of lock acquisitions with source locations and procnames.

module CriticalPairElement : sig ... end

An event and the currently-held locks at the time it occurred.

module CriticalPair : sig ... end

A CriticalPairElement equipped with a call stack. The intuition is that if we have a critical pair `(locks, event)` in the summary of a method then there is a trace of that method where `event` occurs, and right before it occurs the locks held are exactly `locks` (no over/under approximation). We call it "critical" because the information here alone determines deadlock conditions.

module CriticalPairs : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = CriticalPair.t
module Attribute : sig ... end

Tracks expression attributes

module AttributeDomain : sig ... end

Tracks all expressions assigned values of Attribute

module ScheduledWorkItem : sig ... end

A record of scheduled parallel work: the method scheduled to run, where, and on what thread.

module ScheduledWorkDomain : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = ScheduledWorkItem.t
type t = {
ignore_blocking_calls : bool;
guard_map : GuardToLockMap.t;
lock_state : LockState.t;
critical_pairs : CriticalPairs.t;
attributes : AttributeDomain.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
var_state : VarDomain.t;
}
include Absint.AbstractDomain.S with type t := t
include Absint.AbstractDomain.NoJoin
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

val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val initial : t

initial domain state

val acquire : tenv:IR.Tenv.t -> t -> procname:IR.Procname.t -> loc:IBase.Location.t -> Lock.t list -> t

simultaneously acquire a number of locks, no-op if list is empty

val release : t -> Lock.t list -> t

simultaneously release a number of locks, no-op if list is empty

val blocking_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val wait_on_monitor : loc:IBase.Location.t -> Absint.FormalMap.t -> Absint.HilExp.t list -> t -> t
val future_get : callee:IR.Procname.t -> loc:IBase.Location.t -> Absint.HilExp.t list -> t -> t
val strict_mode_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val arbitrary_code_execution : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val add_guard : acquire_now:bool -> procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> Lock.t -> t

Install a mapping from the guard expression to the lock provided, and optionally lock it.

val lock_guard : procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> t

Acquire the lock the guard was constructed with.

val remove_guard : t -> Absint.HilExp.t -> t

Destroy the guard and release its lock.

val unlock_guard : t -> Absint.HilExp.t -> t

Release the lock the guard was constructed with.

val schedule_work : IBase.Location.t -> StarvationModels.scheduler_thread_constraint -> t -> IR.Procname.t -> t

record the fact that a method is scheduled to run on a certain thread/executor

type summary = {
critical_pairs : CriticalPairs.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
attributes : AttributeDomain.t;

final-state attributes that affect instance variables only

return_attribute : Attribute.t;
}
val empty_summary : summary
val pp_summary : F.formatter -> summary -> unit
val integrate_summary : tenv:IR.Tenv.t -> lhs:Absint.HilExp.AccessExpression.t -> subst:Lock.subst -> Absint.CallSite.t -> t -> summary -> t

apply a callee summary to the current abstract state; lhs is the expression assigned the returned value, if any

val summary_of_astate : IR.Procdesc.t -> t -> summary
val set_ignore_blocking_calls_flag : t -> t
val remove_dead_vars : t -> IR.Var.t list -> t
val fold_critical_pairs_of_summary : (CriticalPair.t -> 'a -> 'a) -> summary -> 'a -> 'a
\ No newline at end of file +StarvationDomain (infer.Concurrency.StarvationDomain)

Module Concurrency.StarvationDomain

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

Domain for thread-type. The main goals are

module Lock : sig ... end

Abstract address for a lock. There are two notions of equality:

module VarDomain : sig ... end
module Event : sig ... end
module Acquisition : sig ... end

a lock acquisition with location information

module Acquisitions : sig ... end

A set of lock acquisitions with source locations and procnames.

module CriticalPairElement : sig ... end

An event and the currently-held locks at the time it occurred.

module CriticalPair : sig ... end

A CriticalPairElement equipped with a call stack. The intuition is that if we have a critical pair `(locks, event)` in the summary of a method then there is a trace of that method where `event` occurs, and right before it occurs the locks held are exactly `locks` (no over/under approximation). We call it "critical" because the information here alone determines deadlock conditions.

module CriticalPairs : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = CriticalPair.t
module Attribute : sig ... end

Tracks expression attributes

module AttributeDomain : sig ... end

Tracks all expressions assigned values of Attribute

module ScheduledWorkItem : sig ... end

A record of scheduled parallel work: the method scheduled to run, where, and on what thread.

module ScheduledWorkDomain : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = ScheduledWorkItem.t
type t = {
ignore_blocking_calls : bool;
guard_map : GuardToLockMap.t;
lock_state : LockState.t;
critical_pairs : CriticalPairs.t;
attributes : AttributeDomain.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
var_state : VarDomain.t;
}
include Absint.AbstractDomain.S with type t := t
include Absint.AbstractDomain.NoJoin
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

val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val initial : t

initial domain state

val acquire : tenv:IR.Tenv.t -> t -> procname:IR.Procname.t -> loc:IBase.Location.t -> Lock.t list -> t

simultaneously acquire a number of locks, no-op if list is empty

val release : t -> Lock.t list -> t

simultaneously release a number of locks, no-op if list is empty

val blocking_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val ipc : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val wait_on_monitor : loc:IBase.Location.t -> Absint.FormalMap.t -> Absint.HilExp.t list -> t -> t
val future_get : callee:IR.Procname.t -> loc:IBase.Location.t -> Absint.HilExp.t list -> t -> t
val strict_mode_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val arbitrary_code_execution : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val add_guard : acquire_now:bool -> procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> Lock.t -> t

Install a mapping from the guard expression to the lock provided, and optionally lock it.

val lock_guard : procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> t

Acquire the lock the guard was constructed with.

val remove_guard : t -> Absint.HilExp.t -> t

Destroy the guard and release its lock.

val unlock_guard : t -> Absint.HilExp.t -> t

Release the lock the guard was constructed with.

val schedule_work : IBase.Location.t -> StarvationModels.scheduler_thread_constraint -> t -> IR.Procname.t -> t

record the fact that a method is scheduled to run on a certain thread/executor

type summary = {
critical_pairs : CriticalPairs.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
attributes : AttributeDomain.t;

final-state attributes that affect instance variables only

return_attribute : Attribute.t;
}
val empty_summary : summary
val pp_summary : F.formatter -> summary -> unit
val integrate_summary : tenv:IR.Tenv.t -> lhs:Absint.HilExp.AccessExpression.t -> subst:Lock.subst -> Absint.CallSite.t -> t -> summary -> t

apply a callee summary to the current abstract state; lhs is the expression assigned the returned value, if any

val summary_of_astate : IR.Procdesc.t -> t -> summary
val set_ignore_blocking_calls_flag : t -> t
val remove_dead_vars : t -> IR.Var.t list -> t
val fold_critical_pairs_of_summary : (CriticalPair.t -> 'a -> 'a) -> summary -> 'a -> 'a
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency/StarvationModels/index.html b/website/static/odoc/next/infer/Concurrency/StarvationModels/index.html index 345c1cf44..da7dc69cb 100644 --- a/website/static/odoc/next/infer/Concurrency/StarvationModels/index.html +++ b/website/static/odoc/next/infer/Concurrency/StarvationModels/index.html @@ -1,2 +1,2 @@ -StarvationModels (infer.Concurrency.StarvationModels)

Module Concurrency.StarvationModels

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

is the method call potentially blocking, given the actuals passed?

val is_strict_mode_violation : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_monitor_wait : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_synchronized_library_call : IR.Tenv.t -> IR.Procname.t -> bool

does the method call lock-then-unlock the underlying object? legacy Java containers like Vector do this, and can interact with explicit locking

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

should we treat a method call as skip (eg library methods in guava) to avoid FPs?

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

is procedure transitively annotated @Nonblocking

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

is procedure transitively annotated @Lockless

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

call known to schedule runnable first argument to some executor/handler or subclass

type scheduler_thread_constraint =
| ForUIThread
| ForNonUIThread
| ForUnknownThread

an instance field holding a reference to an executor may be annotated as running on UI/non-UI thread

val equal_scheduler_thread_constraint : scheduler_thread_constraint -> scheduler_thread_constraint -> bool
val get_executor_thread_annotation_constraint : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> scheduler_thread_constraint option

given an executor receiver, get its thread constraint, if any. None means lookup somehow failed, whereas Some UnknownThread means the receiver is an unannotated executor.

val get_run_method_from_runnable : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> IR.Procname.t option

given a receiver, find the run() method in the appropriate class

val get_returned_executor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> scheduler_thread_constraint option

does the function return an executor and of which thread?

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

method call known to directly schedule the runnable object provided as first procedure argument on the UI thread

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

method call known to directly schedule the runnable object provided as second procedure argument on a background thread

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

method call known to directly the runnable object provided as first procedure argument on a background thread

val is_getMainLooper : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_handler_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_thread_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_get : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_is_done : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_assume_true : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool

is the callee equivalent to assuming its first argument true

val is_java_main_method : IR.Procname.t -> bool

does the method look like a Java main

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

for example com.google.common.util.concurrent.SettableFuture.set

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

Module Concurrency.StarvationModels

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

is the method call potentially blocking, given the actuals passed?

val may_do_ipc : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_strict_mode_violation : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_monitor_wait : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_synchronized_library_call : IR.Tenv.t -> IR.Procname.t -> bool

does the method call lock-then-unlock the underlying object? legacy Java containers like Vector do this, and can interact with explicit locking

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

should we treat a method call as skip (eg library methods in guava) to avoid FPs?

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

is procedure transitively annotated @Nonblocking

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

is procedure transitively annotated @Lockless

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

call known to schedule runnable first argument to some executor/handler or subclass

type scheduler_thread_constraint =
| ForUIThread
| ForNonUIThread
| ForUnknownThread

an instance field holding a reference to an executor may be annotated as running on UI/non-UI thread

val equal_scheduler_thread_constraint : scheduler_thread_constraint -> scheduler_thread_constraint -> bool
val get_executor_thread_annotation_constraint : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> scheduler_thread_constraint option

given an executor receiver, get its thread constraint, if any. None means lookup somehow failed, whereas Some UnknownThread means the receiver is an unannotated executor.

val get_run_method_from_runnable : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> IR.Procname.t option

given a receiver, find the run() method in the appropriate class

val get_returned_executor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> scheduler_thread_constraint option

does the function return an executor and of which thread?

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

method call known to directly schedule the runnable object provided as first procedure argument on the UI thread

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

method call known to directly schedule the runnable object provided as second procedure argument on a background thread

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

method call known to directly the runnable object provided as first procedure argument on a background thread

val is_getMainLooper : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_handler_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_thread_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_get : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_is_done : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_assume_true : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool

is the callee equivalent to assuming its first argument true

val is_java_main_method : IR.Procname.t -> bool

does the method look like a Java main

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

for example com.google.common.util.concurrent.SettableFuture.set

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency__StarvationDomain/Event/index.html b/website/static/odoc/next/infer/Concurrency__StarvationDomain/Event/index.html index e22ed1323..a8d76eb7c 100644 --- a/website/static/odoc/next/infer/Concurrency__StarvationDomain/Event/index.html +++ b/website/static/odoc/next/infer/Concurrency__StarvationDomain/Event/index.html @@ -1,2 +1,2 @@ -Event (infer.Concurrency__StarvationDomain.Event)

Module Concurrency__StarvationDomain.Event

type t =
| LockAcquire of {
locks : Lock.t list;
thread : ThreadDomain.t;
}
| MayBlock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| MonitorWait of {
lock : Lock.t;
thread : ThreadDomain.t;
}
| MustNotOccurUnderLock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| StrictModeCall of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
val compare : t -> t -> int
val describe : F.formatter -> t -> unit
val get_acquired_locks : t -> Lock.t list
\ No newline at end of file +Event (infer.Concurrency__StarvationDomain.Event)

Module Concurrency__StarvationDomain.Event

type t =
| Ipc of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| LockAcquire of {
locks : Lock.t list;
thread : ThreadDomain.t;
}
| MayBlock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| MonitorWait of {
lock : Lock.t;
thread : ThreadDomain.t;
}
| MustNotOccurUnderLock of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
| StrictModeCall of {
callee : IR.Procname.t;
thread : ThreadDomain.t;
}
val compare : t -> t -> int
val describe : F.formatter -> t -> unit
val get_acquired_locks : t -> Lock.t list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency__StarvationDomain/index.html b/website/static/odoc/next/infer/Concurrency__StarvationDomain/index.html index b0699a77c..040bfcaa2 100644 --- a/website/static/odoc/next/infer/Concurrency__StarvationDomain/index.html +++ b/website/static/odoc/next/infer/Concurrency__StarvationDomain/index.html @@ -1,2 +1,2 @@ -Concurrency__StarvationDomain (infer.Concurrency__StarvationDomain)

Module Concurrency__StarvationDomain

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

Domain for thread-type. The main goals are

module Lock : sig ... end

Abstract address for a lock. There are two notions of equality:

module VarDomain : sig ... end
module Event : sig ... end
module Acquisition : sig ... end

a lock acquisition with location information

module Acquisitions : sig ... end

A set of lock acquisitions with source locations and procnames.

module CriticalPairElement : sig ... end

An event and the currently-held locks at the time it occurred.

module CriticalPair : sig ... end

A CriticalPairElement equipped with a call stack. The intuition is that if we have a critical pair `(locks, event)` in the summary of a method then there is a trace of that method where `event` occurs, and right before it occurs the locks held are exactly `locks` (no over/under approximation). We call it "critical" because the information here alone determines deadlock conditions.

module CriticalPairs : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = CriticalPair.t
module Attribute : sig ... end

Tracks expression attributes

module AttributeDomain : sig ... end

Tracks all expressions assigned values of Attribute

module ScheduledWorkItem : sig ... end

A record of scheduled parallel work: the method scheduled to run, where, and on what thread.

module ScheduledWorkDomain : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = ScheduledWorkItem.t
type t = {
ignore_blocking_calls : bool;
guard_map : GuardToLockMap.t;
lock_state : LockState.t;
critical_pairs : CriticalPairs.t;
attributes : AttributeDomain.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
var_state : VarDomain.t;
}
include Absint.AbstractDomain.S with type t := t
include Absint.AbstractDomain.NoJoin
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

val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val initial : t

initial domain state

val acquire : tenv:IR.Tenv.t -> t -> procname:IR.Procname.t -> loc:IBase.Location.t -> Lock.t list -> t

simultaneously acquire a number of locks, no-op if list is empty

val release : t -> Lock.t list -> t

simultaneously release a number of locks, no-op if list is empty

val blocking_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val wait_on_monitor : loc:IBase.Location.t -> Absint.FormalMap.t -> Absint.HilExp.t list -> t -> t
val future_get : callee:IR.Procname.t -> loc:IBase.Location.t -> Absint.HilExp.t list -> t -> t
val strict_mode_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val arbitrary_code_execution : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val add_guard : acquire_now:bool -> procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> Lock.t -> t

Install a mapping from the guard expression to the lock provided, and optionally lock it.

val lock_guard : procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> t

Acquire the lock the guard was constructed with.

val remove_guard : t -> Absint.HilExp.t -> t

Destroy the guard and release its lock.

val unlock_guard : t -> Absint.HilExp.t -> t

Release the lock the guard was constructed with.

val schedule_work : IBase.Location.t -> Concurrency.StarvationModels.scheduler_thread_constraint -> t -> IR.Procname.t -> t

record the fact that a method is scheduled to run on a certain thread/executor

type summary = {
critical_pairs : CriticalPairs.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
attributes : AttributeDomain.t;

final-state attributes that affect instance variables only

return_attribute : Attribute.t;
}
val empty_summary : summary
val pp_summary : F.formatter -> summary -> unit
val integrate_summary : tenv:IR.Tenv.t -> lhs:Absint.HilExp.AccessExpression.t -> subst:Lock.subst -> Absint.CallSite.t -> t -> summary -> t

apply a callee summary to the current abstract state; lhs is the expression assigned the returned value, if any

val summary_of_astate : IR.Procdesc.t -> t -> summary
val set_ignore_blocking_calls_flag : t -> t
val remove_dead_vars : t -> IR.Var.t list -> t
val fold_critical_pairs_of_summary : (CriticalPair.t -> 'a -> 'a) -> summary -> 'a -> 'a
\ No newline at end of file +Concurrency__StarvationDomain (infer.Concurrency__StarvationDomain)

Module Concurrency__StarvationDomain

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

Domain for thread-type. The main goals are

module Lock : sig ... end

Abstract address for a lock. There are two notions of equality:

module VarDomain : sig ... end
module Event : sig ... end
module Acquisition : sig ... end

a lock acquisition with location information

module Acquisitions : sig ... end

A set of lock acquisitions with source locations and procnames.

module CriticalPairElement : sig ... end

An event and the currently-held locks at the time it occurred.

module CriticalPair : sig ... end

A CriticalPairElement equipped with a call stack. The intuition is that if we have a critical pair `(locks, event)` in the summary of a method then there is a trace of that method where `event` occurs, and right before it occurs the locks held are exactly `locks` (no over/under approximation). We call it "critical" because the information here alone determines deadlock conditions.

module CriticalPairs : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = CriticalPair.t
module Attribute : sig ... end

Tracks expression attributes

module AttributeDomain : sig ... end

Tracks all expressions assigned values of Attribute

module ScheduledWorkItem : sig ... end

A record of scheduled parallel work: the method scheduled to run, where, and on what thread.

module ScheduledWorkDomain : Absint.AbstractDomain.FiniteSetS with type FiniteSetS.elt = ScheduledWorkItem.t
type t = {
ignore_blocking_calls : bool;
guard_map : GuardToLockMap.t;
lock_state : LockState.t;
critical_pairs : CriticalPairs.t;
attributes : AttributeDomain.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
var_state : VarDomain.t;
}
include Absint.AbstractDomain.S with type t := t
include Absint.AbstractDomain.NoJoin
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

val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val initial : t

initial domain state

val acquire : tenv:IR.Tenv.t -> t -> procname:IR.Procname.t -> loc:IBase.Location.t -> Lock.t list -> t

simultaneously acquire a number of locks, no-op if list is empty

val release : t -> Lock.t list -> t

simultaneously release a number of locks, no-op if list is empty

val blocking_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val ipc : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val wait_on_monitor : loc:IBase.Location.t -> Absint.FormalMap.t -> Absint.HilExp.t list -> t -> t
val future_get : callee:IR.Procname.t -> loc:IBase.Location.t -> Absint.HilExp.t list -> t -> t
val strict_mode_call : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val arbitrary_code_execution : callee:IR.Procname.t -> loc:IBase.Location.t -> t -> t
val add_guard : acquire_now:bool -> procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> Lock.t -> t

Install a mapping from the guard expression to the lock provided, and optionally lock it.

val lock_guard : procname:IR.Procname.t -> loc:IBase.Location.t -> IR.Tenv.t -> t -> Absint.HilExp.t -> t

Acquire the lock the guard was constructed with.

val remove_guard : t -> Absint.HilExp.t -> t

Destroy the guard and release its lock.

val unlock_guard : t -> Absint.HilExp.t -> t

Release the lock the guard was constructed with.

val schedule_work : IBase.Location.t -> Concurrency.StarvationModels.scheduler_thread_constraint -> t -> IR.Procname.t -> t

record the fact that a method is scheduled to run on a certain thread/executor

type summary = {
critical_pairs : CriticalPairs.t;
thread : ThreadDomain.t;
scheduled_work : ScheduledWorkDomain.t;
attributes : AttributeDomain.t;

final-state attributes that affect instance variables only

return_attribute : Attribute.t;
}
val empty_summary : summary
val pp_summary : F.formatter -> summary -> unit
val integrate_summary : tenv:IR.Tenv.t -> lhs:Absint.HilExp.AccessExpression.t -> subst:Lock.subst -> Absint.CallSite.t -> t -> summary -> t

apply a callee summary to the current abstract state; lhs is the expression assigned the returned value, if any

val summary_of_astate : IR.Procdesc.t -> t -> summary
val set_ignore_blocking_calls_flag : t -> t
val remove_dead_vars : t -> IR.Var.t list -> t
val fold_critical_pairs_of_summary : (CriticalPair.t -> 'a -> 'a) -> summary -> 'a -> 'a
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Concurrency__StarvationModels/index.html b/website/static/odoc/next/infer/Concurrency__StarvationModels/index.html index a7ae456e5..42fa44a2a 100644 --- a/website/static/odoc/next/infer/Concurrency__StarvationModels/index.html +++ b/website/static/odoc/next/infer/Concurrency__StarvationModels/index.html @@ -1,2 +1,2 @@ -Concurrency__StarvationModels (infer.Concurrency__StarvationModels)

Module Concurrency__StarvationModels

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

is the method call potentially blocking, given the actuals passed?

val is_strict_mode_violation : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_monitor_wait : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_synchronized_library_call : IR.Tenv.t -> IR.Procname.t -> bool

does the method call lock-then-unlock the underlying object? legacy Java containers like Vector do this, and can interact with explicit locking

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

should we treat a method call as skip (eg library methods in guava) to avoid FPs?

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

is procedure transitively annotated @Nonblocking

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

is procedure transitively annotated @Lockless

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

call known to schedule runnable first argument to some executor/handler or subclass

type scheduler_thread_constraint =
| ForUIThread
| ForNonUIThread
| ForUnknownThread

an instance field holding a reference to an executor may be annotated as running on UI/non-UI thread

val equal_scheduler_thread_constraint : scheduler_thread_constraint -> scheduler_thread_constraint -> bool
val get_executor_thread_annotation_constraint : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> scheduler_thread_constraint option

given an executor receiver, get its thread constraint, if any. None means lookup somehow failed, whereas Some UnknownThread means the receiver is an unannotated executor.

val get_run_method_from_runnable : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> IR.Procname.t option

given a receiver, find the run() method in the appropriate class

val get_returned_executor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> scheduler_thread_constraint option

does the function return an executor and of which thread?

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

method call known to directly schedule the runnable object provided as first procedure argument on the UI thread

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

method call known to directly schedule the runnable object provided as second procedure argument on a background thread

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

method call known to directly the runnable object provided as first procedure argument on a background thread

val is_getMainLooper : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_handler_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_thread_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_get : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_is_done : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_assume_true : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool

is the callee equivalent to assuming its first argument true

val is_java_main_method : IR.Procname.t -> bool

does the method look like a Java main

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

for example com.google.common.util.concurrent.SettableFuture.set

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

Module Concurrency__StarvationModels

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

is the method call potentially blocking, given the actuals passed?

val may_do_ipc : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_strict_mode_violation : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_monitor_wait : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_synchronized_library_call : IR.Tenv.t -> IR.Procname.t -> bool

does the method call lock-then-unlock the underlying object? legacy Java containers like Vector do this, and can interact with explicit locking

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

should we treat a method call as skip (eg library methods in guava) to avoid FPs?

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

is procedure transitively annotated @Nonblocking

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

is procedure transitively annotated @Lockless

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

call known to schedule runnable first argument to some executor/handler or subclass

type scheduler_thread_constraint =
| ForUIThread
| ForNonUIThread
| ForUnknownThread

an instance field holding a reference to an executor may be annotated as running on UI/non-UI thread

val equal_scheduler_thread_constraint : scheduler_thread_constraint -> scheduler_thread_constraint -> bool
val get_executor_thread_annotation_constraint : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> scheduler_thread_constraint option

given an executor receiver, get its thread constraint, if any. None means lookup somehow failed, whereas Some UnknownThread means the receiver is an unannotated executor.

val get_run_method_from_runnable : IR.Tenv.t -> Absint.HilExp.AccessExpression.t -> IR.Procname.t option

given a receiver, find the run() method in the appropriate class

val get_returned_executor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> scheduler_thread_constraint option

does the function return an executor and of which thread?

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

method call known to directly schedule the runnable object provided as first procedure argument on the UI thread

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

method call known to directly schedule the runnable object provided as second procedure argument on a background thread

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

method call known to directly the runnable object provided as first procedure argument on a background thread

val is_getMainLooper : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_handler_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_thread_constructor : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_get : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_future_is_done : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool
val is_assume_true : IR.Tenv.t -> IR.Procname.t -> Absint.HilExp.t list -> bool

is the callee equivalent to assuming its first argument true

val is_java_main_method : IR.Procname.t -> bool

does the method look like a Java main

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

for example com.google.common.util.concurrent.SettableFuture.set

\ 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 4696d2a85..d5bf5f502 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
| 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 append_buck_flavors : string list
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 buck_java_flavor_suppress_config : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val classpath : string option
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 lib_dir : string
val load_average : float option
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val passthroughs : 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 pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val relative_path_backtrack : int
val report : bool
val report_custom_error : bool
val report_force_relative_path : bool
val report_immutable_modifications : bool
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val kotlin_source_extension : string
val sourcepath : string option
val sources : string list
val trace_absarray : bool
val unsafe_unret : string
val incremental_analysis : bool
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 abs_struct : int
val abs_val : int
val allow_leak : bool
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val array_level : int
val biabduction_models_mode : 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_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 cfg_json : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
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_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 command : ATDGenerated.InferCommand.t
val config_impact_data_file : 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 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_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 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 iterations : int
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 join_cond : 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 max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val ml_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val modified_lines : string option
val monitor_prop_size : bool
val nelseg : bool
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 only_footprint : bool
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 clang_frontend_action_string : string
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_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : 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_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 report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
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 seconds_per_iteration : float option
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 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 symops_per_iteration : int option
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_error : bool
val trace_events : bool
val trace_join : bool
val trace_ondemand : bool
val trace_rearrange : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val type_size : bool
val uninit_interproc : bool
val unsafe_malloc : bool
val worklist_mode : int
val workspace : string option
val write_dotty : bool
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
| 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 append_buck_flavors : string list
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 buck_java_flavor_suppress_config : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val classpath : string option
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 lib_dir : string
val load_average : float option
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val passthroughs : 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 pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val relative_path_backtrack : int
val report : bool
val report_custom_error : bool
val report_force_relative_path : bool
val report_immutable_modifications : bool
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val kotlin_source_extension : string
val sourcepath : string option
val sources : string list
val trace_absarray : bool
val unsafe_unret : string
val incremental_analysis : bool
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 abs_struct : int
val abs_val : int
val allow_leak : bool
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val array_level : int
val biabduction_models_mode : 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_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 cfg_json : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
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_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 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 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 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 iterations : int
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 join_cond : 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 max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val ml_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val modified_lines : string option
val monitor_prop_size : bool
val nelseg : bool
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 only_footprint : bool
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 clang_frontend_action_string : string
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_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : 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_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 report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
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 seconds_per_iteration : float option
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 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 symops_per_iteration : int option
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_error : bool
val trace_events : bool
val trace_join : bool
val trace_ondemand : bool
val trace_rearrange : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val type_size : bool
val uninit_interproc : bool
val unsafe_malloc : bool
val worklist_mode : int
val workspace : string option
val write_dotty : bool
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/IssueType/index.html b/website/static/odoc/next/infer/IBase/IssueType/index.html index ad45c51fb..48a94a7aa 100644 --- a/website/static/odoc/next/infer/IBase/IssueType/index.html +++ b/website/static/odoc/next/infer/IBase/IssueType/index.html @@ -1,2 +1,2 @@ -IssueType (infer.IBase.IssueType)

Module IBase.IssueType

type visibility =
| User

always add to error log

| Developer

only add to error log in some debug modes

| Silent

never add to error log

visibility of the issue type

val compare_visibility : visibility -> visibility -> int
val equal_visibility : visibility -> visibility -> bool
val string_of_visibility : visibility -> string
type severity =
| Like
| Info
| Advice
| Warning
| Error

severity of the report

val compare_severity : severity -> severity -> int
val equal_severity : severity -> severity -> bool
val all_of_severity : severity list
val string_of_severity : severity -> string
type t = private {
unique_id : string;
checker : Checker.t;
visibility : visibility;
user_documentation : string option;
mutable default_severity : severity;

used for documentation but can be overriden at report time

mutable enabled : bool;
mutable hum : string;
mutable doc_url : string option;
mutable linters_def_file : string option;
}
val compare : t -> t -> int
val equal : t -> t -> bool
val all_issues : unit -> t list

all the issues declared so far

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

pretty print a localised string

val find_from_string : id:string -> t option

return the issue type if it was previously registered

val register_dynamic : ?⁠enabled:bool -> ?⁠hum:string -> ?⁠doc_url:string -> linters_def_file:string option -> id:string -> ?⁠user_documentation:string -> severity -> Checker.t -> t

Create a new issue and register it in the list of all issues. NOTE: if the issue with the same string id is already registered, overrides `hum`, `doc_url`, and `linters_def_file`, but DOES NOT override `enabled`. This trick allows to deal with disabling/enabling dynamic AL issues from the config, when we don't know all params yet. Thus, the human-readable description can be updated when we encounter the definition of the issue type, eg in AL.

val checker_can_report : Checker.t -> t -> bool

Whether the issue was registered as coming from the given checker. Important to call this before reporting to keep documentation accurate.

val set_enabled : t -> bool -> unit
val abduction_case_not_implemented : t
val arbitrary_code_execution_under_lock : t
val array_of_pointsto : t
val array_out_of_bounds_l1 : t
val array_out_of_bounds_l2 : t
val array_out_of_bounds_l3 : t
val assert_failure : t
val bad_footprint : t
val biabduction_analysis_stops : t
val buffer_overrun_l1 : t
val buffer_overrun_l2 : t
val buffer_overrun_l3 : t
val buffer_overrun_l4 : t
val buffer_overrun_l5 : t
val buffer_overrun_s2 : t
val buffer_overrun_u5 : t
val cannot_star : t
val captured_strong_self : t
val checkers_allocates_memory : t

Warning name when a performance critical method directly or indirectly calls a method allocating memory

val checkers_annotation_reachability_error : t
val checkers_calls_expensive_method : t

Warning name when a performance critical method directly or indirectly calls a method annotatd as expensive

val checkers_expensive_overrides_unexpensive : t

Warning name for the subtyping rule: method not annotated as expensive cannot be overridden by a method annotated as expensive

val checkers_fragment_retain_view : t
val checkers_immutable_cast : t
val checkers_printf_args : t
val class_cast_exception : t
val complexity_increase : kind:CostKind.t -> is_on_ui_thread:bool -> t
val component_with_multiple_factory_methods : t
val condition_always_false : t
val condition_always_true : t
val config_checks_between_markers : t
val config_impact_analysis : t
val constant_address_dereference : t
val create_intent_from_uri : t
val cross_site_scripting : t
val dangling_pointer_dereference : t
val dangling_pointer_dereference_maybe : t
val dead_store : t
val deadlock : t
val divide_by_zero : t
val do_not_report : t

an issue type that should never be reported

val empty_vector_access : t
val eradicate_annotation_graph : t
val eradicate_condition_redundant : t
val eradicate_field_not_initialized : t
val eradicate_field_not_nullable : t
val eradicate_field_over_annotated : t
val eradicate_inconsistent_subclass_parameter_annotation : t
val eradicate_inconsistent_subclass_return_annotation : t
val eradicate_redundant_nested_class_annotation : t
val eradicate_bad_nested_class_annotation : t
val eradicate_nullable_dereference : t
val eradicate_parameter_not_nullable : t
val eradicate_return_not_nullable : t
val eradicate_return_over_annotated : t
val eradicate_unvetted_third_party_in_nullsafe : t
val eradicate_unchecked_usage_in_nullsafe : t
val eradicate_meta_class_can_be_nullsafe : t
val eradicate_meta_class_needs_improvement : t
val eradicate_meta_class_is_nullsafe : t
val exposed_insecure_intent_handling : t
val expensive_cost_call : kind:CostKind.t -> t
val failure_exe : t
val field_not_null_checked : t
val guardedby_violation : t
val guardedby_violation_nullsafe : t
val impure_function : t
val inefficient_keyset_iterator : t
val inferbo_alloc_is_big : t
val inferbo_alloc_is_negative : t
val inferbo_alloc_is_zero : t
val inferbo_alloc_may_be_big : t
val inferbo_alloc_may_be_negative : t
val infinite_cost_call : kind:CostKind.t -> t
val inherently_dangerous_function : t
val insecure_intent_handling : t
val integer_overflow_l1 : t
val integer_overflow_l2 : t
val integer_overflow_l5 : t
val integer_overflow_u5 : t
val interface_not_thread_safe : t
val internal_error : t
val invariant_call : t
val javascript_injection : t
val lab_resource_leak : t
val dotnet_resource_leak : t
val leak_after_array_abstraction : t
val leak_in_footprint : t
val leak_unknown_origin : t
val lockless_violation : t
val lock_consistency_violation : t
val logging_private_data : t
val expensive_loop_invariant_call : t
val memory_leak : t
val missing_fld : t
val missing_required_prop : t
val mixed_self_weakself : t
val modifies_immutable : t
val multiple_weakself : t
val mutable_local_variable_in_component_file : t
val null_dereference : t
val nullptr_dereference : t
val optional_empty_access : t
val parameter_not_null_checked : t
val precondition_not_found : t
val precondition_not_met : t
val premature_nil_termination : t
val pulse_memory_leak : t
val pure_function : t
val quandary_taint_error : t
val resource_leak : t
val retain_cycle : t
val skip_function : t
val shell_injection : t
val shell_injection_risk : t
val sql_injection : t
val sql_injection_risk : t
val stack_variable_address_escape : t
val starvation : t
val static_initialization_order_fiasco : t
val strict_mode_violation : t
val strong_self_not_checked : t
val symexec_memory_error : t
val thread_safety_violation : t
val thread_safety_violation_nullsafe : t
val topl_biabd_error : t
val topl_pulse_error : t
val uninitialized_value : t
val uninitialized_value_pulse : t
val unreachable_code_after : t
val use_after_delete : t
val use_after_free : t
val use_after_lifetime : t
val untrusted_buffer_access : t
val untrusted_deserialization : t
val untrusted_deserialization_risk : t
val untrusted_file : t
val untrusted_file_risk : t
val untrusted_heap_allocation : t
val untrusted_intent_creation : t
val untrusted_url_risk : t
val untrusted_environment_change_risk : t
val untrusted_variable_length_array : t
val user_controlled_sql_risk : t
val vector_invalidation : t
val weak_self_in_noescape_block : t
val wrong_argument_number : t
val unreachable_cost_call : kind:CostKind.t -> t
val is_autoreleasepool_size_issue : t -> bool
\ No newline at end of file +IssueType (infer.IBase.IssueType)

Module IBase.IssueType

type visibility =
| User

always add to error log

| Developer

only add to error log in some debug modes

| Silent

never add to error log

visibility of the issue type

val compare_visibility : visibility -> visibility -> int
val equal_visibility : visibility -> visibility -> bool
val string_of_visibility : visibility -> string
type severity =
| Like
| Info
| Advice
| Warning
| Error

severity of the report

val compare_severity : severity -> severity -> int
val equal_severity : severity -> severity -> bool
val all_of_severity : severity list
val string_of_severity : severity -> string
type t = private {
unique_id : string;
checker : Checker.t;
visibility : visibility;
user_documentation : string option;
mutable default_severity : severity;

used for documentation but can be overriden at report time

mutable enabled : bool;
mutable hum : string;
mutable doc_url : string option;
mutable linters_def_file : string option;
}
val compare : t -> t -> int
val equal : t -> t -> bool
val all_issues : unit -> t list

all the issues declared so far

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

pretty print a localised string

val find_from_string : id:string -> t option

return the issue type if it was previously registered

val register_dynamic : ?⁠enabled:bool -> ?⁠hum:string -> ?⁠doc_url:string -> linters_def_file:string option -> id:string -> ?⁠user_documentation:string -> severity -> Checker.t -> t

Create a new issue and register it in the list of all issues. NOTE: if the issue with the same string id is already registered, overrides `hum`, `doc_url`, and `linters_def_file`, but DOES NOT override `enabled`. This trick allows to deal with disabling/enabling dynamic AL issues from the config, when we don't know all params yet. Thus, the human-readable description can be updated when we encounter the definition of the issue type, eg in AL.

val checker_can_report : Checker.t -> t -> bool

Whether the issue was registered as coming from the given checker. Important to call this before reporting to keep documentation accurate.

val set_enabled : t -> bool -> unit
val abduction_case_not_implemented : t
val arbitrary_code_execution_under_lock : t
val array_of_pointsto : t
val array_out_of_bounds_l1 : t
val array_out_of_bounds_l2 : t
val array_out_of_bounds_l3 : t
val assert_failure : t
val bad_footprint : t
val biabduction_analysis_stops : t
val buffer_overrun_l1 : t
val buffer_overrun_l2 : t
val buffer_overrun_l3 : t
val buffer_overrun_l4 : t
val buffer_overrun_l5 : t
val buffer_overrun_s2 : t
val buffer_overrun_u5 : t
val cannot_star : t
val captured_strong_self : t
val checkers_allocates_memory : t

Warning name when a performance critical method directly or indirectly calls a method allocating memory

val checkers_annotation_reachability_error : t
val checkers_calls_expensive_method : t

Warning name when a performance critical method directly or indirectly calls a method annotatd as expensive

val checkers_expensive_overrides_unexpensive : t

Warning name for the subtyping rule: method not annotated as expensive cannot be overridden by a method annotated as expensive

val checkers_fragment_retain_view : t
val checkers_immutable_cast : t
val checkers_printf_args : t
val class_cast_exception : t
val complexity_increase : kind:CostKind.t -> is_on_ui_thread:bool -> t
val component_with_multiple_factory_methods : t
val condition_always_false : t
val condition_always_true : t
val config_checks_between_markers : t
val config_impact_analysis : t
val constant_address_dereference : t
val create_intent_from_uri : t
val cross_site_scripting : t
val dangling_pointer_dereference : t
val dangling_pointer_dereference_maybe : t
val dead_store : t
val deadlock : t
val divide_by_zero : t
val do_not_report : t

an issue type that should never be reported

val empty_vector_access : t
val eradicate_annotation_graph : t
val eradicate_condition_redundant : t
val eradicate_field_not_initialized : t
val eradicate_field_not_nullable : t
val eradicate_field_over_annotated : t
val eradicate_inconsistent_subclass_parameter_annotation : t
val eradicate_inconsistent_subclass_return_annotation : t
val eradicate_redundant_nested_class_annotation : t
val eradicate_bad_nested_class_annotation : t
val eradicate_nullable_dereference : t
val eradicate_parameter_not_nullable : t
val eradicate_return_not_nullable : t
val eradicate_return_over_annotated : t
val eradicate_unvetted_third_party_in_nullsafe : t
val eradicate_unchecked_usage_in_nullsafe : t
val eradicate_meta_class_can_be_nullsafe : t
val eradicate_meta_class_needs_improvement : t
val eradicate_meta_class_is_nullsafe : t
val exposed_insecure_intent_handling : t
val expensive_cost_call : kind:CostKind.t -> t
val failure_exe : t
val field_not_null_checked : t
val guardedby_violation : t
val guardedby_violation_nullsafe : t
val impure_function : t
val inefficient_keyset_iterator : t
val inferbo_alloc_is_big : t
val inferbo_alloc_is_negative : t
val inferbo_alloc_is_zero : t
val inferbo_alloc_may_be_big : t
val inferbo_alloc_may_be_negative : t
val infinite_cost_call : kind:CostKind.t -> t
val inherently_dangerous_function : t
val insecure_intent_handling : t
val integer_overflow_l1 : t
val integer_overflow_l2 : t
val integer_overflow_l5 : t
val integer_overflow_u5 : t
val interface_not_thread_safe : t
val internal_error : t
val invariant_call : t
val ipc_on_ui_thread : t
val javascript_injection : t
val lab_resource_leak : t
val dotnet_resource_leak : t
val leak_after_array_abstraction : t
val leak_in_footprint : t
val leak_unknown_origin : t
val lockless_violation : t
val lock_consistency_violation : t
val logging_private_data : t
val expensive_loop_invariant_call : t
val memory_leak : t
val missing_fld : t
val missing_required_prop : t
val mixed_self_weakself : t
val modifies_immutable : t
val multiple_weakself : t
val mutable_local_variable_in_component_file : t
val null_dereference : t
val nullptr_dereference : t
val optional_empty_access : t
val parameter_not_null_checked : t
val precondition_not_found : t
val precondition_not_met : t
val premature_nil_termination : t
val pulse_memory_leak : t
val pure_function : t
val quandary_taint_error : t
val resource_leak : t
val retain_cycle : t
val skip_function : t
val shell_injection : t
val shell_injection_risk : t
val sql_injection : t
val sql_injection_risk : t
val stack_variable_address_escape : t
val starvation : t
val static_initialization_order_fiasco : t
val strict_mode_violation : t
val strong_self_not_checked : t
val symexec_memory_error : t
val thread_safety_violation : t
val thread_safety_violation_nullsafe : t
val topl_biabd_error : t
val topl_pulse_error : t
val uninitialized_value : t
val uninitialized_value_pulse : t
val unreachable_code_after : t
val use_after_delete : t
val use_after_free : t
val use_after_lifetime : t
val untrusted_buffer_access : t
val untrusted_deserialization : t
val untrusted_deserialization_risk : t
val untrusted_file : t
val untrusted_file_risk : t
val untrusted_heap_allocation : t
val untrusted_intent_creation : t
val untrusted_url_risk : t
val untrusted_environment_change_risk : t
val untrusted_variable_length_array : t
val user_controlled_sql_risk : t
val vector_invalidation : t
val weak_self_in_noescape_block : t
val wrong_argument_number : t
val unreachable_cost_call : kind:CostKind.t -> t
val is_autoreleasepool_size_issue : t -> bool
module Map : IStdlib.PrettyPrintable.PPMap with type PPMap.key = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase/ResultsDirEntryName/index.html b/website/static/odoc/next/infer/IBase/ResultsDirEntryName/index.html index 31fc391db..045a917f3 100644 --- a/website/static/odoc/next/infer/IBase/ResultsDirEntryName/index.html +++ b/website/static/odoc/next/infer/IBase/ResultsDirEntryName/index.html @@ -1,2 +1,2 @@ -ResultsDirEntryName (infer.IBase.ResultsDirEntryName)

Module IBase.ResultsDirEntryName

type id =
| AllocationTraces

directory for storing allocation traces

| CaptureDB

the capture database

| CaptureDependencies

list of infer-out/ directories that contain capture artefacts

| ChangedFunctions

results of the clang test determinator

| Debug

directory containing debug data

| Differential

contains the results of infer reportdiff

| DuplicateFunctions

list of duplicated functions

| JavaClassnamesCache

used when capturing Java jar dependencies

| JavaGlobalTypeEnvironment

internal Tenv.t object corresponding to the whole project

| LintDotty

directory of linters' dotty debug output for CTL evaluation

| LintIssues

directory of linters' issues

| Logs

log file

| NullsafeFileIssues

file-wide issues of the nullsafe analysis

| PerfEvents

file containing events for performance profiling

| ProcnamesLocks

directory of per-Procname.t file locks, used by the analysis scheduler in certain modes

| RacerDIssues

directory of issues reported by the RacerD analysis

| ReportConfigImpactJson

reports of the config impact analysis

| ReportCostsJson

reports of the costs analysis

| ReportHtml

directory of the HTML report

| ReportJson

the main product of the analysis: report.json

| ReportText

a human-readable textual version of report.json

| ReportXML

a PMD-style XML version of report.json

| RetainCycles

directory of retain cycles dotty files

| RunState

internal data about the last infer run

| StarvationIssues

directory of issues reported by the starvation analysis

| Temporary

directory containing temp files

| TestDeterminatorReport

the report produced by the test determinator capture mode

| TestDeterminatorTempResults

a directory

val get_path : results_dir:string -> id -> string

the absolute path for the given entry

val get_issues_directories : unit -> id list

all the entries that correspond to directories containing temporary issue logs for certain analyses

val to_delete_before_incremental_capture_and_analysis : results_dir:string -> string list

utility for ResultsDir.scrub_for_incremental, you probably want to use that instead

val to_delete_before_caching_capture : results_dir:string -> string list

utility for ResultsDir.scrub_for_caching, you probably want to use that instead

val buck_infer_deps_file_name : string

sad that we have to have this here but some code path is looking for all files with that name in buck-out/

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

Module IBase.ResultsDirEntryName

type id =
| AllocationTraces

directory for storing allocation traces

| CaptureDB

the capture database

| CaptureDBShm

SQLite-generated index file for the capture database's write-ahead log

| CaptureDBWal

the capture database's write-ahead log generated by SQLite

| CaptureDependencies

list of infer-out/ directories that contain capture artefacts

| ChangedFunctions

results of the clang test determinator

| Debug

directory containing debug data

| Differential

contains the results of infer reportdiff

| DuplicateFunctions

list of duplicated functions

| JavaClassnamesCache

used when capturing Java jar dependencies

| JavaGlobalTypeEnvironment

internal Tenv.t object corresponding to the whole project

| LintDotty

directory of linters' dotty debug output for CTL evaluation

| LintIssues

directory of linters' issues

| Logs

log file

| NullsafeFileIssues

file-wide issues of the nullsafe analysis

| PerfEvents

file containing events for performance profiling

| ProcnamesLocks

directory of per-Procname.t file locks, used by the analysis scheduler in certain modes

| RacerDIssues

directory of issues reported by the RacerD analysis

| ReportConfigImpactJson

reports of the config impact analysis

| ReportCostsJson

reports of the costs analysis

| ReportHtml

directory of the HTML report

| ReportJson

the main product of the analysis: report.json

| ReportText

a human-readable textual version of report.json

| ReportXML

a PMD-style XML version of report.json

| RetainCycles

directory of retain cycles dotty files

| RunState

internal data about the last infer run

| StarvationIssues

directory of issues reported by the starvation analysis

| Temporary

directory containing temp files

| TestDeterminatorReport

the report produced by the test determinator capture mode

| TestDeterminatorTempResults

a directory

val get_path : results_dir:string -> id -> string

the absolute path for the given entry

val get_issues_directories : unit -> id list

all the entries that correspond to directories containing temporary issue logs for certain analyses

val to_delete_before_incremental_capture_and_analysis : results_dir:string -> string list

utility for ResultsDir.scrub_for_incremental, you probably want to use that instead

val to_delete_before_caching_capture : results_dir:string -> string list

utility for ResultsDir.scrub_for_caching, you probably want to use that instead

val buck_infer_deps_file_name : string

sad that we have to have this here but some code path is looking for all files with that name in buck-out/

\ 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 bf23c6cf3..ea1bc8bf5 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
| 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 append_buck_flavors : string list
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 buck_java_flavor_suppress_config : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val classpath : string option
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 lib_dir : string
val load_average : float option
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val passthroughs : 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 pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val relative_path_backtrack : int
val report : bool
val report_custom_error : bool
val report_force_relative_path : bool
val report_immutable_modifications : bool
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val kotlin_source_extension : string
val sourcepath : string option
val sources : string list
val trace_absarray : bool
val unsafe_unret : string
val incremental_analysis : bool
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 abs_struct : int
val abs_val : int
val allow_leak : bool
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val array_level : int
val biabduction_models_mode : 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_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 cfg_json : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
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_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 command : ATDGenerated.InferCommand.t
val config_impact_data_file : 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 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_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 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 iterations : int
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 join_cond : 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 max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val ml_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val modified_lines : string option
val monitor_prop_size : bool
val nelseg : bool
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 only_footprint : bool
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 clang_frontend_action_string : string
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_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : 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_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 report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
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 seconds_per_iteration : float option
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 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 symops_per_iteration : int option
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_error : bool
val trace_events : bool
val trace_join : bool
val trace_ondemand : bool
val trace_rearrange : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val type_size : bool
val uninit_interproc : bool
val unsafe_malloc : bool
val worklist_mode : int
val workspace : string option
val write_dotty : bool
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
| 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 append_buck_flavors : string list
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 buck_java_flavor_suppress_config : bool
val clang_exe_aliases : string list
val clang_initializer_prefix : string
val clang_inner_destructor_prefix : string
val clang_plugin_path : string
val classpath : string option
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 lib_dir : string
val load_average : float option
val max_narrows : int
val max_widens : int
val meet_level : int
val nsnotification_center_checker_backend : bool
val os_type : os_type
val passthroughs : 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 pp_version : Stdlib.Format.formatter -> unit -> unit
val property_attributes : string
val relative_path_backtrack : int
val report : bool
val report_custom_error : bool
val report_force_relative_path : bool
val report_immutable_modifications : bool
val report_nullable_inconsistency : bool
val save_compact_summaries : bool
val smt_output : bool
val source_file_extentions : string list
val kotlin_source_extension : string
val sourcepath : string option
val sources : string list
val trace_absarray : bool
val unsafe_unret : string
val incremental_analysis : bool
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 abs_struct : int
val abs_val : int
val allow_leak : bool
val annotation_reachability_cxx : Yojson.Basic.t
val annotation_reachability_cxx_sources : Yojson.Basic.t
val annotation_reachability_custom_pairs : Yojson.Basic.t
val array_level : int
val biabduction_models_mode : 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_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 cfg_json : string option
val censor_report : ((bool * Str.regexp) * (bool * Str.regexp) * string) list
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_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 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 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 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 iterations : int
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 join_cond : 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 max_nesting : int option
val memtrace_analysis : bool
val memtrace_sampling_rate : float
val merge : bool
val method_decls_info : string option
val ml_buckets : [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ] list
val modified_lines : string option
val monitor_prop_size : bool
val nelseg : bool
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 only_footprint : bool
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 clang_frontend_action_string : string
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_max_disjuncts : int
val pulse_model_abort : string list
val pulse_model_alloc_pattern : Str.regexp option
val pulse_model_release_pattern : Str.regexp option
val pulse_model_return_nonnull : Str.regexp option
val pulse_model_skip_pattern : 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_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 report_blacklist_files_containing : string list
val report_console_limit : int option
val report_current : string option
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 seconds_per_iteration : float option
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 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 symops_per_iteration : int option
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_error : bool
val trace_events : bool
val trace_join : bool
val trace_ondemand : bool
val trace_rearrange : bool
val trace_topl : bool
val tv_commit : string option
val tv_limit : int
val tv_limit_filtered : int
val type_size : bool
val uninit_interproc : bool
val unsafe_malloc : bool
val worklist_mode : int
val workspace : string option
val write_dotty : bool
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__IssueType/index.html b/website/static/odoc/next/infer/IBase__IssueType/index.html index eda0b1049..f0143d6fa 100644 --- a/website/static/odoc/next/infer/IBase__IssueType/index.html +++ b/website/static/odoc/next/infer/IBase__IssueType/index.html @@ -1,2 +1,2 @@ -IBase__IssueType (infer.IBase__IssueType)

Module IBase__IssueType

type visibility =
| User

always add to error log

| Developer

only add to error log in some debug modes

| Silent

never add to error log

visibility of the issue type

val compare_visibility : visibility -> visibility -> int
val equal_visibility : visibility -> visibility -> bool
val string_of_visibility : visibility -> string
type severity =
| Like
| Info
| Advice
| Warning
| Error

severity of the report

val compare_severity : severity -> severity -> int
val equal_severity : severity -> severity -> bool
val all_of_severity : severity list
val string_of_severity : severity -> string
type t = private {
unique_id : string;
checker : IBase.Checker.t;
visibility : visibility;
user_documentation : string option;
mutable default_severity : severity;

used for documentation but can be overriden at report time

mutable enabled : bool;
mutable hum : string;
mutable doc_url : string option;
mutable linters_def_file : string option;
}
val compare : t -> t -> int
val equal : t -> t -> bool
val all_issues : unit -> t list

all the issues declared so far

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

pretty print a localised string

val find_from_string : id:string -> t option

return the issue type if it was previously registered

val register_dynamic : ?⁠enabled:bool -> ?⁠hum:string -> ?⁠doc_url:string -> linters_def_file:string option -> id:string -> ?⁠user_documentation:string -> severity -> IBase.Checker.t -> t

Create a new issue and register it in the list of all issues. NOTE: if the issue with the same string id is already registered, overrides `hum`, `doc_url`, and `linters_def_file`, but DOES NOT override `enabled`. This trick allows to deal with disabling/enabling dynamic AL issues from the config, when we don't know all params yet. Thus, the human-readable description can be updated when we encounter the definition of the issue type, eg in AL.

val checker_can_report : IBase.Checker.t -> t -> bool

Whether the issue was registered as coming from the given checker. Important to call this before reporting to keep documentation accurate.

val set_enabled : t -> bool -> unit
val abduction_case_not_implemented : t
val arbitrary_code_execution_under_lock : t
val array_of_pointsto : t
val array_out_of_bounds_l1 : t
val array_out_of_bounds_l2 : t
val array_out_of_bounds_l3 : t
val assert_failure : t
val bad_footprint : t
val biabduction_analysis_stops : t
val buffer_overrun_l1 : t
val buffer_overrun_l2 : t
val buffer_overrun_l3 : t
val buffer_overrun_l4 : t
val buffer_overrun_l5 : t
val buffer_overrun_s2 : t
val buffer_overrun_u5 : t
val cannot_star : t
val captured_strong_self : t
val checkers_allocates_memory : t

Warning name when a performance critical method directly or indirectly calls a method allocating memory

val checkers_annotation_reachability_error : t
val checkers_calls_expensive_method : t

Warning name when a performance critical method directly or indirectly calls a method annotatd as expensive

val checkers_expensive_overrides_unexpensive : t

Warning name for the subtyping rule: method not annotated as expensive cannot be overridden by a method annotated as expensive

val checkers_fragment_retain_view : t
val checkers_immutable_cast : t
val checkers_printf_args : t
val class_cast_exception : t
val complexity_increase : kind:IBase.CostKind.t -> is_on_ui_thread:bool -> t
val component_with_multiple_factory_methods : t
val condition_always_false : t
val condition_always_true : t
val config_checks_between_markers : t
val config_impact_analysis : t
val constant_address_dereference : t
val create_intent_from_uri : t
val cross_site_scripting : t
val dangling_pointer_dereference : t
val dangling_pointer_dereference_maybe : t
val dead_store : t
val deadlock : t
val divide_by_zero : t
val do_not_report : t

an issue type that should never be reported

val empty_vector_access : t
val eradicate_annotation_graph : t
val eradicate_condition_redundant : t
val eradicate_field_not_initialized : t
val eradicate_field_not_nullable : t
val eradicate_field_over_annotated : t
val eradicate_inconsistent_subclass_parameter_annotation : t
val eradicate_inconsistent_subclass_return_annotation : t
val eradicate_redundant_nested_class_annotation : t
val eradicate_bad_nested_class_annotation : t
val eradicate_nullable_dereference : t
val eradicate_parameter_not_nullable : t
val eradicate_return_not_nullable : t
val eradicate_return_over_annotated : t
val eradicate_unvetted_third_party_in_nullsafe : t
val eradicate_unchecked_usage_in_nullsafe : t
val eradicate_meta_class_can_be_nullsafe : t
val eradicate_meta_class_needs_improvement : t
val eradicate_meta_class_is_nullsafe : t
val exposed_insecure_intent_handling : t
val expensive_cost_call : kind:IBase.CostKind.t -> t
val failure_exe : t
val field_not_null_checked : t
val guardedby_violation : t
val guardedby_violation_nullsafe : t
val impure_function : t
val inefficient_keyset_iterator : t
val inferbo_alloc_is_big : t
val inferbo_alloc_is_negative : t
val inferbo_alloc_is_zero : t
val inferbo_alloc_may_be_big : t
val inferbo_alloc_may_be_negative : t
val infinite_cost_call : kind:IBase.CostKind.t -> t
val inherently_dangerous_function : t
val insecure_intent_handling : t
val integer_overflow_l1 : t
val integer_overflow_l2 : t
val integer_overflow_l5 : t
val integer_overflow_u5 : t
val interface_not_thread_safe : t
val internal_error : t
val invariant_call : t
val javascript_injection : t
val lab_resource_leak : t
val dotnet_resource_leak : t
val leak_after_array_abstraction : t
val leak_in_footprint : t
val leak_unknown_origin : t
val lockless_violation : t
val lock_consistency_violation : t
val logging_private_data : t
val expensive_loop_invariant_call : t
val memory_leak : t
val missing_fld : t
val missing_required_prop : t
val mixed_self_weakself : t
val modifies_immutable : t
val multiple_weakself : t
val mutable_local_variable_in_component_file : t
val null_dereference : t
val nullptr_dereference : t
val optional_empty_access : t
val parameter_not_null_checked : t
val precondition_not_found : t
val precondition_not_met : t
val premature_nil_termination : t
val pulse_memory_leak : t
val pure_function : t
val quandary_taint_error : t
val resource_leak : t
val retain_cycle : t
val skip_function : t
val shell_injection : t
val shell_injection_risk : t
val sql_injection : t
val sql_injection_risk : t
val stack_variable_address_escape : t
val starvation : t
val static_initialization_order_fiasco : t
val strict_mode_violation : t
val strong_self_not_checked : t
val symexec_memory_error : t
val thread_safety_violation : t
val thread_safety_violation_nullsafe : t
val topl_biabd_error : t
val topl_pulse_error : t
val uninitialized_value : t
val uninitialized_value_pulse : t
val unreachable_code_after : t
val use_after_delete : t
val use_after_free : t
val use_after_lifetime : t
val untrusted_buffer_access : t
val untrusted_deserialization : t
val untrusted_deserialization_risk : t
val untrusted_file : t
val untrusted_file_risk : t
val untrusted_heap_allocation : t
val untrusted_intent_creation : t
val untrusted_url_risk : t
val untrusted_environment_change_risk : t
val untrusted_variable_length_array : t
val user_controlled_sql_risk : t
val vector_invalidation : t
val weak_self_in_noescape_block : t
val wrong_argument_number : t
val unreachable_cost_call : kind:IBase.CostKind.t -> t
val is_autoreleasepool_size_issue : t -> bool
\ No newline at end of file +IBase__IssueType (infer.IBase__IssueType)

Module IBase__IssueType

type visibility =
| User

always add to error log

| Developer

only add to error log in some debug modes

| Silent

never add to error log

visibility of the issue type

val compare_visibility : visibility -> visibility -> int
val equal_visibility : visibility -> visibility -> bool
val string_of_visibility : visibility -> string
type severity =
| Like
| Info
| Advice
| Warning
| Error

severity of the report

val compare_severity : severity -> severity -> int
val equal_severity : severity -> severity -> bool
val all_of_severity : severity list
val string_of_severity : severity -> string
type t = private {
unique_id : string;
checker : IBase.Checker.t;
visibility : visibility;
user_documentation : string option;
mutable default_severity : severity;

used for documentation but can be overriden at report time

mutable enabled : bool;
mutable hum : string;
mutable doc_url : string option;
mutable linters_def_file : string option;
}
val compare : t -> t -> int
val equal : t -> t -> bool
val all_issues : unit -> t list

all the issues declared so far

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

pretty print a localised string

val find_from_string : id:string -> t option

return the issue type if it was previously registered

val register_dynamic : ?⁠enabled:bool -> ?⁠hum:string -> ?⁠doc_url:string -> linters_def_file:string option -> id:string -> ?⁠user_documentation:string -> severity -> IBase.Checker.t -> t

Create a new issue and register it in the list of all issues. NOTE: if the issue with the same string id is already registered, overrides `hum`, `doc_url`, and `linters_def_file`, but DOES NOT override `enabled`. This trick allows to deal with disabling/enabling dynamic AL issues from the config, when we don't know all params yet. Thus, the human-readable description can be updated when we encounter the definition of the issue type, eg in AL.

val checker_can_report : IBase.Checker.t -> t -> bool

Whether the issue was registered as coming from the given checker. Important to call this before reporting to keep documentation accurate.

val set_enabled : t -> bool -> unit
val abduction_case_not_implemented : t
val arbitrary_code_execution_under_lock : t
val array_of_pointsto : t
val array_out_of_bounds_l1 : t
val array_out_of_bounds_l2 : t
val array_out_of_bounds_l3 : t
val assert_failure : t
val bad_footprint : t
val biabduction_analysis_stops : t
val buffer_overrun_l1 : t
val buffer_overrun_l2 : t
val buffer_overrun_l3 : t
val buffer_overrun_l4 : t
val buffer_overrun_l5 : t
val buffer_overrun_s2 : t
val buffer_overrun_u5 : t
val cannot_star : t
val captured_strong_self : t
val checkers_allocates_memory : t

Warning name when a performance critical method directly or indirectly calls a method allocating memory

val checkers_annotation_reachability_error : t
val checkers_calls_expensive_method : t

Warning name when a performance critical method directly or indirectly calls a method annotatd as expensive

val checkers_expensive_overrides_unexpensive : t

Warning name for the subtyping rule: method not annotated as expensive cannot be overridden by a method annotated as expensive

val checkers_fragment_retain_view : t
val checkers_immutable_cast : t
val checkers_printf_args : t
val class_cast_exception : t
val complexity_increase : kind:IBase.CostKind.t -> is_on_ui_thread:bool -> t
val component_with_multiple_factory_methods : t
val condition_always_false : t
val condition_always_true : t
val config_checks_between_markers : t
val config_impact_analysis : t
val constant_address_dereference : t
val create_intent_from_uri : t
val cross_site_scripting : t
val dangling_pointer_dereference : t
val dangling_pointer_dereference_maybe : t
val dead_store : t
val deadlock : t
val divide_by_zero : t
val do_not_report : t

an issue type that should never be reported

val empty_vector_access : t
val eradicate_annotation_graph : t
val eradicate_condition_redundant : t
val eradicate_field_not_initialized : t
val eradicate_field_not_nullable : t
val eradicate_field_over_annotated : t
val eradicate_inconsistent_subclass_parameter_annotation : t
val eradicate_inconsistent_subclass_return_annotation : t
val eradicate_redundant_nested_class_annotation : t
val eradicate_bad_nested_class_annotation : t
val eradicate_nullable_dereference : t
val eradicate_parameter_not_nullable : t
val eradicate_return_not_nullable : t
val eradicate_return_over_annotated : t
val eradicate_unvetted_third_party_in_nullsafe : t
val eradicate_unchecked_usage_in_nullsafe : t
val eradicate_meta_class_can_be_nullsafe : t
val eradicate_meta_class_needs_improvement : t
val eradicate_meta_class_is_nullsafe : t
val exposed_insecure_intent_handling : t
val expensive_cost_call : kind:IBase.CostKind.t -> t
val failure_exe : t
val field_not_null_checked : t
val guardedby_violation : t
val guardedby_violation_nullsafe : t
val impure_function : t
val inefficient_keyset_iterator : t
val inferbo_alloc_is_big : t
val inferbo_alloc_is_negative : t
val inferbo_alloc_is_zero : t
val inferbo_alloc_may_be_big : t
val inferbo_alloc_may_be_negative : t
val infinite_cost_call : kind:IBase.CostKind.t -> t
val inherently_dangerous_function : t
val insecure_intent_handling : t
val integer_overflow_l1 : t
val integer_overflow_l2 : t
val integer_overflow_l5 : t
val integer_overflow_u5 : t
val interface_not_thread_safe : t
val internal_error : t
val invariant_call : t
val ipc_on_ui_thread : t
val javascript_injection : t
val lab_resource_leak : t
val dotnet_resource_leak : t
val leak_after_array_abstraction : t
val leak_in_footprint : t
val leak_unknown_origin : t
val lockless_violation : t
val lock_consistency_violation : t
val logging_private_data : t
val expensive_loop_invariant_call : t
val memory_leak : t
val missing_fld : t
val missing_required_prop : t
val mixed_self_weakself : t
val modifies_immutable : t
val multiple_weakself : t
val mutable_local_variable_in_component_file : t
val null_dereference : t
val nullptr_dereference : t
val optional_empty_access : t
val parameter_not_null_checked : t
val precondition_not_found : t
val precondition_not_met : t
val premature_nil_termination : t
val pulse_memory_leak : t
val pure_function : t
val quandary_taint_error : t
val resource_leak : t
val retain_cycle : t
val skip_function : t
val shell_injection : t
val shell_injection_risk : t
val sql_injection : t
val sql_injection_risk : t
val stack_variable_address_escape : t
val starvation : t
val static_initialization_order_fiasco : t
val strict_mode_violation : t
val strong_self_not_checked : t
val symexec_memory_error : t
val thread_safety_violation : t
val thread_safety_violation_nullsafe : t
val topl_biabd_error : t
val topl_pulse_error : t
val uninitialized_value : t
val uninitialized_value_pulse : t
val unreachable_code_after : t
val use_after_delete : t
val use_after_free : t
val use_after_lifetime : t
val untrusted_buffer_access : t
val untrusted_deserialization : t
val untrusted_deserialization_risk : t
val untrusted_file : t
val untrusted_file_risk : t
val untrusted_heap_allocation : t
val untrusted_intent_creation : t
val untrusted_url_risk : t
val untrusted_environment_change_risk : t
val untrusted_variable_length_array : t
val user_controlled_sql_risk : t
val vector_invalidation : t
val weak_self_in_noescape_block : t
val wrong_argument_number : t
val unreachable_cost_call : kind:IBase.CostKind.t -> t
val is_autoreleasepool_size_issue : t -> bool
module Map : IStdlib.PrettyPrintable.PPMap with type PPMap.key = t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/IBase__ResultsDirEntryName/index.html b/website/static/odoc/next/infer/IBase__ResultsDirEntryName/index.html index 213663e89..e0163d531 100644 --- a/website/static/odoc/next/infer/IBase__ResultsDirEntryName/index.html +++ b/website/static/odoc/next/infer/IBase__ResultsDirEntryName/index.html @@ -1,2 +1,2 @@ -IBase__ResultsDirEntryName (infer.IBase__ResultsDirEntryName)

Module IBase__ResultsDirEntryName

type id =
| AllocationTraces

directory for storing allocation traces

| CaptureDB

the capture database

| CaptureDependencies

list of infer-out/ directories that contain capture artefacts

| ChangedFunctions

results of the clang test determinator

| Debug

directory containing debug data

| Differential

contains the results of infer reportdiff

| DuplicateFunctions

list of duplicated functions

| JavaClassnamesCache

used when capturing Java jar dependencies

| JavaGlobalTypeEnvironment

internal Tenv.t object corresponding to the whole project

| LintDotty

directory of linters' dotty debug output for CTL evaluation

| LintIssues

directory of linters' issues

| Logs

log file

| NullsafeFileIssues

file-wide issues of the nullsafe analysis

| PerfEvents

file containing events for performance profiling

| ProcnamesLocks

directory of per-Procname.t file locks, used by the analysis scheduler in certain modes

| RacerDIssues

directory of issues reported by the RacerD analysis

| ReportConfigImpactJson

reports of the config impact analysis

| ReportCostsJson

reports of the costs analysis

| ReportHtml

directory of the HTML report

| ReportJson

the main product of the analysis: report.json

| ReportText

a human-readable textual version of report.json

| ReportXML

a PMD-style XML version of report.json

| RetainCycles

directory of retain cycles dotty files

| RunState

internal data about the last infer run

| StarvationIssues

directory of issues reported by the starvation analysis

| Temporary

directory containing temp files

| TestDeterminatorReport

the report produced by the test determinator capture mode

| TestDeterminatorTempResults

a directory

val get_path : results_dir:string -> id -> string

the absolute path for the given entry

val get_issues_directories : unit -> id list

all the entries that correspond to directories containing temporary issue logs for certain analyses

val to_delete_before_incremental_capture_and_analysis : results_dir:string -> string list

utility for ResultsDir.scrub_for_incremental, you probably want to use that instead

val to_delete_before_caching_capture : results_dir:string -> string list

utility for ResultsDir.scrub_for_caching, you probably want to use that instead

val buck_infer_deps_file_name : string

sad that we have to have this here but some code path is looking for all files with that name in buck-out/

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

Module IBase__ResultsDirEntryName

type id =
| AllocationTraces

directory for storing allocation traces

| CaptureDB

the capture database

| CaptureDBShm

SQLite-generated index file for the capture database's write-ahead log

| CaptureDBWal

the capture database's write-ahead log generated by SQLite

| CaptureDependencies

list of infer-out/ directories that contain capture artefacts

| ChangedFunctions

results of the clang test determinator

| Debug

directory containing debug data

| Differential

contains the results of infer reportdiff

| DuplicateFunctions

list of duplicated functions

| JavaClassnamesCache

used when capturing Java jar dependencies

| JavaGlobalTypeEnvironment

internal Tenv.t object corresponding to the whole project

| LintDotty

directory of linters' dotty debug output for CTL evaluation

| LintIssues

directory of linters' issues

| Logs

log file

| NullsafeFileIssues

file-wide issues of the nullsafe analysis

| PerfEvents

file containing events for performance profiling

| ProcnamesLocks

directory of per-Procname.t file locks, used by the analysis scheduler in certain modes

| RacerDIssues

directory of issues reported by the RacerD analysis

| ReportConfigImpactJson

reports of the config impact analysis

| ReportCostsJson

reports of the costs analysis

| ReportHtml

directory of the HTML report

| ReportJson

the main product of the analysis: report.json

| ReportText

a human-readable textual version of report.json

| ReportXML

a PMD-style XML version of report.json

| RetainCycles

directory of retain cycles dotty files

| RunState

internal data about the last infer run

| StarvationIssues

directory of issues reported by the starvation analysis

| Temporary

directory containing temp files

| TestDeterminatorReport

the report produced by the test determinator capture mode

| TestDeterminatorTempResults

a directory

val get_path : results_dir:string -> id -> string

the absolute path for the given entry

val get_issues_directories : unit -> id list

all the entries that correspond to directories containing temporary issue logs for certain analyses

val to_delete_before_incremental_capture_and_analysis : results_dir:string -> string list

utility for ResultsDir.scrub_for_incremental, you probably want to use that instead

val to_delete_before_caching_capture : results_dir:string -> string list

utility for ResultsDir.scrub_for_caching, you probably want to use that instead

val buck_infer_deps_file_name : string

sad that we have to have this here but some code path is looking for all files with that name in buck-out/

\ No newline at end of file diff --git a/website/static/odoc/next/infer/IR/ProcAttributes/index.html b/website/static/odoc/next/infer/IR/ProcAttributes/index.html index df0cf1cc5..5779fbb4a 100644 --- a/website/static/odoc/next/infer/IR/ProcAttributes/index.html +++ b/website/static/odoc/next/infer/IR/ProcAttributes/index.html @@ -1,2 +1,2 @@ -ProcAttributes (infer.IR.ProcAttributes)

Module IR.ProcAttributes

type objc_accessor_type =
| Objc_getter of Struct.field
| Objc_setter of Struct.field
type var_data = {
name : Mangled.t;
typ : Typ.t;
modify_in_block : bool;

__block attribute of Objective-C variables, means that it will be modified inside a block

is_constexpr : bool;
is_declared_unused : bool;

variable declared with attribute unused

}
type specialized_with_blocks_info = {
orig_proc : Procname.t;
formals_to_procs_and_new_formals : (Procname.t * (Mangled.t * Typ.t) list) IR.Mangled.Map.t;
}
val compare_specialized_with_blocks_info : specialized_with_blocks_info -> specialized_with_blocks_info -> int
type t = {
access : PredSymb.access;

visibility access

captured : CapturedVar.t list;

name, type, and mode of variables captured in blocks and lambdas

exceptions : string list;

exceptions thrown by the procedure

formals : (Mangled.t * Typ.t) list;

name and type of formal parameters

const_formals : int list;

list of indices of formals that are const-qualified

is_abstract : bool;

the procedure is abstract

is_biabduction_model : bool;

the procedure is a model for the biabduction analysis

is_bridge_method : bool;

the procedure is a bridge method

is_defined : bool;

true if the procedure is defined, and not just declared

is_java_synchronized_method : bool;

the procedure is a Java synchronized method

passed_as_noescape_block_to : Procname.t option;

Present if the procedure is an Objective-C block that has been passed to the given method in a position annotated with the NS_NOESCAPE attribute.

is_no_return : bool;

the procedure is known not to return

is_objc_arc_on : bool;

the ObjC procedure is compiled with ARC

is_specialized : bool;

the procedure is a clone specialized for dynamic dispatch handling

is_synthetic_method : bool;

the procedure is a synthetic method

is_variadic : bool;

the procedure is variadic, only supported for Clang procedures

sentinel_attr : (int * int) option;

__attribute__((sentinel(int, int)))

specialized_with_blocks_info : specialized_with_blocks_info option;

the procedure is a clone specialized with calls to concrete closures, with link to the original procedure, and a map that links the original formals to the elements of the closure used to specialize the procedure.

clang_method_kind : ClangMethodKind.t;

the kind of method the procedure is

loc : IBase.Location.t;

location of this procedure in the source code

translation_unit : IBase.SourceFile.t;

source file where the procedure was captured

mutable locals : var_data list;

name, type and attributes of local variables

method_annotation : Annot.Method.t;

annotations for all methods

objc_accessor : objc_accessor_type option;

type of ObjC accessor, if any

proc_name : Procname.t;

name of the procedure

ret_type : Typ.t;

return type

has_added_return_param : bool;

whether or not a return param was added

}
val default : IBase.SourceFile.t -> Procname.t -> t

Create a proc_attributes with default values.

val pp : Stdlib.Format.formatter -> t -> unit
val get_access : t -> PredSymb.access

Return the visibility attribute

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

Return name and type of formal parameters

val get_annotated_formals : t -> ((Mangled.t * Typ.t) * Annot.Item.t) list
val get_loc : t -> IBase.Location.t

Return loc information for the procedure

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

Return pvar and type of formal parameters

module SQLite : IBase.SqliteUtils.Data with type t = t
\ No newline at end of file +ProcAttributes (infer.IR.ProcAttributes)

Module IR.ProcAttributes

type objc_accessor_type =
| Objc_getter of Struct.field
| Objc_setter of Struct.field
type var_data = {
name : Mangled.t;
typ : Typ.t;
modify_in_block : bool;

__block attribute of Objective-C variables, means that it will be modified inside a block

is_constexpr : bool;
is_declared_unused : bool;

variable declared with attribute unused

}
type specialized_with_blocks_info = {
orig_proc : Procname.t;
formals_to_procs_and_new_formals : (Procname.t * (Mangled.t * Typ.t) list) IR.Mangled.Map.t;
}
val compare_specialized_with_blocks_info : specialized_with_blocks_info -> specialized_with_blocks_info -> int
type t = {
access : PredSymb.access;

visibility access

captured : CapturedVar.t list;

name, type, and mode of variables captured in blocks and lambdas

exceptions : string list;

exceptions thrown by the procedure

formals : (Mangled.t * Typ.t) list;

name and type of formal parameters

const_formals : int list;

list of indices of formals that are const-qualified

is_abstract : bool;

the procedure is abstract

is_biabduction_model : bool;

the procedure is a model for the biabduction analysis

is_bridge_method : bool;

the procedure is a bridge method

is_defined : bool;

true if the procedure is defined, and not just declared

is_java_synchronized_method : bool;

the procedure is a Java synchronized method

passed_as_noescape_block_to : Procname.t option;

Present if the procedure is an Objective-C block that has been passed to the given method in a position annotated with the NS_NOESCAPE attribute.

is_no_return : bool;

the procedure is known not to return

is_objc_arc_on : bool;

the ObjC procedure is compiled with ARC

is_specialized : bool;

the procedure is a clone specialized for dynamic dispatch handling

is_synthetic_method : bool;

the procedure is a synthetic method

is_variadic : bool;

the procedure is variadic, only supported for Clang procedures

sentinel_attr : (int * int) option;

__attribute__((sentinel(int, int)))

specialized_with_blocks_info : specialized_with_blocks_info option;

the procedure is a clone specialized with calls to concrete closures, with link to the original procedure, and a map that links the original formals to the elements of the closure used to specialize the procedure.

clang_method_kind : ClangMethodKind.t;

the kind of method the procedure is

loc : IBase.Location.t;

location of this procedure in the source code

translation_unit : IBase.SourceFile.t;

source file where the procedure was captured

mutable locals : var_data list;

name, type and attributes of local variables

method_annotation : Annot.Method.t;

annotations for all methods

objc_accessor : objc_accessor_type option;

type of ObjC accessor, if any

proc_name : Procname.t;

name of the procedure

ret_type : Typ.t;

return type

has_added_return_param : bool;

whether or not a return param was added

is_ret_type_pod : bool;

whether or not the return type is POD

}
val default : IBase.SourceFile.t -> Procname.t -> t

Create a proc_attributes with default values.

val pp : Stdlib.Format.formatter -> t -> unit
val get_access : t -> PredSymb.access

Return the visibility attribute

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

Return name and type of formal parameters

val get_annotated_formals : t -> ((Mangled.t * Typ.t) * Annot.Item.t) list
val get_loc : t -> IBase.Location.t

Return loc information for the procedure

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

Return pvar and type of formal parameters

module SQLite : IBase.SqliteUtils.Data with type t = t
\ 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 38d82308a..c6b025d98 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 -> PredSymb.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 get_ret_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_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 replace_instrs_by : t -> f:(Node.t -> Sil.instr -> Sil.instr array) -> bool

Like replace_instrs, 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 -> PredSymb.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_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_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 replace_instrs_by : t -> f:(Node.t -> Sil.instr -> Sil.instr array) -> bool

Like replace_instrs, 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__ProcAttributes/index.html b/website/static/odoc/next/infer/IR__ProcAttributes/index.html index f892bcf2c..9aabe257b 100644 --- a/website/static/odoc/next/infer/IR__ProcAttributes/index.html +++ b/website/static/odoc/next/infer/IR__ProcAttributes/index.html @@ -1,2 +1,2 @@ -IR__ProcAttributes (infer.IR__ProcAttributes)

Module IR__ProcAttributes

type objc_accessor_type =
| Objc_getter of IR.Struct.field
| Objc_setter of IR.Struct.field
type var_data = {
name : IR.Mangled.t;
typ : IR.Typ.t;
modify_in_block : bool;

__block attribute of Objective-C variables, means that it will be modified inside a block

is_constexpr : bool;
is_declared_unused : bool;

variable declared with attribute unused

}
type specialized_with_blocks_info = {
orig_proc : IR.Procname.t;
formals_to_procs_and_new_formals : (IR.Procname.t * (IR.Mangled.t * IR.Typ.t) list) IR.Mangled.Map.t;
}
val compare_specialized_with_blocks_info : specialized_with_blocks_info -> specialized_with_blocks_info -> int
type t = {
access : IR.PredSymb.access;

visibility access

captured : IR.CapturedVar.t list;

name, type, and mode of variables captured in blocks and lambdas

exceptions : string list;

exceptions thrown by the procedure

formals : (IR.Mangled.t * IR.Typ.t) list;

name and type of formal parameters

const_formals : int list;

list of indices of formals that are const-qualified

is_abstract : bool;

the procedure is abstract

is_biabduction_model : bool;

the procedure is a model for the biabduction analysis

is_bridge_method : bool;

the procedure is a bridge method

is_defined : bool;

true if the procedure is defined, and not just declared

is_java_synchronized_method : bool;

the procedure is a Java synchronized method

passed_as_noescape_block_to : IR.Procname.t option;

Present if the procedure is an Objective-C block that has been passed to the given method in a position annotated with the NS_NOESCAPE attribute.

is_no_return : bool;

the procedure is known not to return

is_objc_arc_on : bool;

the ObjC procedure is compiled with ARC

is_specialized : bool;

the procedure is a clone specialized for dynamic dispatch handling

is_synthetic_method : bool;

the procedure is a synthetic method

is_variadic : bool;

the procedure is variadic, only supported for Clang procedures

sentinel_attr : (int * int) option;

__attribute__((sentinel(int, int)))

specialized_with_blocks_info : specialized_with_blocks_info option;

the procedure is a clone specialized with calls to concrete closures, with link to the original procedure, and a map that links the original formals to the elements of the closure used to specialize the procedure.

clang_method_kind : IR.ClangMethodKind.t;

the kind of method the procedure is

loc : IBase.Location.t;

location of this procedure in the source code

translation_unit : IBase.SourceFile.t;

source file where the procedure was captured

mutable locals : var_data list;

name, type and attributes of local variables

method_annotation : IR.Annot.Method.t;

annotations for all methods

objc_accessor : objc_accessor_type option;

type of ObjC accessor, if any

proc_name : IR.Procname.t;

name of the procedure

ret_type : IR.Typ.t;

return type

has_added_return_param : bool;

whether or not a return param was added

}
val default : IBase.SourceFile.t -> IR.Procname.t -> t

Create a proc_attributes with default values.

val pp : Stdlib.Format.formatter -> t -> unit
val get_access : t -> IR.PredSymb.access

Return the visibility attribute

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

Return name and type of formal parameters

val get_annotated_formals : t -> ((IR.Mangled.t * IR.Typ.t) * IR.Annot.Item.t) list
val get_loc : t -> IBase.Location.t

Return loc information for the procedure

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

Return pvar and type of formal parameters

module SQLite : IBase.SqliteUtils.Data with type t = t
\ No newline at end of file +IR__ProcAttributes (infer.IR__ProcAttributes)

Module IR__ProcAttributes

type objc_accessor_type =
| Objc_getter of IR.Struct.field
| Objc_setter of IR.Struct.field
type var_data = {
name : IR.Mangled.t;
typ : IR.Typ.t;
modify_in_block : bool;

__block attribute of Objective-C variables, means that it will be modified inside a block

is_constexpr : bool;
is_declared_unused : bool;

variable declared with attribute unused

}
type specialized_with_blocks_info = {
orig_proc : IR.Procname.t;
formals_to_procs_and_new_formals : (IR.Procname.t * (IR.Mangled.t * IR.Typ.t) list) IR.Mangled.Map.t;
}
val compare_specialized_with_blocks_info : specialized_with_blocks_info -> specialized_with_blocks_info -> int
type t = {
access : IR.PredSymb.access;

visibility access

captured : IR.CapturedVar.t list;

name, type, and mode of variables captured in blocks and lambdas

exceptions : string list;

exceptions thrown by the procedure

formals : (IR.Mangled.t * IR.Typ.t) list;

name and type of formal parameters

const_formals : int list;

list of indices of formals that are const-qualified

is_abstract : bool;

the procedure is abstract

is_biabduction_model : bool;

the procedure is a model for the biabduction analysis

is_bridge_method : bool;

the procedure is a bridge method

is_defined : bool;

true if the procedure is defined, and not just declared

is_java_synchronized_method : bool;

the procedure is a Java synchronized method

passed_as_noescape_block_to : IR.Procname.t option;

Present if the procedure is an Objective-C block that has been passed to the given method in a position annotated with the NS_NOESCAPE attribute.

is_no_return : bool;

the procedure is known not to return

is_objc_arc_on : bool;

the ObjC procedure is compiled with ARC

is_specialized : bool;

the procedure is a clone specialized for dynamic dispatch handling

is_synthetic_method : bool;

the procedure is a synthetic method

is_variadic : bool;

the procedure is variadic, only supported for Clang procedures

sentinel_attr : (int * int) option;

__attribute__((sentinel(int, int)))

specialized_with_blocks_info : specialized_with_blocks_info option;

the procedure is a clone specialized with calls to concrete closures, with link to the original procedure, and a map that links the original formals to the elements of the closure used to specialize the procedure.

clang_method_kind : IR.ClangMethodKind.t;

the kind of method the procedure is

loc : IBase.Location.t;

location of this procedure in the source code

translation_unit : IBase.SourceFile.t;

source file where the procedure was captured

mutable locals : var_data list;

name, type and attributes of local variables

method_annotation : IR.Annot.Method.t;

annotations for all methods

objc_accessor : objc_accessor_type option;

type of ObjC accessor, if any

proc_name : IR.Procname.t;

name of the procedure

ret_type : IR.Typ.t;

return type

has_added_return_param : bool;

whether or not a return param was added

is_ret_type_pod : bool;

whether or not the return type is POD

}
val default : IBase.SourceFile.t -> IR.Procname.t -> t

Create a proc_attributes with default values.

val pp : Stdlib.Format.formatter -> t -> unit
val get_access : t -> IR.PredSymb.access

Return the visibility attribute

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

Return name and type of formal parameters

val get_annotated_formals : t -> ((IR.Mangled.t * IR.Typ.t) * IR.Annot.Item.t) list
val get_loc : t -> IBase.Location.t

Return loc information for the procedure

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

Return pvar and type of formal parameters

module SQLite : IBase.SqliteUtils.Data with type t = t
\ 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 eda270729..9f704646e 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.PredSymb.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 get_ret_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_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 replace_instrs_by : t -> f:(Node.t -> IR.Sil.instr -> IR.Sil.instr array) -> bool

Like replace_instrs, 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.PredSymb.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_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_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 replace_instrs_by : t -> f:(Node.t -> IR.Sil.instr -> IR.Sil.instr array) -> bool

Like replace_instrs, 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/Integration/ConfigImpactIssuesTest/index.html b/website/static/odoc/next/infer/Integration/ConfigImpactIssuesTest/index.html new file mode 100644 index 000000000..5df2ab246 --- /dev/null +++ b/website/static/odoc/next/infer/Integration/ConfigImpactIssuesTest/index.html @@ -0,0 +1,2 @@ + +ConfigImpactIssuesTest (infer.Integration.ConfigImpactIssuesTest)

Module Integration.ConfigImpactIssuesTest

val write_from_json : json_path:string -> out_path:string -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration/Differential/index.html b/website/static/odoc/next/infer/Integration/Differential/index.html index 6c8c16cc9..11c236b2b 100644 --- a/website/static/odoc/next/infer/Integration/Differential/index.html +++ b/website/static/odoc/next/infer/Integration/Differential/index.html @@ -1,2 +1,2 @@ -Differential (infer.Integration.Differential)

Module Integration.Differential

type t = {
introduced : ATDGenerated.Jsonbug_t.report;
fixed : ATDGenerated.Jsonbug_t.report;
preexisting : ATDGenerated.Jsonbug_t.report;
costs_summary : Yojson.Basic.t;
}
val of_reports : current_report:ATDGenerated.Jsonbug_t.report -> previous_report:ATDGenerated.Jsonbug_t.report -> current_costs:ATDGenerated.Jsonbug_t.costs_report -> previous_costs:ATDGenerated.Jsonbug_t.costs_report -> t
val to_files : t -> string -> unit
\ No newline at end of file +Differential (infer.Integration.Differential)

Module Integration.Differential

type t = {
introduced : ATDGenerated.Jsonbug_t.report;
fixed : ATDGenerated.Jsonbug_t.report;
preexisting : ATDGenerated.Jsonbug_t.report;
costs_summary : Yojson.Basic.t;
}
val issues_of_reports : current_report:ATDGenerated.Jsonbug_t.report -> previous_report:ATDGenerated.Jsonbug_t.report -> current_costs:ATDGenerated.Jsonbug_t.costs_report -> previous_costs:ATDGenerated.Jsonbug_t.costs_report -> current_config_impact:ATDGenerated.Jsonbug_t.config_impact_report -> previous_config_impact:ATDGenerated.Jsonbug_t.config_impact_report -> t
val to_files : t -> string -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration/ReportDiff/index.html b/website/static/odoc/next/infer/Integration/ReportDiff/index.html index 46578ff33..84c5bacae 100644 --- a/website/static/odoc/next/infer/Integration/ReportDiff/index.html +++ b/website/static/odoc/next/infer/Integration/ReportDiff/index.html @@ -1,2 +1,2 @@ -ReportDiff (infer.Integration.ReportDiff)

Module Integration.ReportDiff

val reportdiff : current_report:string option -> previous_report:string option -> current_costs:string option -> previous_costs:string option -> unit
\ No newline at end of file +ReportDiff (infer.Integration.ReportDiff)

Module Integration.ReportDiff

val reportdiff : current_report:string option -> previous_report:string option -> current_costs:string option -> previous_costs:string option -> current_config_impact:string option -> previous_config_impact:string option -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration/index.html b/website/static/odoc/next/infer/Integration/index.html index 4b43cab2f..b84de8d9f 100644 --- a/website/static/odoc/next/infer/Integration/index.html +++ b/website/static/odoc/next/infer/Integration/index.html @@ -1,2 +1,2 @@ -Integration (infer.Integration)

Module Integration

module Ant : sig ... end
module Buck : sig ... end
module BuckFlavors : sig ... end
module BuckJavaFlavor : sig ... end
module CaptureCompilationDatabase : sig ... end
module Clang : sig ... end
module CompilationDatabase : sig ... end
module CostIssuesTest : sig ... end
module Differential : sig ... end
module DifferentialFilters : sig ... end
module Driver : sig ... end
module Gradle : sig ... end
module Help : sig ... end
module IssuesTest : sig ... end
module Javac : sig ... end
module JsonReports : sig ... end
module Maven : sig ... end
module NdkBuild : sig ... end
module NullsafeAnnotationGraphUtils : sig ... end
module ReportDiff : sig ... end
module TextReport : sig ... end
module TraceBugs : sig ... end
module XMLReport : sig ... end
module XcodeBuild : sig ... end
\ No newline at end of file +Integration (infer.Integration)

Module Integration

module Ant : sig ... end
module Buck : sig ... end
module BuckFlavors : sig ... end
module BuckJavaFlavor : sig ... end
module CaptureCompilationDatabase : sig ... end
module Clang : sig ... end
module CompilationDatabase : sig ... end
module ConfigImpactIssuesTest : sig ... end
module CostIssuesTest : sig ... end
module Differential : sig ... end
module DifferentialFilters : sig ... end
module Driver : sig ... end
module Gradle : sig ... end
module Help : sig ... end
module IssuesTest : sig ... end
module Javac : sig ... end
module JsonReports : sig ... end
module Maven : sig ... end
module NdkBuild : sig ... end
module NullsafeAnnotationGraphUtils : sig ... end
module ReportDiff : sig ... end
module TextReport : sig ... end
module TraceBugs : sig ... end
module XMLReport : sig ... end
module XcodeBuild : sig ... end
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/.dune-keep b/website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/index.html b/website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/index.html new file mode 100644 index 000000000..e4785ab5e --- /dev/null +++ b/website/static/odoc/next/infer/Integration__ConfigImpactIssuesTest/index.html @@ -0,0 +1,2 @@ + +Integration__ConfigImpactIssuesTest (infer.Integration__ConfigImpactIssuesTest)

Module Integration__ConfigImpactIssuesTest

val write_from_json : json_path:string -> out_path:string -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration__Differential/index.html b/website/static/odoc/next/infer/Integration__Differential/index.html index 4cabbfa55..64face1a6 100644 --- a/website/static/odoc/next/infer/Integration__Differential/index.html +++ b/website/static/odoc/next/infer/Integration__Differential/index.html @@ -1,2 +1,2 @@ -Integration__Differential (infer.Integration__Differential)

Module Integration__Differential

type t = {
introduced : ATDGenerated.Jsonbug_t.report;
fixed : ATDGenerated.Jsonbug_t.report;
preexisting : ATDGenerated.Jsonbug_t.report;
costs_summary : Yojson.Basic.t;
}
val of_reports : current_report:ATDGenerated.Jsonbug_t.report -> previous_report:ATDGenerated.Jsonbug_t.report -> current_costs:ATDGenerated.Jsonbug_t.costs_report -> previous_costs:ATDGenerated.Jsonbug_t.costs_report -> t
val to_files : t -> string -> unit
\ No newline at end of file +Integration__Differential (infer.Integration__Differential)

Module Integration__Differential

type t = {
introduced : ATDGenerated.Jsonbug_t.report;
fixed : ATDGenerated.Jsonbug_t.report;
preexisting : ATDGenerated.Jsonbug_t.report;
costs_summary : Yojson.Basic.t;
}
val issues_of_reports : current_report:ATDGenerated.Jsonbug_t.report -> previous_report:ATDGenerated.Jsonbug_t.report -> current_costs:ATDGenerated.Jsonbug_t.costs_report -> previous_costs:ATDGenerated.Jsonbug_t.costs_report -> current_config_impact:ATDGenerated.Jsonbug_t.config_impact_report -> previous_config_impact:ATDGenerated.Jsonbug_t.config_impact_report -> t
val to_files : t -> string -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Integration__ReportDiff/index.html b/website/static/odoc/next/infer/Integration__ReportDiff/index.html index 663ff6d68..78aaa2b3c 100644 --- a/website/static/odoc/next/infer/Integration__ReportDiff/index.html +++ b/website/static/odoc/next/infer/Integration__ReportDiff/index.html @@ -1,2 +1,2 @@ -Integration__ReportDiff (infer.Integration__ReportDiff)

Module Integration__ReportDiff

val reportdiff : current_report:string option -> previous_report:string option -> current_costs:string option -> previous_costs:string option -> unit
\ No newline at end of file +Integration__ReportDiff (infer.Integration__ReportDiff)

Module Integration__ReportDiff

val reportdiff : current_report:string option -> previous_report:string option -> current_costs:string option -> previous_costs:string option -> current_config_impact:string option -> previous_config_impact:string option -> unit
\ 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 35f8b8e12..15251f952 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 : 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 allocate : IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val add_dynamic_type : IR.Typ.Name.t -> PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : PulseBasicInterface.AbstractValue.t -> t -> t
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 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 listPulseBasicInterface.Invalidation.t * PulseBasicInterface.Trace.t * t) IStdlib.IStd.result
\ 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.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 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_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 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 diff --git a/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/index.html b/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/index.html index 06bf01f09..e046eaea6 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseAbductiveDomain/index.html @@ -1,2 +1,2 @@ -PulseAbductiveDomain (infer.Pulselib.PulseAbductiveDomain)

Module Pulselib.PulseAbductiveDomain

module F = Stdlib.Format
module BaseAddressAttributes = PulseBaseAddressAttributes
module BaseDomain = PulseBaseDomain
module BaseMemory = PulseBaseMemory
module BaseStack = PulseBaseStack
module type BaseDomainSig = sig ... end

signature common to the "normal" Domain, representing the post at the current program point, and the inverted PreDomain, representing the inferred pre-condition

module PostDomain : BaseDomainSig

The post abstract state at each program point, or current state.

module PreDomain : BaseDomainSig

The inferred pre-condition at each program point, biabduction style.

type isl_status =
| ISLOk

ok triple: the program executes without error

| ISLError

Error specification: an invalid address recorded in the precondition will cause an error

Execution status, similar to PulseExecutionDomain but for ISL (Incorrectness Separation Logic) mode, where PulseExecutionDomain.base_t.ContinueProgram can also contain "error specs" that describe what happens when some addresses are invalid explicitly instead of relying on MustBeValid attributes.

val equal_isl_status : isl_status -> isl_status -> bool
type t = private {
post : PostDomain.t;

state at the current program point

pre : PreDomain.t;

inferred procedure pre-condition leading to the current program point

path_condition : PulseBasicInterface.PathCondition.t;

arithmetic facts true along the path (holding for both pre and post since abstract values are immutable)

topl : PulseTopl.state;

state at of the Topl monitor at the current program point, when Topl is enabled

skipped_calls : PulseBasicInterface.SkippedCalls.t;

metadata: procedure calls for which no summary was found

isl_status : isl_status;
}

pre/post on a single program path

val equal : t -> t -> bool
val leq : lhs:t -> rhs:t -> bool
val pp : Stdlib.Format.formatter -> t -> unit
val set_isl_status : isl_status -> t -> t
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val get_pre : t -> BaseDomain.t
val get_post : t -> BaseDomain.t
module Stack : sig ... end

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

module Memory : sig ... end

memory operations like BaseMemory but that also take care of propagating facts to the precondition

module AddressAttributes : sig ... end

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

val is_local : IR.Var.t -> t -> bool
val find_post_cell_opt : PulseBasicInterface.AbstractValue.t -> t -> BaseDomain.cell option
val discard_unreachable : t -> t * Pulselib.PulseBasicInterface.AbstractValue.Set.t * PulseBasicInterface.AbstractValue.t list

garbage collect unreachable addresses in the state to make it smaller and return the new state, the live addresses, and the discarded addresses that used to have attributes attached

val add_skipped_call : IR.Procname.t -> PulseBasicInterface.Trace.t -> t -> t
val add_skipped_calls : PulseBasicInterface.SkippedCalls.t -> t -> t
val set_path_condition : PulseBasicInterface.PathCondition.t -> t -> t
type summary = private t

private type to make sure summary_of_post is always called when creating summaries

val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_post : IR.Procdesc.t -> t -> summary PulseBasicInterface.SatUnsat.t

trim the state down to just the procedure's interface (formals and globals), and simplify and normalize the state

val set_post_edges : PulseBasicInterface.AbstractValue.t -> BaseMemory.Edges.t -> t -> t

directly set the edges for the given address, bypassing abduction altogether

val set_post_cell : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> BaseDomain.cell -> IBase.Location.t -> t -> t

directly set the edges and attributes for the given address, bypassing abduction altogether

val incorporate_new_eqs : PulseBasicInterface.PathCondition.new_eqs -> t -> t

Check that the new equalities discovered are compatible with the current pre and post heaps, e.g. x = 0 is not compatible with x being allocated, and x = y is not compatible with x and y being allocated separately. In those cases, the resulting path condition is PathCondition.false_.

val initialize : PulseBasicInterface.AbstractValue.t -> t -> t

Remove "Uninitialized" attribute of the given address

val set_uninitialized : IR.Tenv.t -> [ `LocalDecl of IR.Pvar.t * PulseBasicInterface.AbstractValue.t option | `Malloc of PulseBasicInterface.AbstractValue.t ] -> IR.Typ.t -> IBase.Location.t -> t -> t

Add "Uninitialized" attributes when a variable is declared or a memory is allocated by malloc.

module Topl : sig ... end
\ No newline at end of file +PulseAbductiveDomain (infer.Pulselib.PulseAbductiveDomain)

Module Pulselib.PulseAbductiveDomain

module F = Stdlib.Format
module BaseAddressAttributes = PulseBaseAddressAttributes
module BaseDomain = PulseBaseDomain
module BaseMemory = PulseBaseMemory
module BaseStack = PulseBaseStack
module type BaseDomainSig = sig ... end

signature common to the "normal" Domain, representing the post at the current program point, and the inverted PreDomain, representing the inferred pre-condition

module PostDomain : BaseDomainSig

The post abstract state at each program point, or current state.

module PreDomain : BaseDomainSig

The inferred pre-condition at each program point, biabduction style.

type t = private {
post : PostDomain.t;

state at the current program point

pre : PreDomain.t;

inferred procedure pre-condition leading to the current program point

path_condition : PulseBasicInterface.PathCondition.t;

arithmetic facts true along the path (holding for both pre and post since abstract values are immutable)

topl : PulseTopl.state;

state at of the Topl monitor at the current program point, when Topl is enabled

skipped_calls : PulseBasicInterface.SkippedCalls.t;

metadata: procedure calls for which no summary was found

}

pre/post on a single program path

val equal : t -> t -> bool
val leq : lhs:t -> rhs:t -> bool
val pp : Stdlib.Format.formatter -> t -> unit
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val get_pre : t -> BaseDomain.t
val get_post : t -> BaseDomain.t
val simplify_instanceof : IR.Tenv.t -> t -> t
module Stack : sig ... end

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

module Memory : sig ... end

memory operations like BaseMemory but that also take care of propagating facts to the precondition

module AddressAttributes : sig ... end

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

val is_local : IR.Var.t -> t -> bool
val find_post_cell_opt : PulseBasicInterface.AbstractValue.t -> t -> BaseDomain.cell option
val discard_unreachable : t -> t * Pulselib.PulseBasicInterface.AbstractValue.Set.t * PulseBasicInterface.AbstractValue.t list

garbage collect unreachable addresses in the state to make it smaller and return the new state, the live addresses, and the discarded addresses that used to have attributes attached

val add_skipped_call : IR.Procname.t -> PulseBasicInterface.Trace.t -> t -> t
val add_skipped_calls : PulseBasicInterface.SkippedCalls.t -> t -> t
val set_path_condition : PulseBasicInterface.PathCondition.t -> t -> t
type summary = private t

private type to make sure summary_of_post is always called when creating summaries

val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_post : IR.Tenv.t -> IR.Procdesc.t -> t -> summary PulseBasicInterface.SatUnsat.t

trim the state down to just the procedure's interface (formals and globals), and simplify and normalize the state

val set_post_edges : PulseBasicInterface.AbstractValue.t -> BaseMemory.Edges.t -> t -> t

directly set the edges for the given address, bypassing abduction altogether

val set_post_cell : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> BaseDomain.cell -> IBase.Location.t -> t -> t

directly set the edges and attributes for the given address, bypassing abduction altogether

val incorporate_new_eqs : PulseBasicInterface.PathCondition.new_eqs -> t -> t

Check that the new equalities discovered are compatible with the current pre and post heaps, e.g. x = 0 is not compatible with x being allocated, and x = y is not compatible with x and y being allocated separately. In those cases, the resulting path condition is PathCondition.false_.

val initialize : PulseBasicInterface.AbstractValue.t -> t -> t

Remove "Uninitialized" attribute of the given address

val set_uninitialized : IR.Tenv.t -> [ `LocalDecl of IR.Pvar.t * PulseBasicInterface.AbstractValue.t option | `Malloc of PulseBasicInterface.AbstractValue.t ] -> IR.Typ.t -> IBase.Location.t -> t -> t

Add "Uninitialized" attributes when a variable is declared or a memory is allocated by malloc.

module Topl : sig ... end
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseAccessResult/index.html b/website/static/odoc/next/infer/Pulselib/PulseAccessResult/index.html new file mode 100644 index 000000000..5c152a3df --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib/PulseAccessResult/index.html @@ -0,0 +1,2 @@ + +PulseAccessResult (infer.Pulselib.PulseAccessResult)

Module Pulselib.PulseAccessResult

module AbductiveDomain = PulseAbductiveDomain
type 'astate error =
| ReportableError of {
astate : 'astate;
diagnostic : PulseBasicInterface.Diagnostic.t;
}
| ISLError of 'astate
type ('a, 'astate) base_t = ('a'astate error) IStdlib.IStd.result
type 'a t = ('aAbductiveDomain.t) base_t
val to_summary : IR.Tenv.t -> IR.Procdesc.t -> AbductiveDomain.t error -> AbductiveDomain.summary error PulseBasicInterface.SatUnsat.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 2b690a0d2..c219c8d5a 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.Name.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 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 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

\ 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 -> Trace.t 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 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

\ 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 23b8400b5..e9fd7c160 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.Name.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
| StdVectorReserve
| Uninitialized
| 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
val map_trace : f:(Trace.t -> Trace.t) -> t -> t

applies f to the traces found in attributes, leaving attributes without traces intact

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 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
| StdVectorReserve
| Uninitialized
| 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
val map_trace : f:(Trace.t -> Trace.t) -> t -> t

applies f to the traces found in attributes, leaving attributes without traces intact

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 d29a3965e..1edf066e0 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 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 add_dynamic_type : IR.Typ.Name.t -> PulseBasicInterface.AbstractValue.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_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 option
val get_must_be_valid_or_allocated_isl : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Trace.t option
val get_must_be_initialized : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Trace.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 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 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_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 option
val get_must_be_valid_or_allocated_isl : PulseBasicInterface.AbstractValue.t -> t -> PulseBasicInterface.Trace.t option
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 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/PulseDomainInterface/index.html b/website/static/odoc/next/infer/Pulselib/PulseDomainInterface/index.html index 23200e425..47991d8d2 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseDomainInterface/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseDomainInterface/index.html @@ -1,2 +1,2 @@ -PulseDomainInterface (infer.Pulselib.PulseDomainInterface)

Module Pulselib.PulseDomainInterface

module ExecutionDomain = PulseExecutionDomain
module AbductiveDomain = PulseAbductiveDomain

if you do any mutations of the state in pulse you probably want this module

module Stack = AbductiveDomain.Stack
module Memory = AbductiveDomain.Memory
module AddressAttributes = AbductiveDomain.AddressAttributes
module BaseDomain = PulseBaseDomain

use only if you know what you are doing or you risk break bi-abduction

module BaseStack = PulseBaseStack
module BaseMemory = PulseBaseMemory
module BaseAddressAttributes = PulseBaseAddressAttributes
module LatentIssue = PulseLatentIssue

Enforce short form usage

include sig ... end
module PulseAbductiveDomain = PulseAbductiveDomain
module PulseBaseDomain = PulseBaseDomain
module PulseBaseStack = PulseBaseStack
module PulseBaseMemory = PulseBaseMemory
module PulseBaseAddressAttributes = PulseBaseAddressAttributes
module PulseExecutionDomain = PulseExecutionDomain
module PulseLatentIssue = PulseLatentIssue
\ No newline at end of file +PulseDomainInterface (infer.Pulselib.PulseDomainInterface)

Module Pulselib.PulseDomainInterface

module AccessResult = PulseAccessResult
module ExecutionDomain = PulseExecutionDomain
module AbductiveDomain = PulseAbductiveDomain

if you do any mutations of the state in pulse you probably want this module

module Stack = AbductiveDomain.Stack
module Memory = AbductiveDomain.Memory
module AddressAttributes = AbductiveDomain.AddressAttributes
module BaseDomain = PulseBaseDomain

use only if you know what you are doing or you risk break bi-abduction

module BaseStack = PulseBaseStack
module BaseMemory = PulseBaseMemory
module BaseAddressAttributes = PulseBaseAddressAttributes
module LatentIssue = PulseLatentIssue

Enforce short form usage

include sig ... end
module PulseAbductiveDomain = PulseAbductiveDomain
module PulseAccessResult = PulseAccessResult
module PulseBaseDomain = PulseBaseDomain
module PulseBaseStack = PulseBaseStack
module PulseBaseMemory = PulseBaseMemory
module PulseBaseAddressAttributes = PulseBaseAddressAttributes
module PulseExecutionDomain = PulseExecutionDomain
module PulseLatentIssue = PulseLatentIssue
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseExecutionDomain/index.html b/website/static/odoc/next/infer/Pulselib/PulseExecutionDomain/index.html index afc38cef0..6d768c6f6 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseExecutionDomain/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseExecutionDomain/index.html @@ -1,2 +1,2 @@ -PulseExecutionDomain (infer.Pulselib.PulseExecutionDomain)

Module Pulselib.PulseExecutionDomain

module AbductiveDomain = PulseAbductiveDomain
module LatentIssue = PulseLatentIssue
type 'abductive_domain_t base_t =
| ContinueProgram of 'abductive_domain_t

represents the state at the program point

| ExitProgram of AbductiveDomain.summary

represents the state originating at exit/divergence.

| AbortProgram of AbductiveDomain.summary

represents the state at the program point that caused an error

| LatentAbortProgram of {
astate : AbductiveDomain.summary;
latent_issue : LatentIssue.t;
}

this path leads to an error but we don't have conclusive enough data to report it yet

| ISLLatentMemoryError of 'abductive_domain_t

represents the state at the program point that might cause an error; used for Config.pulse_isl

type t = AbductiveDomain.t base_t
include Absint.AbstractDomain.NoJoin with type t := t
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

val continue : AbductiveDomain.t -> t
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val is_unsat_cheap : t -> bool

see PulsePathCondition.is_unsat_cheap

type summary = AbductiveDomain.summary base_t
val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_posts : IR.Procdesc.t -> t list -> summary list
val force_exit_program : IR.Procdesc.t -> t -> t option
\ No newline at end of file +PulseExecutionDomain (infer.Pulselib.PulseExecutionDomain)

Module Pulselib.PulseExecutionDomain

module AbductiveDomain = PulseAbductiveDomain
module LatentIssue = PulseLatentIssue
type 'abductive_domain_t base_t =
| ContinueProgram of 'abductive_domain_t

represents the state at the program point

| ExitProgram of AbductiveDomain.summary

represents the state originating at exit/divergence.

| AbortProgram of AbductiveDomain.summary

represents the state at the program point that caused an error

| LatentAbortProgram of {
astate : AbductiveDomain.summary;
latent_issue : LatentIssue.t;
}

this path leads to an error but we don't have conclusive enough data to report it yet

| ISLLatentMemoryError of AbductiveDomain.summary

represents the state at the program point that might cause an error; used for Config.pulse_isl

type t = AbductiveDomain.t base_t
include Absint.AbstractDomain.NoJoin with type t := t
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

val continue : AbductiveDomain.t -> t
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val is_unsat_cheap : t -> bool

see PulsePathCondition.is_unsat_cheap

type summary = AbductiveDomain.summary base_t
val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_posts : IR.Tenv.t -> IR.Procdesc.t -> t list -> summary list
val force_exit_program : IR.Tenv.t -> IR.Procdesc.t -> t -> t option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseFormula/DynamicTypes/index.html b/website/static/odoc/next/infer/Pulselib/PulseFormula/DynamicTypes/index.html new file mode 100644 index 000000000..5ca62e86b --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib/PulseFormula/DynamicTypes/index.html @@ -0,0 +1,2 @@ + +DynamicTypes (infer.Pulselib.PulseFormula.DynamicTypes)

Module PulseFormula.DynamicTypes

Module for reasoning about dynamic types. *

val simplify : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> t -> t

Simplifies IsInstanceOf(var, typ) predicate when dynamic type information is available in state. *

\ 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 7c0e6082a..b1751ae59 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 : t -> (t * new_eqs) SatUnsat.t

think a bit harder about the formula

val simplify : keep:Var.Set.t -> t -> (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 as_int : t -> Var.t -> int option
val has_no_assumptions : t -> bool
val get_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the 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 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) -> keep:Var.Set.t -> t -> (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 as_int : t -> Var.t -> int option
val has_no_assumptions : t -> bool
val get_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the equality relation

module DynamicTypes : sig ... end

Module for reasoning about dynamic types. *

\ 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 52e8248ac..3c1344ae1 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 : IR.Procname.t -> IBase.Location.t -> callee_prepost:PulseDomainInterface.AbductiveDomain.t -> captured_vars_with_actuals:(IR.Var.t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.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) PulseReport.access_result PulseBasicInterface.SatUnsat.t
\ No newline at end of file +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)) 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) PulseDomainInterface.AccessResult.t PulseBasicInterface.SatUnsat.t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseLatentIssue/index.html b/website/static/odoc/next/infer/Pulselib/PulseLatentIssue/index.html index ee5a0a440..5f47e9aa6 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseLatentIssue/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseLatentIssue/index.html @@ -1,2 +1,2 @@ -PulseLatentIssue (infer.Pulselib.PulseLatentIssue)

Module Pulselib.PulseLatentIssue

module AbductiveDomain = PulseAbductiveDomain
type t =
| AccessToInvalidAddress of PulseBasicInterface.Diagnostic.access_to_invalid_address
| ReadUninitializedValue of PulseBasicInterface.Diagnostic.read_uninitialized_value
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val to_diagnostic : t -> PulseBasicInterface.Diagnostic.t
val should_report : AbductiveDomain.summary -> bool
val should_report_diagnostic : AbductiveDomain.summary -> PulseBasicInterface.Diagnostic.t -> [ `ReportNow | `DelayReport of t ]
val add_call : (PulseBasicInterface.CallEvent.t * IBase.Location.t) -> t -> t
\ No newline at end of file +PulseLatentIssue (infer.Pulselib.PulseLatentIssue)

Module Pulselib.PulseLatentIssue

module AbductiveDomain = PulseAbductiveDomain
type t =
| AccessToInvalidAddress of PulseBasicInterface.Diagnostic.access_to_invalid_address
| ReadUninitializedValue of PulseBasicInterface.Diagnostic.read_uninitialized_value
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val to_diagnostic : t -> PulseBasicInterface.Diagnostic.t
val should_report : AbductiveDomain.summary PulseAccessResult.error -> [> `DelayReport of AbductiveDomain.summary * t | `ReportNow of AbductiveDomain.summary * PulseBasicInterface.Diagnostic.t | `ISLDelay of AbductiveDomain.summary ]
val add_call : (PulseBasicInterface.CallEvent.t * IBase.Location.t) -> t -> 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 919182a25..93b1574c0 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)

Module Pulselib.PulseModels

type model = PulseSummary.t Absint.InterproceduralAnalysis.t -> callee_procname:IR.Procname.t -> IBase.Location.t -> ret:(IR.Ident.t * IR.Typ.t) -> PulseDomainInterface.AbductiveDomain.t -> PulseDomainInterface.ExecutionDomain.t PulseOperations.access_result list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
\ No newline at end of file +PulseModels (infer.Pulselib.PulseModels)

Module Pulselib.PulseModels

type model = PulseSummary.t Absint.InterproceduralAnalysis.t -> callee_procname:IR.Procname.t -> IBase.Location.t -> ret:(IR.Ident.t * IR.Typ.t) -> PulseDomainInterface.AbductiveDomain.t -> PulseDomainInterface.ExecutionDomain.t PulseDomainInterface.AccessResult.t list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseObjectiveCSummary/index.html b/website/static/odoc/next/infer/Pulselib/PulseObjectiveCSummary/index.html new file mode 100644 index 000000000..3af085be4 --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib/PulseObjectiveCSummary/index.html @@ -0,0 +1,2 @@ + +PulseObjectiveCSummary (infer.Pulselib.PulseObjectiveCSummary)

Module Pulselib.PulseObjectiveCSummary

val update_objc_method_posts : PulseSummary.t Absint.InterproceduralAnalysis.t -> initial_astate:PulseDomainInterface.ExecutionDomain.t -> posts:PulseDomainInterface.ExecutionDomain.t list -> PulseDomainInterface.ExecutionDomain.t list

For ObjC instance methods: adds path condition `self > 0` to given posts and appends additional nil summary. Does nothing to posts for other kinds of methods

\ 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 16eb155ba..459221cd5 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 -> (tPulseBasicInterface.Diagnostic.t * t) IStdlib.IStd.result

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 : 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/Import/index.html b/website/static/odoc/next/infer/Pulselib/PulseOperations/Import/index.html index 7a939ea38..fc07431b7 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseOperations/Import/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseOperations/Import/index.html @@ -1,2 +1,2 @@ -Import (infer.Pulselib.PulseOperations.Import)

Module PulseOperations.Import

For opening in other modules.

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 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;
}
| ISLLatentMemoryError of 'abductive_domain_t
type 'a access_result = 'a PulseReport.access_result

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 access_result -> ('a -> 'b access_result list) -> 'b access_result list

monadic "bind" but not really that turns an access_result into a list of access_results (not really because the first type is not an access_result list but just an access_result)

val let<+> : 'a access_result -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t base_t access_result list

monadic "map" but even less really that turns an access_result into an analysis result

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

Module PulseOperations.Import

For opening in other modules.

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;
}
| ISLLatentMemoryError of PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error = 'astate PulseDomainInterface.AccessResult.error =
| ReportableError of {
astate : 'astate;
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

\ 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 400574a60..3c87172f8 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 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;
}
| ISLLatentMemoryError of 'abductive_domain_t
type 'a access_result = 'a PulseReport.access_result

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 access_result -> ('a -> 'b access_result list) -> 'b access_result list

monadic "bind" but not really that turns an access_result into a list of access_results (not really because the first type is not an access_result list but just an access_result)

val let<+> : 'a access_result -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t base_t access_result list

monadic "map" but even less really that turns an access_result into an analysis result

type t = PulseDomainInterface.AbductiveDomain.t
val check_addr_access : access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t access_result

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

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)) list) access_result

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 access_result
val eval_deref : IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) access_result

Like eval but evaluates *exp.

val eval_deref_isl : IBase.Location.t -> IR.Exp.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) list access_result
val eval_access : access_mode -> IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> Pulselib.PulseDomainInterface.BaseMemory.Access.t -> t -> (t * (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t)) access_result

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 havoc_id : IR.Ident.t -> PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_field : IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> PulseBasicInterface.ValueHistory.t -> t -> t access_result
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 access_result

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 access_result

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 access_result

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 list access_result
val invalidate : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t access_result

record that the address is invalid

val invalidate_biad_isl : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t list access_result

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.Name.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 access_result

record that what the address points via the access to is invalid

val invalidate_array_elements : IBase.Location.t -> PulseBasicInterface.Invalidation.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t access_result

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

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.Name.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 access_result
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.ValueHistory.t -> t -> t access_result
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 access_result 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 +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;
}
| ISLLatentMemoryError of PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error = 'astate PulseDomainInterface.AccessResult.error =
| ReportableError of {
astate : 'astate;
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 : 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 : 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 : 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 havoc_id : IR.Ident.t -> PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_field : IBase.Location.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> PulseBasicInterface.ValueHistory.t -> t -> t PulseDomainInterface.AccessResult.t
val realloc_pvar : IR.Tenv.t -> IR.Pvar.t -> IR.Typ.t -> IBase.Location.t -> t -> t
val write_id : IR.Ident.t -> (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t
val write_field : IBase.Location.t -> ref:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> t -> t PulseDomainInterface.AccessResult.t

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
val invalidate : 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_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.Tenv.t -> IR.Var.t list -> IBase.Location.t -> t -> t PulseDomainInterface.AccessResult.t
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> PulseBasicInterface.AbstractValue.t -> PulseBasicInterface.ValueHistory.t -> t -> t PulseDomainInterface.AccessResult.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 diff --git a/website/static/odoc/next/infer/Pulselib/PulsePathCondition/index.html b/website/static/odoc/next/infer/Pulselib/PulsePathCondition/index.html index 453dfebbc..8549f8434 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 : keep:AbstractValue.Set.t -> t -> (t * new_eqs) SatUnsat.t

simplify ~keep phi attempts to get rid of as many variables in fv phi but not in keep as possible

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 : t -> t * bool * new_eqs

whether the state contains a contradiction, only call this when you absolutely have to

val as_int : t -> AbstractValue.t -> int option

as_int phi t returns an integer x such that phi |- t = x, if known for sure; see also is_known_zero

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation

\ 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 -> keep:AbstractValue.Set.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> (t * new_eqs) SatUnsat.t

simplify ~keep phi attempts to get rid of as many variables in fv phi but not in keep as possible

val simplify_instanceof : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t
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 as_int : t -> AbstractValue.t -> int option

as_int phi t returns an integer x such that phi |- t = x, if known for sure; see also is_known_zero

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation

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

Module Pulselib.PulseReport

type 'a access_result = ('aPulseBasicInterface.Diagnostic.t * PulseDomainInterface.AbductiveDomain.t) IStdlib.IStd.result
val report_list_result : PulseSummary.t Absint.InterproceduralAnalysis.t -> PulseDomainInterface.AbductiveDomain.t list access_result -> PulseDomainInterface.ExecutionDomain.t list
val report_results : PulseSummary.t Absint.InterproceduralAnalysis.t -> PulseDomainInterface.ExecutionDomain.t access_result list -> PulseDomainInterface.ExecutionDomain.t list
\ No newline at end of file +PulseReport (infer.Pulselib.PulseReport)

Module Pulselib.PulseReport

val report_result : PulseSummary.t Absint.InterproceduralAnalysis.t -> PulseDomainInterface.AbductiveDomain.t PulseDomainInterface.AccessResult.t -> PulseDomainInterface.ExecutionDomain.t list
val report_results : PulseSummary.t Absint.InterproceduralAnalysis.t -> PulseDomainInterface.AbductiveDomain.t PulseDomainInterface.AccessResult.t list -> PulseDomainInterface.ExecutionDomain.t list
val report_exec_results : PulseSummary.t Absint.InterproceduralAnalysis.t -> PulseDomainInterface.ExecutionDomain.t PulseDomainInterface.AccessResult.t list -> PulseDomainInterface.ExecutionDomain.t list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseSummary/index.html b/website/static/odoc/next/infer/Pulselib/PulseSummary/index.html index 649196d84..309c9f709 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseSummary/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseSummary/index.html @@ -1,2 +1,2 @@ -PulseSummary (infer.Pulselib.PulseSummary)

Module Pulselib.PulseSummary

type t = PulseDomainInterface.ExecutionDomain.summary list
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val of_posts : IR.Procdesc.t -> PulseDomainInterface.ExecutionDomain.t list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file +PulseSummary (infer.Pulselib.PulseSummary)

Module Pulselib.PulseSummary

type t = PulseDomainInterface.ExecutionDomain.summary list
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val of_posts : IR.Tenv.t -> IR.Procdesc.t -> PulseDomainInterface.ExecutionDomain.t list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib/PulseTopl/index.html b/website/static/odoc/next/infer/Pulselib/PulseTopl/index.html index 05b66ad3c..2972e6c67 100644 --- a/website/static/odoc/next/infer/Pulselib/PulseTopl/index.html +++ b/website/static/odoc/next/infer/Pulselib/PulseTopl/index.html @@ -1,2 +1,2 @@ -PulseTopl (infer.Pulselib.PulseTopl)

Module Pulselib.PulseTopl

type value = PulseAbstractValue.t
type event =
| ArrayWrite of {
aw_array : value;
aw_index : value;
}
| Call of {
return : value option;
arguments : value list;
procname : IR.Procname.t;
}
type state
val compare_state : state -> state -> int
val equal_state : state -> state -> bool
val start : unit -> state

Return the initial state of Topl.automaton ().

val small_step : IBase.Location.t -> PulsePathCondition.t -> event -> state -> state
val large_step : call_location:IBase.Location.t -> callee_proc_name:IR.Procname.t -> substitution:(PulseAbstractValue.t * PulseValueHistory.t) Pulselib.PulseAbstractValue.Map.t -> condition:PulsePathCondition.t -> callee_prepost:state -> state -> state

large_step ~substitution ~condition state ~callee_prepost updates state according to callee_prepost. The abstract values in condition and state are in one scope, and those in callee_prepost in another scope: the substitution maps from the callee scope to the condition&state scope.

val filter_for_summary : PulsePathCondition.t -> state -> state

Remove from state those parts that are inconsistent with the path condition. (We do a cheap check to not introduce inconsistent Topl states, but they mey become inconsistent because the program path condition is updated later.)

val simplify : keep:Pulselib.PulseAbstractValue.Set.t -> state -> state

Keep only a subset of abstract values. This is used for extracting summaries.

val report_errors : IR.Procdesc.t -> Absint.Errlog.t -> state -> unit

Calls Reporting.log_issue with error traces, if any.

val pp_state : Stdlib.Format.formatter -> state -> unit
\ No newline at end of file +PulseTopl (infer.Pulselib.PulseTopl)

Module Pulselib.PulseTopl

type value = PulseAbstractValue.t
type event =
| ArrayWrite of {
aw_array : value;
aw_index : value;
}
| Call of {
return : value option;
arguments : value list;
procname : IR.Procname.t;
}
type state
val compare_state : state -> state -> int
val equal_state : state -> state -> bool
val start : unit -> state

Return the initial state of Topl.automaton ().

val small_step : IBase.Location.t -> PulsePathCondition.t -> event -> state -> state
val large_step : call_location:IBase.Location.t -> callee_proc_name:IR.Procname.t -> substitution:(value * PulseValueHistory.t) Pulselib.PulseAbstractValue.Map.t -> condition:PulsePathCondition.t -> callee_prepost:state -> state -> state

large_step ~substitution ~condition state ~callee_prepost updates state according to callee_prepost. The abstract values in condition and state are in one scope, and those in callee_prepost in another scope: the substitution maps from the callee scope to the condition&state scope.

val filter_for_summary : PulsePathCondition.t -> state -> state

Remove from state those parts that are inconsistent with the path condition. (We do a cheap check to not introduce inconsistent Topl states, but they mey become inconsistent because the program path condition is updated later.)

val simplify : keep:Pulselib.PulseAbstractValue.Set.t -> state -> state

Keep only a subset of abstract values. This is used for extracting summaries.

val report_errors : IR.Procdesc.t -> Absint.Errlog.t -> state -> unit

Calls Reporting.log_issue with error traces, if any.

val pp_state : Stdlib.Format.formatter -> state -> 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 dc25e2bea..aeda48eba 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 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 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 PulseToplShallow : sig ... end
module PulseTrace : sig ... end
module PulseUninitBlocklist : sig ... end
module PulseValueHistory : 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 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 PulseToplShallow : sig ... end
module PulseTrace : sig ... end
module PulseUninitBlocklist : sig ... end
module PulseValueHistory : 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 43c9b4cb9..6da1cbb48 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 : 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 allocate : IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IBase.Location.t -> t -> t
val add_dynamic_type : IR.Typ.Name.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
val remove_allocation_attr : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t
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 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 listPulselib.PulseBasicInterface.Invalidation.t * Pulselib.PulseBasicInterface.Trace.t * t) IStdlib.IStd.result
\ 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.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 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_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 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 diff --git a/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/index.html b/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/index.html index acadba488..eb2d6a04e 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseAbductiveDomain/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseAbductiveDomain (infer.Pulselib__PulseAbductiveDomain)

Module Pulselib__PulseAbductiveDomain

module F = Stdlib.Format
module BaseAddressAttributes = Pulselib.PulseBaseAddressAttributes
module BaseDomain = Pulselib.PulseBaseDomain
module BaseMemory = Pulselib.PulseBaseMemory
module BaseStack = Pulselib.PulseBaseStack
module type BaseDomainSig = sig ... end

signature common to the "normal" Domain, representing the post at the current program point, and the inverted PreDomain, representing the inferred pre-condition

module PostDomain : BaseDomainSig

The post abstract state at each program point, or current state.

module PreDomain : BaseDomainSig

The inferred pre-condition at each program point, biabduction style.

type isl_status =
| ISLOk

ok triple: the program executes without error

| ISLError

Error specification: an invalid address recorded in the precondition will cause an error

Execution status, similar to PulseExecutionDomain but for ISL (Incorrectness Separation Logic) mode, where PulseExecutionDomain.ContinueProgram can also contain "error specs" that describe what happens when some addresses are invalid explicitly instead of relying on MustBeValid attributes.

val equal_isl_status : isl_status -> isl_status -> bool
type t = private {
post : PostDomain.t;

state at the current program point

pre : PreDomain.t;

inferred procedure pre-condition leading to the current program point

path_condition : Pulselib.PulseBasicInterface.PathCondition.t;

arithmetic facts true along the path (holding for both pre and post since abstract values are immutable)

topl : Pulselib.PulseTopl.state;

state at of the Topl monitor at the current program point, when Topl is enabled

skipped_calls : Pulselib.PulseBasicInterface.SkippedCalls.t;

metadata: procedure calls for which no summary was found

isl_status : isl_status;
}

pre/post on a single program path

val equal : t -> t -> bool
val leq : lhs:t -> rhs:t -> bool
val pp : Stdlib.Format.formatter -> t -> unit
val set_isl_status : isl_status -> t -> t
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val get_pre : t -> BaseDomain.t
val get_post : t -> BaseDomain.t
module Stack : sig ... end

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

module Memory : sig ... end

memory operations like BaseMemory but that also take care of propagating facts to the precondition

module AddressAttributes : sig ... end

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

val is_local : IR.Var.t -> t -> bool
val find_post_cell_opt : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> BaseDomain.cell option
val discard_unreachable : t -> t * Pulselib.PulseBasicInterface.AbstractValue.Set.t * Pulselib.PulseBasicInterface.AbstractValue.t list

garbage collect unreachable addresses in the state to make it smaller and return the new state, the live addresses, and the discarded addresses that used to have attributes attached

val add_skipped_call : IR.Procname.t -> Pulselib.PulseBasicInterface.Trace.t -> t -> t
val add_skipped_calls : Pulselib.PulseBasicInterface.SkippedCalls.t -> t -> t
val set_path_condition : Pulselib.PulseBasicInterface.PathCondition.t -> t -> t
type summary = private t

private type to make sure summary_of_post is always called when creating summaries

val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_post : IR.Procdesc.t -> t -> summary Pulselib.PulseBasicInterface.SatUnsat.t

trim the state down to just the procedure's interface (formals and globals), and simplify and normalize the state

val set_post_edges : Pulselib.PulseBasicInterface.AbstractValue.t -> BaseMemory.Edges.t -> t -> t

directly set the edges for the given address, bypassing abduction altogether

val set_post_cell : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> BaseDomain.cell -> IBase.Location.t -> t -> t

directly set the edges and attributes for the given address, bypassing abduction altogether

val incorporate_new_eqs : Pulselib.PulseBasicInterface.PathCondition.new_eqs -> t -> t

Check that the new equalities discovered are compatible with the current pre and post heaps, e.g. x = 0 is not compatible with x being allocated, and x = y is not compatible with x and y being allocated separately. In those cases, the resulting path condition is PathCondition.false_.

val initialize : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t

Remove "Uninitialized" attribute of the given address

val set_uninitialized : IR.Tenv.t -> [ `LocalDecl of IR.Pvar.t * Pulselib.PulseBasicInterface.AbstractValue.t option | `Malloc of Pulselib.PulseBasicInterface.AbstractValue.t ] -> IR.Typ.t -> IBase.Location.t -> t -> t

Add "Uninitialized" attributes when a variable is declared or a memory is allocated by malloc.

module Topl : sig ... end
\ No newline at end of file +Pulselib__PulseAbductiveDomain (infer.Pulselib__PulseAbductiveDomain)

Module Pulselib__PulseAbductiveDomain

module F = Stdlib.Format
module BaseAddressAttributes = Pulselib.PulseBaseAddressAttributes
module BaseDomain = Pulselib.PulseBaseDomain
module BaseMemory = Pulselib.PulseBaseMemory
module BaseStack = Pulselib.PulseBaseStack
module type BaseDomainSig = sig ... end

signature common to the "normal" Domain, representing the post at the current program point, and the inverted PreDomain, representing the inferred pre-condition

module PostDomain : BaseDomainSig

The post abstract state at each program point, or current state.

module PreDomain : BaseDomainSig

The inferred pre-condition at each program point, biabduction style.

type t = private {
post : PostDomain.t;

state at the current program point

pre : PreDomain.t;

inferred procedure pre-condition leading to the current program point

path_condition : Pulselib.PulseBasicInterface.PathCondition.t;

arithmetic facts true along the path (holding for both pre and post since abstract values are immutable)

topl : Pulselib.PulseTopl.state;

state at of the Topl monitor at the current program point, when Topl is enabled

skipped_calls : Pulselib.PulseBasicInterface.SkippedCalls.t;

metadata: procedure calls for which no summary was found

}

pre/post on a single program path

val equal : t -> t -> bool
val leq : lhs:t -> rhs:t -> bool
val pp : Stdlib.Format.formatter -> t -> unit
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val get_pre : t -> BaseDomain.t
val get_post : t -> BaseDomain.t
val simplify_instanceof : IR.Tenv.t -> t -> t
module Stack : sig ... end

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

module Memory : sig ... end

memory operations like BaseMemory but that also take care of propagating facts to the precondition

module AddressAttributes : sig ... end

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

val is_local : IR.Var.t -> t -> bool
val find_post_cell_opt : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> BaseDomain.cell option
val discard_unreachable : t -> t * Pulselib.PulseBasicInterface.AbstractValue.Set.t * Pulselib.PulseBasicInterface.AbstractValue.t list

garbage collect unreachable addresses in the state to make it smaller and return the new state, the live addresses, and the discarded addresses that used to have attributes attached

val add_skipped_call : IR.Procname.t -> Pulselib.PulseBasicInterface.Trace.t -> t -> t
val add_skipped_calls : Pulselib.PulseBasicInterface.SkippedCalls.t -> t -> t
val set_path_condition : Pulselib.PulseBasicInterface.PathCondition.t -> t -> t
type summary = private t

private type to make sure summary_of_post is always called when creating summaries

val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_post : IR.Tenv.t -> IR.Procdesc.t -> t -> summary Pulselib.PulseBasicInterface.SatUnsat.t

trim the state down to just the procedure's interface (formals and globals), and simplify and normalize the state

val set_post_edges : Pulselib.PulseBasicInterface.AbstractValue.t -> BaseMemory.Edges.t -> t -> t

directly set the edges for the given address, bypassing abduction altogether

val set_post_cell : (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> BaseDomain.cell -> IBase.Location.t -> t -> t

directly set the edges and attributes for the given address, bypassing abduction altogether

val incorporate_new_eqs : Pulselib.PulseBasicInterface.PathCondition.new_eqs -> t -> t

Check that the new equalities discovered are compatible with the current pre and post heaps, e.g. x = 0 is not compatible with x being allocated, and x = y is not compatible with x and y being allocated separately. In those cases, the resulting path condition is PathCondition.false_.

val initialize : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> t

Remove "Uninitialized" attribute of the given address

val set_uninitialized : IR.Tenv.t -> [ `LocalDecl of IR.Pvar.t * Pulselib.PulseBasicInterface.AbstractValue.t option | `Malloc of Pulselib.PulseBasicInterface.AbstractValue.t ] -> IR.Typ.t -> IBase.Location.t -> t -> t

Add "Uninitialized" attributes when a variable is declared or a memory is allocated by malloc.

module Topl : sig ... end
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseAccessResult/.dune-keep b/website/static/odoc/next/infer/Pulselib__PulseAccessResult/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/Pulselib__PulseAccessResult/index.html b/website/static/odoc/next/infer/Pulselib__PulseAccessResult/index.html new file mode 100644 index 000000000..95cb29899 --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib__PulseAccessResult/index.html @@ -0,0 +1,2 @@ + +Pulselib__PulseAccessResult (infer.Pulselib__PulseAccessResult)

Module Pulselib__PulseAccessResult

module AbductiveDomain = Pulselib.PulseAbductiveDomain
type 'astate error =
| ReportableError of {
astate : 'astate;
diagnostic : Pulselib.PulseBasicInterface.Diagnostic.t;
}
| ISLError of 'astate
type ('a, 'astate) base_t = ('a'astate error) IStdlib.IStd.result
type 'a t = ('aAbductiveDomain.t) base_t
val to_summary : IR.Tenv.t -> IR.Procdesc.t -> AbductiveDomain.t error -> AbductiveDomain.summary error Pulselib.PulseBasicInterface.SatUnsat.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 4425d4bfa..0dc0b6351 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.Name.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 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 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

\ 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 -> Trace.t 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 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

\ 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 f084eae35..a662f0a6b 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.Name.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
| StdVectorReserve
| Uninitialized
| 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
val map_trace : f:(Trace.t -> Trace.t) -> t -> t

applies f to the traces found in attributes, leaving attributes without traces intact

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 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
| StdVectorReserve
| Uninitialized
| 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
val map_trace : f:(Trace.t -> Trace.t) -> t -> t

applies f to the traces found in attributes, leaving attributes without traces intact

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 d414762b9..466e8fbd8 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 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 add_dynamic_type : IR.Typ.Name.t -> Pulselib.PulseBasicInterface.AbstractValue.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_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 option
val get_must_be_valid_or_allocated_isl : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Trace.t option
val get_must_be_initialized : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Trace.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 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 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_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 option
val get_must_be_valid_or_allocated_isl : Pulselib.PulseBasicInterface.AbstractValue.t -> t -> Pulselib.PulseBasicInterface.Trace.t option
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 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__PulseDomainInterface/index.html b/website/static/odoc/next/infer/Pulselib__PulseDomainInterface/index.html index a993d16fe..344338c8a 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseDomainInterface/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseDomainInterface/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseDomainInterface (infer.Pulselib__PulseDomainInterface)

Module Pulselib__PulseDomainInterface

module ExecutionDomain = Pulselib.PulseExecutionDomain
module AbductiveDomain = Pulselib.PulseAbductiveDomain

if you do any mutations of the state in pulse you probably want this module

module Stack = AbductiveDomain.Stack
module Memory = AbductiveDomain.Memory
module AddressAttributes = AbductiveDomain.AddressAttributes
module BaseDomain = Pulselib.PulseBaseDomain

use only if you know what you are doing or you risk break bi-abduction

module BaseStack = Pulselib.PulseBaseStack
module BaseMemory = Pulselib.PulseBaseMemory
module BaseAddressAttributes = Pulselib.PulseBaseAddressAttributes
module LatentIssue = Pulselib.PulseLatentIssue

Enforce short form usage

include sig ... end
module PulseAbductiveDomain = Pulselib.PulseAbductiveDomain
module PulseBaseDomain = Pulselib.PulseBaseDomain
module PulseBaseStack = Pulselib.PulseBaseStack
module PulseBaseMemory = Pulselib.PulseBaseMemory
module PulseBaseAddressAttributes = Pulselib.PulseBaseAddressAttributes
module PulseExecutionDomain = Pulselib.PulseExecutionDomain
module PulseLatentIssue = Pulselib.PulseLatentIssue
\ No newline at end of file +Pulselib__PulseDomainInterface (infer.Pulselib__PulseDomainInterface)

Module Pulselib__PulseDomainInterface

module AccessResult = Pulselib.PulseAccessResult
module ExecutionDomain = Pulselib.PulseExecutionDomain
module AbductiveDomain = Pulselib.PulseAbductiveDomain

if you do any mutations of the state in pulse you probably want this module

module Stack = AbductiveDomain.Stack
module Memory = AbductiveDomain.Memory
module AddressAttributes = AbductiveDomain.AddressAttributes
module BaseDomain = Pulselib.PulseBaseDomain

use only if you know what you are doing or you risk break bi-abduction

module BaseStack = Pulselib.PulseBaseStack
module BaseMemory = Pulselib.PulseBaseMemory
module BaseAddressAttributes = Pulselib.PulseBaseAddressAttributes
module LatentIssue = Pulselib.PulseLatentIssue

Enforce short form usage

include sig ... end
module PulseAbductiveDomain = Pulselib.PulseAbductiveDomain
module PulseAccessResult = Pulselib.PulseAccessResult
module PulseBaseDomain = Pulselib.PulseBaseDomain
module PulseBaseStack = Pulselib.PulseBaseStack
module PulseBaseMemory = Pulselib.PulseBaseMemory
module PulseBaseAddressAttributes = Pulselib.PulseBaseAddressAttributes
module PulseExecutionDomain = Pulselib.PulseExecutionDomain
module PulseLatentIssue = Pulselib.PulseLatentIssue
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseExecutionDomain/index.html b/website/static/odoc/next/infer/Pulselib__PulseExecutionDomain/index.html index 541ea664c..99d6a8694 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseExecutionDomain/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseExecutionDomain/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseExecutionDomain (infer.Pulselib__PulseExecutionDomain)

Module Pulselib__PulseExecutionDomain

module AbductiveDomain = Pulselib.PulseAbductiveDomain
module LatentIssue = Pulselib.PulseLatentIssue
type 'abductive_domain_t base_t =
| ContinueProgram of 'abductive_domain_t

represents the state at the program point

| ExitProgram of AbductiveDomain.summary

represents the state originating at exit/divergence.

| AbortProgram of AbductiveDomain.summary

represents the state at the program point that caused an error

| LatentAbortProgram of {
astate : AbductiveDomain.summary;
latent_issue : LatentIssue.t;
}

this path leads to an error but we don't have conclusive enough data to report it yet

| ISLLatentMemoryError of 'abductive_domain_t

represents the state at the program point that might cause an error; used for Config.pulse_isl

type t = AbductiveDomain.t base_t
include Absint.AbstractDomain.NoJoin with type t := t
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

val continue : AbductiveDomain.t -> t
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val is_unsat_cheap : t -> bool

see PulsePathCondition.is_unsat_cheap

type summary = AbductiveDomain.summary base_t
val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_posts : IR.Procdesc.t -> t list -> summary list
val force_exit_program : IR.Procdesc.t -> t -> t option
\ No newline at end of file +Pulselib__PulseExecutionDomain (infer.Pulselib__PulseExecutionDomain)

Module Pulselib__PulseExecutionDomain

module AbductiveDomain = Pulselib.PulseAbductiveDomain
module LatentIssue = Pulselib.PulseLatentIssue
type 'abductive_domain_t base_t =
| ContinueProgram of 'abductive_domain_t

represents the state at the program point

| ExitProgram of AbductiveDomain.summary

represents the state originating at exit/divergence.

| AbortProgram of AbductiveDomain.summary

represents the state at the program point that caused an error

| LatentAbortProgram of {
astate : AbductiveDomain.summary;
latent_issue : LatentIssue.t;
}

this path leads to an error but we don't have conclusive enough data to report it yet

| ISLLatentMemoryError of AbductiveDomain.summary

represents the state at the program point that might cause an error; used for Config.pulse_isl

type t = AbductiveDomain.t base_t
include Absint.AbstractDomain.NoJoin with type t := t
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

val continue : AbductiveDomain.t -> t
val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
val is_unsat_cheap : t -> bool

see PulsePathCondition.is_unsat_cheap

type summary = AbductiveDomain.summary base_t
val compare_summary : summary -> summary -> int
val equal_summary : summary -> summary -> bool
val yojson_of_summary : summary -> Ppx_yojson_conv_lib.Yojson.Safe.t
val summary_of_posts : IR.Tenv.t -> IR.Procdesc.t -> t list -> summary list
val force_exit_program : IR.Tenv.t -> IR.Procdesc.t -> t -> t option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseFormula/DynamicTypes/index.html b/website/static/odoc/next/infer/Pulselib__PulseFormula/DynamicTypes/index.html new file mode 100644 index 000000000..cdc0b1de0 --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib__PulseFormula/DynamicTypes/index.html @@ -0,0 +1,2 @@ + +DynamicTypes (infer.Pulselib__PulseFormula.DynamicTypes)

Module Pulselib__PulseFormula.DynamicTypes

Module for reasoning about dynamic types. *

val simplify : IR.Tenv.t -> get_dynamic_type:(Var.t -> IR.Typ.t option) -> t -> t

Simplifies IsInstanceOf(var, typ) predicate when dynamic type information is available in state. *

\ 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 e65c0c02e..f7569e610 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 : t -> (t * new_eqs) SatUnsat.t

think a bit harder about the formula

val simplify : keep:Var.Set.t -> t -> (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 as_int : t -> Var.t -> int option
val has_no_assumptions : t -> bool
val get_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the 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 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) -> keep:Var.Set.t -> t -> (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 as_int : t -> Var.t -> int option
val has_no_assumptions : t -> bool
val get_var_repr : t -> Var.t -> Var.t

get the canonical representative for the variable according to the equality relation

module DynamicTypes : sig ... end

Module for reasoning about dynamic types. *

\ 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 6638053f7..5494ed76b 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 : 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)) 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.PulseReport.access_result Pulselib.PulseBasicInterface.SatUnsat.t
\ No newline at end of file +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)) 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.PulseDomainInterface.AccessResult.t Pulselib.PulseBasicInterface.SatUnsat.t
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseLatentIssue/index.html b/website/static/odoc/next/infer/Pulselib__PulseLatentIssue/index.html index 7a4c28d39..0d42b23c0 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseLatentIssue/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseLatentIssue/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseLatentIssue (infer.Pulselib__PulseLatentIssue)

Module Pulselib__PulseLatentIssue

module AbductiveDomain = Pulselib.PulseAbductiveDomain
type t =
| AccessToInvalidAddress of Pulselib.PulseBasicInterface.Diagnostic.access_to_invalid_address
| ReadUninitializedValue of Pulselib.PulseBasicInterface.Diagnostic.read_uninitialized_value
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val to_diagnostic : t -> Pulselib.PulseBasicInterface.Diagnostic.t
val should_report : AbductiveDomain.summary -> bool
val should_report_diagnostic : AbductiveDomain.summary -> Pulselib.PulseBasicInterface.Diagnostic.t -> [ `ReportNow | `DelayReport of t ]
val add_call : (Pulselib.PulseBasicInterface.CallEvent.t * IBase.Location.t) -> t -> t
\ No newline at end of file +Pulselib__PulseLatentIssue (infer.Pulselib__PulseLatentIssue)

Module Pulselib__PulseLatentIssue

module AbductiveDomain = Pulselib.PulseAbductiveDomain
type t =
| AccessToInvalidAddress of Pulselib.PulseBasicInterface.Diagnostic.access_to_invalid_address
| ReadUninitializedValue of Pulselib.PulseBasicInterface.Diagnostic.read_uninitialized_value
val compare : t -> t -> int
val equal : t -> t -> bool
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val to_diagnostic : t -> Pulselib.PulseBasicInterface.Diagnostic.t
val should_report : AbductiveDomain.summary Pulselib.PulseAccessResult.error -> [> `DelayReport of AbductiveDomain.summary * t | `ReportNow of AbductiveDomain.summary * Pulselib.PulseBasicInterface.Diagnostic.t | `ISLDelay of AbductiveDomain.summary ]
val add_call : (Pulselib.PulseBasicInterface.CallEvent.t * IBase.Location.t) -> t -> 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 208cb6388..e90795d36 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)

Module Pulselib__PulseModels

type model = Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> callee_procname:IR.Procname.t -> IBase.Location.t -> ret:(IR.Ident.t * IR.Typ.t) -> Pulselib.PulseDomainInterface.AbductiveDomain.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseOperations.access_result list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
\ No newline at end of file +Pulselib__PulseModels (infer.Pulselib__PulseModels)

Module Pulselib__PulseModels

type model = Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> callee_procname:IR.Procname.t -> IBase.Location.t -> ret:(IR.Ident.t * IR.Typ.t) -> Pulselib.PulseDomainInterface.AbductiveDomain.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseDomainInterface.AccessResult.t list
val dispatch : IR.Tenv.t -> IR.Procname.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) Absint.ProcnameDispatcher.Call.FuncArg.t list -> model option
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/.dune-keep b/website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/.dune-keep new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/index.html b/website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/index.html new file mode 100644 index 000000000..fc198a631 --- /dev/null +++ b/website/static/odoc/next/infer/Pulselib__PulseObjectiveCSummary/index.html @@ -0,0 +1,2 @@ + +Pulselib__PulseObjectiveCSummary (infer.Pulselib__PulseObjectiveCSummary)

Module Pulselib__PulseObjectiveCSummary

val update_objc_method_posts : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> initial_astate:Pulselib.PulseDomainInterface.ExecutionDomain.t -> posts:Pulselib.PulseDomainInterface.ExecutionDomain.t list -> Pulselib.PulseDomainInterface.ExecutionDomain.t list

For ObjC instance methods: adds path condition `self > 0` to given posts and appends additional nil summary. Does nothing to posts for other kinds of methods

\ 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 77bfaeac5..06e2edbe4 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 -> (tPulselib.PulseBasicInterface.Diagnostic.t * t) IStdlib.IStd.result

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 : 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/Import/index.html b/website/static/odoc/next/infer/Pulselib__PulseOperations/Import/index.html index 31b800ee9..b26388e33 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseOperations/Import/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseOperations/Import/index.html @@ -1,2 +1,2 @@ -Import (infer.Pulselib__PulseOperations.Import)

Module Pulselib__PulseOperations.Import

For opening in other modules.

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 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;
}
| ISLLatentMemoryError of 'abductive_domain_t
type 'a access_result = 'a Pulselib.PulseReport.access_result

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 access_result -> ('a -> 'b access_result list) -> 'b access_result list

monadic "bind" but not really that turns an access_result into a list of access_results (not really because the first type is not an access_result list but just an access_result)

val let<+> : 'a access_result -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t base_t access_result list

monadic "map" but even less really that turns an access_result into an analysis result

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

Module Pulselib__PulseOperations.Import

For opening in other modules.

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;
}
| ISLLatentMemoryError of Pulselib.PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error = 'astate Pulselib.PulseDomainInterface.AccessResult.error =
| ReportableError of {
astate : 'astate;
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

\ 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 462363c00..1b8f67f4f 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 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;
}
| ISLLatentMemoryError of 'abductive_domain_t
type 'a access_result = 'a Pulselib.PulseReport.access_result

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 access_result -> ('a -> 'b access_result list) -> 'b access_result list

monadic "bind" but not really that turns an access_result into a list of access_results (not really because the first type is not an access_result list but just an access_result)

val let<+> : 'a access_result -> ('a -> 'abductive_domain_t) -> 'abductive_domain_t base_t access_result list

monadic "map" but even less really that turns an access_result into an analysis result

type t = Pulselib.PulseDomainInterface.AbductiveDomain.t
val check_addr_access : access_mode -> IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t access_result

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

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)) list) access_result

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 access_result
val eval_deref : IBase.Location.t -> IR.Exp.t -> t -> (t * (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t)) access_result

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)) list access_result
val eval_access : 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)) access_result

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 havoc_id : IR.Ident.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_field : IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t access_result
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 access_result

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 access_result

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 access_result

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 list access_result
val invalidate : IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t access_result

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 list access_result

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.Name.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 access_result

record that what the address points via the access to is invalid

val invalidate_array_elements : IBase.Location.t -> Pulselib.PulseBasicInterface.Invalidation.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t access_result

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

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.Name.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 access_result
val check_address_escape : IBase.Location.t -> IR.Procdesc.t -> Pulselib.PulseBasicInterface.AbstractValue.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t access_result
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 access_result 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__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;
}
| ISLLatentMemoryError of Pulselib.PulseDomainInterface.AbductiveDomain.summary
type 'astate base_error = 'astate Pulselib.PulseDomainInterface.AccessResult.error =
| ReportableError of {
astate : 'astate;
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 : 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 : 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 : 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 havoc_id : IR.Ident.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t
val havoc_field : IBase.Location.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> Pulselib.PulseBasicInterface.ValueHistory.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.t
val realloc_pvar : IR.Tenv.t -> IR.Pvar.t -> IR.Typ.t -> IBase.Location.t -> t -> t
val write_id : IR.Ident.t -> (Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t
val write_field : IBase.Location.t -> ref:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> IR.Fieldname.t -> obj:(Pulselib.PulseBasicInterface.AbstractValue.t * Pulselib.PulseBasicInterface.ValueHistory.t) -> t -> t Pulselib.PulseDomainInterface.AccessResult.t

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
val invalidate : 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_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.Tenv.t -> IR.Var.t list -> IBase.Location.t -> t -> t Pulselib.PulseDomainInterface.AccessResult.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 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 diff --git a/website/static/odoc/next/infer/Pulselib__PulsePathCondition/index.html b/website/static/odoc/next/infer/Pulselib__PulsePathCondition/index.html index 1c8d9c2b7..e5ad11f51 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 : keep:AbstractValue.Set.t -> t -> (t * new_eqs) SatUnsat.t

simplify ~keep phi attempts to get rid of as many variables in fv phi but not in keep as possible

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 : t -> t * bool * new_eqs

whether the state contains a contradiction, only call this when you absolutely have to

val as_int : t -> AbstractValue.t -> int option

as_int phi t returns an integer x such that phi |- t = x, if known for sure; see also is_known_zero

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation

\ 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 -> keep:AbstractValue.Set.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> (t * new_eqs) SatUnsat.t

simplify ~keep phi attempts to get rid of as many variables in fv phi but not in keep as possible

val simplify_instanceof : IR.Tenv.t -> get_dynamic_type:(AbstractValue.t -> IR.Typ.t option) -> t -> t
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 as_int : t -> AbstractValue.t -> int option

as_int phi t returns an integer x such that phi |- t = x, if known for sure; see also is_known_zero

val has_no_assumptions : t -> bool

whether the current path is independent of any calling context

val get_var_repr : t -> AbstractValue.t -> AbstractValue.t

get the canonical representative for the variable according to the equality relation

\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseReport/index.html b/website/static/odoc/next/infer/Pulselib__PulseReport/index.html index 11997200f..868462cab 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseReport/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseReport/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseReport (infer.Pulselib__PulseReport)

Module Pulselib__PulseReport

type 'a access_result = ('aPulselib.PulseBasicInterface.Diagnostic.t * Pulselib.PulseDomainInterface.AbductiveDomain.t) IStdlib.IStd.result
val report_list_result : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> Pulselib.PulseDomainInterface.AbductiveDomain.t list access_result -> Pulselib.PulseDomainInterface.ExecutionDomain.t list
val report_results : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t access_result list -> Pulselib.PulseDomainInterface.ExecutionDomain.t list
\ No newline at end of file +Pulselib__PulseReport (infer.Pulselib__PulseReport)

Module Pulselib__PulseReport

val report_result : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> Pulselib.PulseDomainInterface.AbductiveDomain.t Pulselib.PulseDomainInterface.AccessResult.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t list
val report_results : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> Pulselib.PulseDomainInterface.AbductiveDomain.t Pulselib.PulseDomainInterface.AccessResult.t list -> Pulselib.PulseDomainInterface.ExecutionDomain.t list
val report_exec_results : Pulselib.PulseSummary.t Absint.InterproceduralAnalysis.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t Pulselib.PulseDomainInterface.AccessResult.t list -> Pulselib.PulseDomainInterface.ExecutionDomain.t list
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseSummary/index.html b/website/static/odoc/next/infer/Pulselib__PulseSummary/index.html index c2901c485..72c105ab0 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseSummary/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseSummary/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseSummary (infer.Pulselib__PulseSummary)

Module Pulselib__PulseSummary

type t = Pulselib.PulseDomainInterface.ExecutionDomain.summary list
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val of_posts : IR.Procdesc.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file +Pulselib__PulseSummary (infer.Pulselib__PulseSummary)

Module Pulselib__PulseSummary

type t = Pulselib.PulseDomainInterface.ExecutionDomain.summary list
val yojson_of_t : t -> Ppx_yojson_conv_lib.Yojson.Safe.t
val of_posts : IR.Tenv.t -> IR.Procdesc.t -> Pulselib.PulseDomainInterface.ExecutionDomain.t list -> t
val pp : Stdlib.Format.formatter -> t -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/Pulselib__PulseTopl/index.html b/website/static/odoc/next/infer/Pulselib__PulseTopl/index.html index 4c859b384..917c483da 100644 --- a/website/static/odoc/next/infer/Pulselib__PulseTopl/index.html +++ b/website/static/odoc/next/infer/Pulselib__PulseTopl/index.html @@ -1,2 +1,2 @@ -Pulselib__PulseTopl (infer.Pulselib__PulseTopl)

Module Pulselib__PulseTopl

type value = Pulselib.PulseAbstractValue.t
type event =
| ArrayWrite of {
aw_array : value;
aw_index : value;
}
| Call of {
return : value option;
arguments : value list;
procname : IR.Procname.t;
}
type state
val compare_state : state -> state -> int
val equal_state : state -> state -> bool
val start : unit -> state

Return the initial state of Topl.automaton ().

val small_step : IBase.Location.t -> Pulselib.PulsePathCondition.t -> event -> state -> state
val large_step : call_location:IBase.Location.t -> callee_proc_name:IR.Procname.t -> substitution:(Pulselib.PulseAbstractValue.t * Pulselib.PulseValueHistory.t) Pulselib.PulseAbstractValue.Map.t -> condition:Pulselib.PulsePathCondition.t -> callee_prepost:state -> state -> state

large_step ~substitution ~condition state ~callee_prepost updates state according to callee_prepost. The abstract values in condition and state are in one scope, and those in callee_prepost in another scope: the substitution maps from the callee scope to the condition&state scope.

val filter_for_summary : Pulselib.PulsePathCondition.t -> state -> state

Remove from state those parts that are inconsistent with the path condition. (We do a cheap check to not introduce inconsistent Topl states, but they mey become inconsistent because the program path condition is updated later.)

val simplify : keep:Pulselib.PulseAbstractValue.Set.t -> state -> state

Keep only a subset of abstract values. This is used for extracting summaries.

val report_errors : IR.Procdesc.t -> Absint.Errlog.t -> state -> unit

Calls Reporting.log_issue with error traces, if any.

val pp_state : Stdlib.Format.formatter -> state -> unit
\ No newline at end of file +Pulselib__PulseTopl (infer.Pulselib__PulseTopl)

Module Pulselib__PulseTopl

type value = Pulselib.PulseAbstractValue.t
type event =
| ArrayWrite of {
aw_array : value;
aw_index : value;
}
| Call of {
return : value option;
arguments : value list;
procname : IR.Procname.t;
}
type state
val compare_state : state -> state -> int
val equal_state : state -> state -> bool
val start : unit -> state

Return the initial state of Topl.automaton ().

val small_step : IBase.Location.t -> Pulselib.PulsePathCondition.t -> event -> state -> state
val large_step : call_location:IBase.Location.t -> callee_proc_name:IR.Procname.t -> substitution:(value * Pulselib.PulseValueHistory.t) Pulselib.PulseAbstractValue.Map.t -> condition:Pulselib.PulsePathCondition.t -> callee_prepost:state -> state -> state

large_step ~substitution ~condition state ~callee_prepost updates state according to callee_prepost. The abstract values in condition and state are in one scope, and those in callee_prepost in another scope: the substitution maps from the callee scope to the condition&state scope.

val filter_for_summary : Pulselib.PulsePathCondition.t -> state -> state

Remove from state those parts that are inconsistent with the path condition. (We do a cheap check to not introduce inconsistent Topl states, but they mey become inconsistent because the program path condition is updated later.)

val simplify : keep:Pulselib.PulseAbstractValue.Set.t -> state -> state

Keep only a subset of abstract values. This is used for extracting summaries.

val report_errors : IR.Procdesc.t -> Absint.Errlog.t -> state -> unit

Calls Reporting.log_issue with error traces, if any.

val pp_state : Stdlib.Format.formatter -> state -> unit
\ No newline at end of file diff --git a/website/static/odoc/next/infer/UnitTests/DifferentialTests/index.html b/website/static/odoc/next/infer/UnitTests/DifferentialTests/index.html index 1631a047c..ba2679488 100644 --- a/website/static/odoc/next/infer/UnitTests/DifferentialTests/index.html +++ b/website/static/odoc/next/infer/UnitTests/DifferentialTests/index.html @@ -1,2 +1,2 @@ -DifferentialTests (infer.UnitTests.DifferentialTests)

Module UnitTests.DifferentialTests

val current_report : ATDGenerated.Jsonbug_t.jsonbug list
val previous_report : ATDGenerated.Jsonbug_t.jsonbug list
val current_costs : 'a list
val previous_costs : 'a list
val diff : Integration.Differential.t
val test_diff_keeps_duplicated_hashes : OUnit2.test
val test_set_operations : OUnit2.test
val tests : OUnit2.test
\ No newline at end of file +DifferentialTests (infer.UnitTests.DifferentialTests)

Module UnitTests.DifferentialTests

val current_report : ATDGenerated.Jsonbug_t.jsonbug list
val previous_report : ATDGenerated.Jsonbug_t.jsonbug list
val current_costs : 'a list
val previous_costs : 'a list
val current_config_impact : 'a list
val previous_config_impact : 'a list
val diff : Integration.Differential.t
val test_diff_keeps_duplicated_hashes : OUnit2.test
val test_set_operations : OUnit2.test
val tests : OUnit2.test
\ No newline at end of file diff --git a/website/static/odoc/next/infer/UnitTests__DifferentialTests/index.html b/website/static/odoc/next/infer/UnitTests__DifferentialTests/index.html index 3ff852075..55294fb55 100644 --- a/website/static/odoc/next/infer/UnitTests__DifferentialTests/index.html +++ b/website/static/odoc/next/infer/UnitTests__DifferentialTests/index.html @@ -1,2 +1,2 @@ -UnitTests__DifferentialTests (infer.UnitTests__DifferentialTests)

Module UnitTests__DifferentialTests

val current_report : ATDGenerated.Jsonbug_t.jsonbug list
val previous_report : ATDGenerated.Jsonbug_t.jsonbug list
val current_costs : 'a list
val previous_costs : 'a list
val diff : Integration.Differential.t
val test_diff_keeps_duplicated_hashes : OUnit2.test
val test_set_operations : OUnit2.test
val tests : OUnit2.test
\ No newline at end of file +UnitTests__DifferentialTests (infer.UnitTests__DifferentialTests)

Module UnitTests__DifferentialTests

val current_report : ATDGenerated.Jsonbug_t.jsonbug list
val previous_report : ATDGenerated.Jsonbug_t.jsonbug list
val current_costs : 'a list
val previous_costs : 'a list
val current_config_impact : 'a list
val previous_config_impact : 'a list
val diff : Integration.Differential.t
val test_diff_keeps_duplicated_hashes : OUnit2.test
val test_set_operations : OUnit2.test
val tests : OUnit2.test
\ No newline at end of file