{1 Library infer} These are the modules used by infer that are not packaged into sub-libraries. The entry point of this library is the module: {!module-InferModules}. The modules are split into several directories in the source tree of infer. {2 absint/} Code + utilities for the Infer.AI abstract interpretation framework. Start at {!module-InferModules.AbstractInterpreter}. {2 backend/} The backend is responsible for the analysis of a project starting from an intermediate representation stored in the results directory, typically [infer-out]. The entry point for the analysis is the module {!module-InferModules.InferAnalyze}. The module {!module-InferModules.InferPrint} is used to export the analysis results. {2 checkers/} Transfer functions, abstract domains, and checker configuration. {2 clang/} This is the frontend for the clang compiler. The main entry point is {!module-InferModules.ClangWrapper}. {3 General structure} + Given a compilation command from the build system, sanitize it, attach [ASTExporter] clang plugin to the relevant commands and run it. + Parse the AST (Abstract Syntax Tree) from the Biniou format into an OCaml data structure. + If enabled, invoke translation to [SIL] via {!module-InferModules.CFrontend}. + If enabled, invoke linters via {!module-InferModules.CFrontend_checkers_main}. More on linters here: {:http://fbinfer.com/docs/linters.html}. {3 Format of the AST} The OCaml data type is defined in [atd] format. The [clang_ast_t.atd] file is generated from the comments in the {{:https://github.com/facebook/facebook-clang-plugins/blob/master/libtooling/ASTExporter.h} [ASTExporter.h]} file. For more information, refer to the relevant documentation in [facebook-clang-plugins]: - {{:https://github.com/facebook/facebook-clang-plugins/blob/master/libtooling/ATD_GUIDELINES.md} [libtooling/ATD_GUIDELINES.md]} - {{:https://github.com/facebook/facebook-clang-plugins/blob/master/clang-ocaml/README.md} [clang-ocaml/README.md]} {3 Hacking on the [.atd] file} + Create a simple example ([example.cpp]) source file with construct that needs to be exported. The smaller the better. + Export the extra information by changing the code in {{:https://github.com/facebook/facebook-clang-plugins/blob/master/libtooling/ASTExporter.h} [libtooling/ASTExporter.h]}. For more information, refer to the {{:https://github.com/facebook/facebook-clang-plugins/blob/master/libtooling/ATD_GUIDELINES.md} [ATD_GUIDELINES]}. + Compile Infer with the new version of [facebook-clang-plugins]. Running [make] from top level of Infer repository will do that. Sometimes there may be compilation errors due to [.atd] file changes - they need to be fixed. + Use newly exported information information in the frontend. Tips & Tricks: - To view the AST in a human readable version, Infer can generate [.bdump] file: [infer -g -- clang -c example.cpp && sh example.cpp.ast.sh]. Then open [example.cpp.ast.bdump]. - To inspect AST dump visually: [clang -c example.cpp -Xclang -ast-dump]. It doesn't include all the information that Infer sees, but it's pretty concise - If running [bdump] is failing (it happens on huge sources sometimes), there is a way to view it in "Yojson" format. To do that, replace all occurrences of [BiniouASTExporter] with [YojsonASTExporter] in the [.ast.sh] script. {2 eradicate/ } Eradicate [@Nullable] Checker Eradicate is a type checker for [@Nullable] annotations for Java. The goal is to eradicate null pointer exceptions. See the online docs at {:http://fbinfer.com/docs/eradicate.html}. The main entry point is module {!module-InferModules.Eradicate}. {2 java/} Java Frontend; this is the frontend for Java compilers. The main entry point is {!module-InferModules.JMain}. {2 infer executable} You'll find the infer binary in infer.ml. It is not part of this library.