)
静态分析代码质量开发工具【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址https://gitcode.com/gh_mirrors/infer/infer点击查看免费下载infer run是 Facebook 开源静态分析器 Infer 中最常用的一站式命令它把抓取源码capture与运行分析analyze两个阶段串联起来一条命令完成从编译命令到问题报告的完整链路。本文基于本仓库website/versioned_docs/version-1.3.0/man-infer-run.md对应的手册内容渲染自 infer-run.1.html原文位于 infer/man/man1/infer-run.txt并结合仓库源码逐项解析全部命令行选项的语义与实现原理帮助你在 Java、C/C、Objective-C 等项目上正确、高效地使用infer run并掌握报告过滤、调试排障、Buck 集成等进阶技巧。一、infer run的本质capture 与 analyze 的合成命令infer run并非一个独立实现的分析引擎而是 Infer 顶层驱动器driver对外暴露的复合入口。手册 DESCRIPTION 一节明确给出其等价关系infer run [options] 等价于依次执行 infer capture [options] infer analyze [options]也就是说infer run先调用 capture 阶段把目标源码翻译成 Infer 的中间表示SIL再调用 analyze 阶段对中间表示执行各检查器checker的分析。这一点在仓库入口源码中得到印证在 infer/src/infer.ml#L134-L137 中Analyze命令走Driver.run Analyze而Capture | Compile | Run三个命令统一走Driver.run (Lazy.force Driver.mode_from_command_line)——Run与Capture共用同一套驱动逻辑由命令行模式决定是否顺带完成分析。此外 infer/src/infer.ml#L16-L66 的setup ()会在 Run 模式下创建 results 目录并清理旧的 infer-out 结果保证每次infer run从干净状态开始。因此任何可以拆成capture加analyze的用法都可以合并进一条infer run同时由于选项是共享的本手册中列出的选项同样适用于拆分的两个阶段对应选项在帮助手册中分别标记在Run、Capture、Analyze或Report命令下。二、基本用法与两种调用形式手册 SYNOPSIS 给出两种等价写法infer run [options] infer [options] -- compile command第一种直接运行infer run配合.inferconfig配置文件或在当前目录执行适用于已配置好的项目。第二种infer -- 编译命令是更常见的日常用法--之后的参数被原样当作构建命令交给 Infer 拦截。例如对 C 项目执行infer run -- gcc -c example.c对 Java 项目执行infer run -- javac Hello.java。本仓库 examples/c_hello/example.c 与 examples/java_hello/Hello.java 就是可用的最小示例对应的构建脚本位于 examples/c_hello/Makefile 与 examples/java_hello/Makefile可从中看到与infer run -- 编译命令完全一致的调用方式。默认情况下分析结果写入当前目录下的infer-out/其中report.txt人类可读与report.json机器可读为主要产物若要改变输出位置使用--results-dir。三、核心选项详解以下按功能分组逐项解析infer run手册中的全部选项。3.1 抓取Capture相关--capture-block-list jsonMatcher 或 matcher 列表指定不应被抓取、因此也不会被分析的文件。仅对 Clang、Java、Hack 生效。其底层实现在 infer/src/IR/inferconfig.ml#L287-L288capture_block_list_file_matcher通过FileOrProcMatcher.load_matchers加载 JSON 模式构造一个源文件包含字符串匹配器选项本身的声明位于 infer/src/base/Config.ml#L993-L999。匹配器支持两种 JSON 形态源文件模式{source_contains: 子串}可选配not_contains匹配内容包含指定子串的文件方法模式{class: 类名, method: 方法名}匹配指定类/方法。该匹配器在三个前端中被实际调用Clang 前端 infer/src/clang/cLocation.ml#L81、Java 前端 infer/src/java/jMain.ml#L95、Hack 集成 infer/src/integration/Hack.ml#L267均为命中 block list 则跳过该文件的短路逻辑。示例--capture-block-list [{source_contains: generated}]3.2 报告过滤与输出格式--censor-report string指定审查censor过滤器被命中的问题会在 JSON 报告中额外写入一个censored_reason字段这些被审查的问题不会出现在控制台输出与 report.txt 中但处理 JSON 报告的下游工具仍可读取。多个过滤器按指定顺序依次作用于每一个被检测到的问题只有通过所有过滤器的问题才会被报告。每个过滤器的格式为issue_type_regex:filename_regex:reason_string前两个分量是 OCaml Str 正则表达式可带可选的!前缀带!前缀时极性反转过滤器从允许列表变为阻止列表block list每个过滤器按蕴含implication解释一个问题若不匹配issue_type_regex或匹配filename_regex则该问题命中此过滤器参与匹配的文件名是相对于--project-root目录的路径reason_string是非空字符串用于说明该问题被过滤的原因。例如--censor-report NULLPTR_DEREFERENCE:.*tests.*:known fp in tests表示把 tests 目录下的空指针解引用问题标记为已知误报fp。--no-censor-report issue_type_regex仅供调试/实验使用指定不被--censor-report审查的问题类型正则。--report-allow-list-path-regex path_regex只报告相对路径匹配指定 OCaml 正则且不匹配--report-block-list-path-regex的文件上的问题。--report-block-list-path-regex path_regex不报告相对路径匹配该正则的文件上的问题即使它们命中了上面的 allow list。--report-block-list-files-containing string不报告内容包含指定字符串的文件上的任何问题。--report-block-list-spec json按规格spec列表屏蔽特定问题。手册给出完整示例格式[ { bug_type: CXX_REF_CAPTURED_IN_BLOCK, procedure_name: foo, file: path/to/File.m, comment: This is a fp because... }, { bug_type: RETAIN_CYCLE, class_name: MyClass, procedure_name: my_method, file: path/to/File.m } ]其中bug_type、procedure_name、file为必填定位信息class_name按需给出comment用于说明屏蔽理由。--report-suppress-errors error_name直接不报告指定类型error_name的错误。--report-force-relative-path强制把绝对路径转换为相对于根目录的路径对应--no-report-force-relative-path。--pmd-xml开启后问题同时以 PMD XML 格式输出到infer-out/report.xml对应--no-pmd-xml。--sarif开启后问题以 SARIFStatic Analysis Results Interchange Format静态分析结果交换格式输出到infer-out/report.sarif对应--no-sarif。SARIF 是 GitHub 等平台通用的代码扫描结果标准格式。--no-report分析完成后不执行报告阶段对应--report。适合只关心分析中间结果、想自己解析infer-out内部文件的场景。3.3 调试与诊断--debug, -g激活调试模式等价于一次性设置--debug-level 2、--developer-mode、--print-buckets、--print-types、--reports-include-ml-loc、--no-only-cheap-debug、--trace-error、--write-html。反向开关为--no-debug | -G。--debug-level level设置全局调试级别会同时设置--bo-debug level、--debug-level-analysis level、--debug-level-capture level0仅启用基础调试1启用详细调试verbose2启用非常详细的调试very verbose--debug-level-analysis int/--debug-level-capture int/--debug-level-report int分别针对分析、抓取、报告三个阶段独立设置调试级别取值语义同--debug-level。--print-logs同时把日志输出到 stdout 和 stderr对应--no-print-logs。--no-progress-bar, -P关闭进度条显示对应--progress-bar | -p。--timeout float任一检查器分析单个函数/方法的最大时间单位秒默认 120 秒。超时后该函数被跳过防止个别复杂函数拖垮整个分析。--version/--version-json分别以纯文本与 JSON 格式打印版本信息并退出。--help/--help-format { auto | groff | pager | plain }/--help-full--help显示本手册--help-format指定帮助输出格式auto在环境变量TERM为dumb或未定义时使用plain否则使用pager--help-full显示含 INTERNAL OPTIONS内部选项部分的完整手册。3.4 运行行为控制--fail-on-issue若 Infer 发现了需要报告的问题则以退出码 2 退出对应--no-fail-on-issue。该选项在 CI 流水线中极为常用配合infer run的一体化流程echo $?即可判断本次分析是否引入新问题。--force-delete-results-dir即使目标目录看起来不像 Infer 的 results 目录也允许删除它对应--no-force-delete-results-dir。默认 Infer 会拒绝删除非 infer 生成的目录以保护用户数据。--force-integration command强制把--之后的第一个参数当作指定的构建集成命令处理。可取值包括ant、buck、buck2、gradle、gradlew、java、javac、kotlinc、cc、clang、gcc、clang、c、g、hackc、make、configure、cmake、waf、mvn、mvnw、ndk-build、python3、rebar3、rustc、swiftc、erlc、xcodebuild。当构建命令名不标准或需绕过自动探测时使用。--never-returning-null json[仅 Java适用于所有分析] Matcher 或 matcher 列表声明这些函数永远不会返回null供分析器消解空值告警。--project-root, -C dir指定项目根目录。报告过滤相关的路径正则均以该目录为基准相对路径。--results-dir, -o dir指定结果及内部文件的写入目录默认infer-out。--skip-analysis-in-path regex忽略路径匹配给定正则的文件可多次指定但需确保每个正则正确加括号转义。注意该选项只跳过分析不影响抓取。--停止参数解析其后的所有参数被视为构建命令。3.5 SQLite 结果数据库调优infer run的分析结果会写入 SQLite 数据库手册提供以下底层调优选项对应 SQLite PRAGMA 语义--sqlite-cache-size intSQLite 缓存大小单位为页正数或 kB负数--sqlite-lock-timeout intSQLite 结果数据库操作的锁超时时间单位毫秒--sqlite-max-blob-size int写入 SQLite 的最大 blob/字符串大小--sqlite-mmap-size intmmap 映射 SQLite 数据库的内存大小0 表示禁用内存映射--sqlite-page-size intSQLite 页大小字节必须是 512 到 65536 之间的 2 的幂。这些选项在并行分析大规模项目、需要精细控制内存占用时非常有用。3.6 Buck 集成选项当 Infer 与 Facebook 的 Buck 构建系统配合使用时infer run额外提供--buck-targets-block-list regex跳过被该正则匹配的 Buck target 的抓取。--buck2-bxl-capture-file-block-list regex跳过被该正则匹配的文件的抓取。仅支持 Clang Buck2 集成不支持 Java。--buck2-root dir指定buck-out的父目录仅用于 buck2。3.7 Pulse 检查器选项--pulse-report-issues-reachable-from regex将 Pulse 能够一路传播到匹配某正则的过程procedure的问题重新上报。Pulse 是 Infer 的分离逻辑separation logic分析器其默认行为会抑制中间传播路径上的问题该选项用于在问题最终冒出到指定入口函数例如 main 或测试入口时将其重新暴露出来。四、环境变量与.inferconfig配置文件infer run的 ENVIRONMENT 与 FILES 部分指向infer(1)手册的对应章节详见 infer/man/man1/infer.txt#L2603-L2644以下为要点环境变量INFER_ARGS以^分隔的额外选项字符串会被应用到所有 infer 命令。例如INFER_ARGS--debug^--print-logs infer等价于infer --debug --print-logs。注意运行时会打印INFER_ARGS ...以便排查见 infer/src/infer.ml#L91-L98。INFERCONFIG指定.inferconfig配置文件的查找位置。INFER_STRICT_MODE设为1后infer 命令在某些本应仅在 stderr 输出警告的场合例如使用了某个选项的废弃形式会改为以错误码退出。.inferconfig文件.inferconfig用于持久化 infer 选项格式为 JSON 记录字段名是 infer 长选项去掉--后的名字值的类型取决于选项类型开关型选项JSON 布尔值true/false不带引号无参数的非开关选项如列表选项对应的...-resetnull整数选项JSON 整数不带引号字符串选项JSON 字符串路径选项JSON 字符串且相对于.inferconfig文件所在位置解释累积型cumulative选项相应类型的 JSON 数组。手册给出官方示例{ cxx: false, infer-block-list-files-containing: [gen, /* no infer */] }查找顺序先看命令行--inferconfig-path指定的文件否则读INFERCONFIG环境变量指定的文件再否则从当前目录向上逐级查找第一个.inferconfig。整体优先级为命令行参数 INFER_ARGS.inferconfig详见 infer/man/man1/infer.txt#L36-L40 的 OPTIONS 说明。五、与相关命令的关系infer run手册的 SEE ALSO 一节指向三个最密切的命令对应手册分别位于 infer/man/man1/ 下infer capture(1)只抓取不分析等价于infer run --no-analyze的拆分形式infer analyze(1)只分析已抓取的结果对应infer run的第二阶段在 infer/src/infer.ml#L134-L137 中Analyze直接调用Driver.run Analyzeinfer report(1)只对已有结果生成报告支持--pmd-xml、--sarif、报告过滤等选项的独立执行形态。实际工程中典型的增量工作流是CI 首次运行infer run -- 编译命令得到全部结果后续迭代使用infer capture -- 编译命令复用.inferconfig中的过滤配置与infer analyze、infer report分段执行借助--fail-on-issue、--report-block-list-spec等选项把已知误报纳入管理从而在不重新抓取的前提下反复调整报告口径。手册完整的选项清单与最新定义可随时通过infer run --help或--help-full查看内部选项获取。赞分享静态分析代码质量开发工具【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址https://gitcode.com/gh_mirrors/infer/infer点击查看免费下载相关推荐Infer run 命令完全指南capture、analyze 与报告一体化的静态分析入口Infer run 命令完全指南capture、analyze 与报告一体化的静态分析入口 infer run 是 Infer 静态分析器面向日常使用的“一站静态分析代码质量开发工具Infer 命令手册全解读懂 infer 与 infer analyze/capture/compile/explore/report/reportdiff/run 系列 man pagesInfer 命令手册全解读懂 infer 与 infer analyze/capture/compile/explore/report/reportdiff/静态分析代码质量开发工具Infer 静态分析器 infer analyze 命令完全指南checker 调度、增量分析与高级配置Infer 静态分析器 infer analyze 命令完全指南checker 调度、增量分析与高级配置 infer analyze 是 Facebook I静态分析代码质量开发工具上一篇pin-project实战案例如何优雅处理Rust中的固定类型下一篇InstructIR本地部署教程在你的GPU上搭建高性能图像修复工作站创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考