Summary: The goals are to have all the checker definitions and documentation in one place (except how to actually run them, since that's not quite the same concept; for example inferbo is one checker but several analyses depend on its symbolic execution), and later on to be able to link issues reported by infer back to the checker that generated them. This makes apparent that the documentation of our checkers is lacking, not touching that in this diff. Not sure if "analysis" would be a better name than "checker" at this point? For instance "Linters" is one of the checkers, which historically at least we have not considered to be the case. Reviewed By: mityal Differential Revision: D20252386 fbshipit-source-id: fc611bfb7master
parent
e4602ba0df
commit
8e5ee67fed
@ -0,0 +1,259 @@
|
||||
(*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*)
|
||||
|
||||
open! IStd
|
||||
|
||||
type t =
|
||||
| AnnotationReachability
|
||||
| Biabduction
|
||||
| BufferOverrun
|
||||
| ClassLoads
|
||||
| Cost
|
||||
| Eradicate
|
||||
| FragmentRetainsView
|
||||
| ImmutableCast
|
||||
| Impurity
|
||||
| InefficientKeysetIterator
|
||||
| Linters
|
||||
| LithoRequiredProps
|
||||
| Liveness
|
||||
| LoopHoisting
|
||||
| NullsafeDeprecated
|
||||
| PrintfArgs
|
||||
| Pulse
|
||||
| Purity
|
||||
| Quandary
|
||||
| QuandaryBO
|
||||
| RacerD
|
||||
| ResourceLeak
|
||||
| SIOF
|
||||
| SelfInBlock
|
||||
| Starvation
|
||||
| Uninit
|
||||
[@@deriving equal, enumerate]
|
||||
|
||||
type support = NoSupport | Support | ExperimentalSupport | ToySupport
|
||||
|
||||
type config =
|
||||
{ support: Language.t -> support
|
||||
; short_documentation: string
|
||||
; cli_flag: string
|
||||
; show_in_help: bool
|
||||
; enabled_by_default: bool
|
||||
; cli_deprecated_flags: string list }
|
||||
|
||||
(* support for languages should be consistent with the corresponding
|
||||
callbacks registered. Or maybe with the issues reported in link
|
||||
with each analysis. Some runtime check probably needed. *)
|
||||
let config checker =
|
||||
let supports_clang_and_java _ = Support in
|
||||
let supports_clang_and_java_experimental _ = ExperimentalSupport in
|
||||
let supports_clang (language : Language.t) =
|
||||
match language with Clang -> Support | Java -> NoSupport
|
||||
in
|
||||
let supports_java (language : Language.t) =
|
||||
match language with Clang -> NoSupport | Java -> Support
|
||||
in
|
||||
let supports_java_experimental (language : Language.t) =
|
||||
match language with Clang -> NoSupport | Java -> ExperimentalSupport
|
||||
in
|
||||
match checker with
|
||||
| AnnotationReachability ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation=
|
||||
"the annotation reachability checker. Given a pair of source and sink annotation, e.g. \
|
||||
@PerformanceCritical and @Expensive, this checker will warn whenever some method \
|
||||
annotated with @PerformanceCritical calls, directly or indirectly, another method \
|
||||
annotated with @Expensive"
|
||||
; show_in_help= true
|
||||
; cli_flag= "annotation-reachability"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Biabduction ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation=
|
||||
"the separation logic based bi-abduction analysis using the checkers framework"
|
||||
; show_in_help= true
|
||||
; cli_flag= "biabduction"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| BufferOverrun ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation= "the buffer overrun analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "bufferoverrun"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| ClassLoads ->
|
||||
{ support= supports_java
|
||||
; short_documentation= "Java class loading analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "class-loads"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Cost ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation= "checker for performance cost analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "cost"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Eradicate ->
|
||||
{ support= supports_java
|
||||
; short_documentation= "the eradicate @Nullable checker for Java annotations"
|
||||
; show_in_help= true
|
||||
; cli_flag= "eradicate"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| FragmentRetainsView ->
|
||||
{ support= supports_java
|
||||
; short_documentation=
|
||||
"detects when Android fragments are not explicitly nullified before becoming unreabable"
|
||||
; show_in_help= true
|
||||
; cli_flag= "fragment-retains-view"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| ImmutableCast ->
|
||||
{ support= supports_java
|
||||
; short_documentation=
|
||||
"the detection of object cast from immutable type to mutable type. For instance, it will \
|
||||
detect cast from ImmutableList to List, ImmutableMap to Map, and ImmutableSet to Set."
|
||||
; show_in_help= true
|
||||
; cli_flag= "immutable-cast"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Impurity ->
|
||||
{ support= supports_clang_and_java_experimental
|
||||
; short_documentation= "[EXPERIMENTAL] Impurity analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "impurity"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| InefficientKeysetIterator ->
|
||||
{ support= supports_java
|
||||
; short_documentation=
|
||||
"Check for inefficient uses of keySet iterator that access both the key and the value."
|
||||
; show_in_help= true
|
||||
; cli_flag= "inefficient-keyset-iterator"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| Linters ->
|
||||
{ support= supports_clang
|
||||
; short_documentation= "syntactic linters"
|
||||
; show_in_help= true
|
||||
; cli_flag= "linters"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| LithoRequiredProps ->
|
||||
{ support= supports_java_experimental
|
||||
; short_documentation= "[EXPERIMENTAL] Required Prop check for Litho"
|
||||
; show_in_help= true
|
||||
; cli_flag= "litho-required-props"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Liveness ->
|
||||
{ support= supports_clang
|
||||
; short_documentation= "the detection of dead stores and unused variables"
|
||||
; show_in_help= true
|
||||
; cli_flag= "liveness"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| LoopHoisting ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation= "checker for loop-hoisting"
|
||||
; show_in_help= true
|
||||
; cli_flag= "loop-hoisting"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| NullsafeDeprecated ->
|
||||
{ support= (fun _ -> NoSupport)
|
||||
; short_documentation= "[RESERVED] Reserved for nullsafe typechecker, use --eradicate for now"
|
||||
; show_in_help= false
|
||||
; cli_flag= "nullsafe"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= ["-check-nullable"; "-suggest-nullable"] }
|
||||
| PrintfArgs ->
|
||||
{ support= supports_java
|
||||
; short_documentation=
|
||||
"the detection of mismatch between the Java printf format strings and the argument types \
|
||||
For, example, this checker will warn about the type error in `printf(\"Hello %d\", \
|
||||
\"world\")`"
|
||||
; show_in_help= true
|
||||
; cli_flag= "printf-args"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Pulse ->
|
||||
{ support= supports_clang_and_java_experimental
|
||||
; short_documentation= "[EXPERIMENTAL] C++ lifetime analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "pulse"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= ["-ownership"] }
|
||||
| Purity ->
|
||||
{ support= supports_clang_and_java_experimental
|
||||
; short_documentation= "[EXPERIMENTAL] Purity analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "purity"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| Quandary ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation= "the quandary taint analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "quandary"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| QuandaryBO ->
|
||||
{ support= supports_clang_and_java_experimental
|
||||
; short_documentation= "[EXPERIMENTAL] The quandaryBO tainted buffer access analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "quandaryBO"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| RacerD ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation= "the RacerD thread safety analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "racerd"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= ["-threadsafety"] }
|
||||
| ResourceLeak ->
|
||||
{ support= (fun _ -> ToySupport)
|
||||
; short_documentation= ""
|
||||
; show_in_help= false
|
||||
; cli_flag= "resource-leak"
|
||||
; enabled_by_default= false
|
||||
; cli_deprecated_flags= [] }
|
||||
| SIOF ->
|
||||
{ support= supports_clang
|
||||
; short_documentation= "the Static Initialization Order Fiasco analysis (C++ only)"
|
||||
; show_in_help= true
|
||||
; cli_flag= "siof"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| SelfInBlock ->
|
||||
{ support= supports_clang
|
||||
; short_documentation=
|
||||
"checker to flag incorrect uses of when Objective-C blocks capture self"
|
||||
; show_in_help= true
|
||||
; cli_flag= "self_in_block"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| Starvation ->
|
||||
{ support= supports_clang_and_java
|
||||
; short_documentation= "starvation analysis"
|
||||
; show_in_help= true
|
||||
; cli_flag= "starvation"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
||||
| Uninit ->
|
||||
{ support= supports_clang
|
||||
; short_documentation= "checker for use of uninitialized values"
|
||||
; show_in_help= true
|
||||
; cli_flag= "uninit"
|
||||
; enabled_by_default= true
|
||||
; cli_deprecated_flags= [] }
|
@ -0,0 +1,59 @@
|
||||
(*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*)
|
||||
|
||||
open! IStd
|
||||
|
||||
type t =
|
||||
| AnnotationReachability
|
||||
| Biabduction
|
||||
| BufferOverrun
|
||||
| ClassLoads
|
||||
| Cost
|
||||
| Eradicate
|
||||
| FragmentRetainsView
|
||||
| ImmutableCast
|
||||
| Impurity
|
||||
| InefficientKeysetIterator
|
||||
| Linters
|
||||
| LithoRequiredProps
|
||||
| Liveness
|
||||
| LoopHoisting
|
||||
| NullsafeDeprecated
|
||||
| PrintfArgs
|
||||
| Pulse
|
||||
| Purity
|
||||
| Quandary
|
||||
| QuandaryBO
|
||||
| RacerD
|
||||
| ResourceLeak
|
||||
| SIOF
|
||||
| SelfInBlock
|
||||
| Starvation
|
||||
| Uninit
|
||||
[@@deriving equal, enumerate]
|
||||
|
||||
(** per-language support for each checker *)
|
||||
type support =
|
||||
| NoSupport (** checker does not run at all for this language *)
|
||||
| Support (** checker is expected to give reasonable results *)
|
||||
| ExperimentalSupport (** checker runs but is not expected to give reasonable results *)
|
||||
| ToySupport
|
||||
(** the checker is for teaching purposes only (like experimental but with no plans to improve
|
||||
it) *)
|
||||
|
||||
type config =
|
||||
{ support: Language.t -> support
|
||||
; short_documentation: string
|
||||
; cli_flag: string
|
||||
(** the flag to enable this option on the command line, without the leading "--" (like the
|
||||
[~long] argument of [CommandLineOption] functions) *)
|
||||
; show_in_help: bool
|
||||
; enabled_by_default: bool
|
||||
; cli_deprecated_flags: string list
|
||||
(** more command-line flags, similar to [~deprecated] arguments *) }
|
||||
|
||||
val config : t -> config
|
Loading…
Reference in new issue