Infer 完整分析实战:`infer run` 命令的捕获、分析与报告全流程指南 静态分析代码质量开发工具【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址https://gitcode.com/gh_mirrors/infer/infer点击查看免费下载Infer 是一款针对 Java、C/C/Objective-C/Objective-C 等语言的静态分析器其infer run子命令是将捕获源码 → 静态分析 → 输出报告三步串成一条命令的入口。本文以 infer run 手册 为骨架结合 infer 主手册、infer capture 手册 以及 驱动源码系统讲解infer run的调用形式、参数语义、报告产物与 CI 集成方式读完即可把 Infer 无缝接入日常构建与持续集成流程。一、infer run的本质capture analyze 的流水线infer run是 Infer 提供的一条一键式命令调用infer run [options]等价于依次执行以下两个阶段见 infer-run.txt 的 DESCRIPTION 段infer capture [options] infer analyze [options]capture捕获截获构建过程中的编译器调用clang/gcc/javac/make/gradle/xcodebuild 等读取源文件将其翻译为 Infer 的中间表示并把翻译结果存入结果目录infer-capture.txt。analyze分析在捕获得到的中间表示上运行各类检查器checker如默认开启的 Pulse、RacerD、Liveness 等。报告report分析结束后Infer 默认执行报告阶段把发现的问题写入结果目录。在驱动层infer run对应 Driver.ml 中的run函数其执行顺序与手册描述完全一致先capture再做增量分析失效处理AnalysisDependencyGraph.invalidate最后analyze_and_report。同时Run与Analyze在驱动中共享大部分逻辑——analyze_and_report对Analyze | Run两种模式执行相同的execute_analyze与report流程这也是为什么infer run与infer captureinfer analyze拆分执行的结果一致。触发方式的等价性除了显式infer run [options]还有一种隐式调用方式不带任何子命令直接写infer [options] -- compile commandInfer 会自行退化为infer-run行为infer.txt SYNOPSIS 与 DESCRIPTION若通过--或--clang-compilation-database[-escaped]提供了编译命令则行为等同infer-run(1)否则行为等同infer-analyze(1)即只分析不捕获。从使用场景选择命令形态场景推荐命令说明一次性全流程分析infer run [options] -- make捕获 分析 报告一气呵成已有捕获结果只想重跑分析infer analyze [options]复用infer-out中的捕获产物只想做前端翻译infer capture [options] -- make便于多轮调试或分步 CICI 需要退出码反映结果infer run --fail-on-issue -- make有问题时退出码为 2二、命令行形态与参数覆盖优先级infer run使用与其余 infer 子命令完全相同的选项集合——Infer 主手册明确说明Every infer command accepts the arguments from all the other infer commandsinfer.txt OPTIONS 段因此 run 阶段可以混用 capture/analyze/report 各环节的参数。选项的来源有三处按优先级从低到高为infer.txt L36-L41.inferconfig配置文件最低INFER_ARGS环境变量中间命令行参数最高此外还可以通过file方式把参数放进一个参数文件格式为每行一个选项单双引号会被忽略infer.txt L43-L45。三、infer run专属与高频参数详解1. 主流程控制参数默认行为说明-- 停止参数解析后续全部作为构建命令—--之后的内容交给真实构建系统如infer run -- make -j4--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, xcodebuildinfer-run.txt L77-L82--project-root,-C dir当前目录指定项目根目录报告中的相对路径与--censor-report的文件名正则都以此为基准--results-dir,-o dirinfer-out指定结果与内部文件的输出目录--timeout float120 秒任一检查器分析单个函数/方法的最长耗时超时放弃--fail-on-issue关闭若发现可报告问题则退出码为 2CI 常用对应驱动层 fail_on_issue_epilogue 的实现--no-report报告开启关闭分析后的报告阶段2. 报告格式与过滤Infer 分析结束后会默认写出多种格式的报告产物这些文件都位于结果目录默认infer-out/下均由 Driver.ml 的 report 函数 生成参数产物说明默认infer-out/report.jsonJSON 报告供二次处理--pmd-xmlinfer-out/report.xmlPMD 风格 XML 报告--sarifinfer-out/report.sarifSARIFStatic Analysis Results Interchange Format便于接入 GitHub 等 SARIF 消费端--report-suppress-errors error_name—不报告指定类型的错误--disable-issue-type issue_type—细粒度禁用某类问题如NULLPTR_DEREFERENCE注意禁用问题类型并不会让对应检查器停止运行--report-allow-list-path-regex path_regex—只报告相对路径匹配该 OCaml 正则的文件--report-block-list-path-regex path_regex—对匹配路径的文件一律不报告优先级高于 allow list--report-block-list-files-containing string—不报告内容包含指定字符串的文件--report-block-list-spec json—按 JSON 结构精确屏蔽指定问题例如指定 bug_type、procedure_name、file 等格式示例见手册--report-force-relative-path关闭强制把绝对路径转换为相对项目根目录的路径--no-censor-report issue_type_regex—调试/实验用指定不被--censor-report审查的问题类型--censor-report string—审查过滤器见下文专节3.--censor-report审查过滤器--censor-report用于在 JSON 报告中给问题打上censored_reason字段使这些问题不出现在控制台输出与report.txt中但仍保留在 JSON 报告中供后处理工具读取infer-run.txt L24-L42。过滤规则格式为issue_type_regex:filename_regex:reason_string前两个分量是 OCaml Str 正则文件名匹配的是相对--project-root的路径正则前可加!前缀反转极性把允许列表变成阻止列表每个过滤器按蕴含关系解释问题命中当且仅当它不匹配 issue_type_regex或匹配 filename_regex多个过滤器按指定顺序依次作用于每个问题只有被所有过滤器接受的问题才会被报告reason_string是非空字符串用于说明过滤原因。4. 捕获范围控制参数说明--capture-block-list json一组匹配器用于跳过不应捕获自然也不分析的文件名。仅 Clang、Java、Hack 支持infer-run.txt L16-L18--skip-analysis-in-path regex忽略路径匹配给定正则的文件可多次指定需确保每个正则正确加括号--never-returning-null json[仅 Java] 声明一组永不返回 null 的函数匹配器供所有分析使用5. Buck/Buck2 集成BUCK OPTIONS--buck-targets-block-list regex跳过匹配正则的 buck target 的捕获。--buck2-bxl-capture-file-block-list regex跳过匹配正则的文件的捕获仅支持 clang Buck2 集成不支持 Javainfer-run.txt L204-L206。--buck2-root dir指定buck-out的父目录仅 Buck2 使用。6. Pulse 检查器专属参数--pulse-report-issues-reachable-from regex将 Pulse 能够一路传播到匹配正则的过程procedure的问题重新上报infer-run.txt L212-L214。Pulse 是 Infer 基于分离逻辑separation logic的符号执行引擎许多现代检查器如 impurity、topl、tree-borrows都构建于其上详见 Pulse 检查器文档。7. SQLite 相关参数Infer 的捕获数据库基于 SQLite以下参数控制其性能与容量infer-run.txt L168-L184参数说明--sqlite-cache-size int缓存大小正数表示页数、负数表示 kB遵循 SQLite PRAGMA 语义--sqlite-lock-timeout int结果库操作超时毫秒--sqlite-max-blob-size int写入 SQLite 的 blob/字符串最大尺寸--sqlite-mmap-size intmmap 内存映射大小0 表示禁用映射--sqlite-page-size int页大小字节必须是 512~65536 之间的 2 的幂8. 调试与信息类参数--debug,-g激活调试模式连带开启--debug-level 2、--developer-mode、--print-buckets、--print-types、--reports-include-ml-loc、--no-only-cheap-debug、--trace-error、--write-htmlinfer-run.txt L44-L48。反向为--no-debug | -G。--debug-level level调试级别0仅基础、1详细、2非常详细同时设置 analysis/capture 的级别。--debug-level-analysis int/--debug-level-capture int/--debug-level-report int分别控制三个阶段的调试级别。--print-logs把日志同时输出到 stdout/stderr。--no-progress-bar,-P关闭进度条反向--progress-bar | -p。--help/--help-format {auto|groff|pager|plain}/--help-full/--version/--version-json帮助与版本信息--help-full会连带显示 INTERNAL OPTIONS 段。--force-delete-results-dir即使结果目录看起来不像 infer 的结果目录也允许删除重建默认会拒绝删除陌生目录。四、环境变量与配置文件ENVIRONMENT / FILESinfer run与所有 infer 子命令共享以下环境变量与配置文件机制见 infer.txt ENVIRONMENT 段 与 FILES 段名称作用INFER_ARGS以^分隔的附加选项字符串如INFER_ARGS--debug^--print-logs infer等价于infer --debug --print-logsINFERCONFIG指定.inferconfig配置文件的位置INFER_STRICT_MODE设为1后某些原本仅告警的情况如使用弃用形式的选项会让 infer 命令以错误码退出.inferconfigJSON 格式的配置文件字段为不带--前缀的长选项名switch 用 JSON 布尔、int 用 JSON 整数、路径相对于配置文件位置、累计选项用 JSON 数组.inferconfig查找顺序为命令行--inferconfig-path指定的文件 →INFERCONFIG环境变量指定的文件 → 从当前目录逐级向父目录查找的第一个.inferconfig。官方示例infer.txt L2639-L2644{ cxx: false, infer-block-list-files-containing: [gen, /* no infer */] }五、实战示例从 C 工程到 CI 集成以仓库自带的 examples/c_hello 为例其 Makefile 只负责编译目录下所有.c文件。假设项目里有一个潜在空指针解引用// example.c #include stdlib.h int deref(int *p) { return *p; // p 可能为 NULL }1. 一键全流程分析cd examples/c_hello infer run -- makeInfer 会截获make触发的cc -c调用捕获example.c翻译为中间表示并运行默认检查器最后在infer-out/下生成report.json等报告控制台会输出NULLPTR_DEREFERENCE之类的发现。2. 分步执行便于调试infer capture -- make infer analyze infer report # 重新生成/查看报告这三条命令与infer run -- make等价但允许在捕获与分析之间插入参数调整例如先看捕获是否完整再决定启用哪些检查器。3. 只分析指定路径与指定问题类型infer run \ --report-allow-list-path-regex src/.*\.c$ \ --disable-issue-type DEAD_STORE \ -- make4. 与 CI 集成失败即中断infer run --fail-on-issue -- make当 Infer 找到需要报告的问题时进程退出码为 2Driver.ml 的 fail_on_issue_epilogue 会读取infer-out/report.json并统计未抑制的问题后调用L.exit 2CI 据此判定构建失败。5. 通过配置文件固化团队默认值在项目根目录放置.inferconfig{ fail-on-issue: true, pmd-xml: true, project-root: . }之后团队成员直接执行infer run -- make即自动带上这些默认参数命令行参数仍可覆盖它们。六、深入驱动层infer run内部到底做了什么从源码看infer run的执行链路清晰可循infer/src/integration/Driver.mlrun driver_modeL642-L651依次执行run_prologue打印版本、调试信息、capture、增量分析失效处理与analyze_and_report。analyze_and_reportL365-L381对Analyze | Run模式若存在待分析源码则execute_analyze随后视Config.report决定是否执行report。报告生成L322-L334一次性写出 JSON 报告并根据--pmd-xml、--sarif等开关同步生成 XML、SARIF、文本报告。run_epilogueL633-L639执行fail_on_issue_epilogue--fail-on-issue生效处等收尾逻辑。由此可以确认一个结论infer run并不是一套独立的分析代码而是把捕获 → 分析 → 报告三条既有流水线串起来的调度入口这与手册 DESCRIPTION 中的描述完全吻合也意味着 run 阶段几乎所有参数都可以在 capture 或 analyze 阶段独立复用。七、常见问题与排查思路报告路径不对/出现绝对路径检查--project-root是否指向项目根必要时配合--report-force-relative-path强制转换为相对路径。某些文件没有被分析确认是否是--capture-block-list、--skip-analysis-in-path或--report-block-list-*过滤所致.inferconfig中累积选项如infer-block-list-files-containing也可能起效。CI 中希望有问题才失败使用--fail-on-issue退出码 2并注意infer-out/report.json是判断依据。想接入 SARIF 生态加--sarif生成infer-out/report.sarif想对接 PMD/静态代码扫描平台则加--pmd-xml。需要精细审查而非屏蔽用--censor-report让问题带censored_reason保留在 JSON 中同时不污染控制台与report.txt。分析超时默认单函数分析超时 120 秒可用--timeout调整infer-run.txt L186-L188。参考文档infer run 手册infer run全部选项的权威出处infer 主手册选项来源优先级、INFER_ARGS/INFERCONFIG/.inferconfig机制infer capture 手册捕获阶段的构建系统集成细节驱动实现run的调度与报告生成源码infer-analyze 手册、infer-report 手册分析、报告子命令的补充选项使用示例examples/c_hello、examples/demo/DSMLparameter /DSMLinvoke /DSMLtool_calls赞分享静态分析代码质量开发工具【免费下载链接】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 analyze 命令完全指南checker 调度、增量分析与高级配置Infer 静态分析器 infer analyze 命令完全指南checker 调度、增量分析与高级配置 infer analyze 是 Facebook I静态分析代码质量开发工具Nulis核心功能深度解析为什么树状编辑器是创意写作的黄金法则Nulis核心功能深度解析为什么树状编辑器是创意写作的黄金法则 Nulis是一款基于React、Redux和Node.js构建的思维导图软件专为作家设计帮静态分析代码质量开发工具上一篇【亲测免费】 FullCalendar - 全能日程管理插件下一篇7个实用技巧如何用cURL命令行工具轻松处理HTTP请求创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考