首页/新闻资讯/正文详情

使用 Infer 构建 CI 差异化分析流程:从变更文件到增量报告

发布时间:2026/9/23 18:40:45 来源:云帆数科 栏目:资讯中心
使用 Infer 构建 CI 差异化分析流程:从变更文件到增量报告
静态分析代码质量开发工具【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址https://gitcode.com/gh_mirrors/infer/infer点击查看免费下载导读本文基于 Infer 官方推荐的 CI 集成方案website/docs/01-steps-for-ci.md系统讲解如何在持续集成环境中只分析代码变更、对比两个版本的分析结果并输出新增 / 已修复 / 既有三类差异化报告。读完本文你将掌握--changed-files-index、--reactive、--incremental-analysis、--eradicate与infer reportdiff的组合用法能够直接照抄落地到 Git Gradle/Make 等常见 CI 流水线中。CI 集成的推荐思路Infer 官方文档给出的 CI 集成推荐流程是先确定本次变更涉及的文件然后以这些文件为起点以反应式reactive模式启动分析而不是对全量项目做无差别扫描。如果希望在同一份代码上运行多个分析器例如默认分析器之外再叠加eradicate、pulse、starvation等更高效的做法是分离 capture 阶段只捕获一次编译信息让所有分析器复用同一份中间结果避免每个分析器都重复执行构建与翻译。这一思路建立在 Infer 两阶段工作流之上。任何语言Java、Objective-C、C/C的一次 Infer 运行都分为Capture 阶段拦截真实编译命令如javac、clang、make、gradle把源码翻译成 Infer 内部中间表示存放在结果目录infer-out/可用-o修改。值得注意的是若没有文件被编译也就没有文件会被分析。Analysis 阶段对infer-out/中的文件逐个函数/方法进行分析报告输出到标准输出与infer-out/report.txt。完整的背景可参考 01-infer-workflow.md其中详细介绍了全局global与差异化differential两种工作流的适用场景。通用差异化工作流Differential Workflow假设项目使用 Gitfeature是待分析的功能分支main是主干分支项目用make构建。官方推荐按以下步骤在 CI 中对比两个分支的分析结果# go to feature branch if not there already git checkout feature # get list of changed files git diff --name-only origin/feature..origin/main index.txt ## first run: feature branch # run infer on the feature branch infer capture -- make -j 4 # assuming a machine with 4 cores infer analyze --changed-files-index index.txt # store the infer report cp infer-out/report.json report-feature.json ## second run: main branch git checkout main # run capture in reactive mode so that previously-captured source files are kept if they are up-to-date infer capture --reactive --mark-if-unchanged -- make -j 4 infer analyze --incremental-analysis --changed-files-index index.txt # compare reports infer reportdiff --report-current report-feature.json --report-previous infer-out/report.json步骤一提取变更文件清单git diff --name-only origin/feature..origin/main index.txt利用 Git 本身的能力而不是 Infer 自己推断找出两个分支之间的全部变更文件写入index.txt。该文件随后通过--changed-files-index传给 Infer。从 infer/src/base/Config.ml 的选项定义可以看到它的语义Specify the file containing the list of source files from which reactive analysis should start. Source files should be specified relative to project root or be absolute即文件路径要么相对项目根目录要么使用绝对路径分析将从这些文件开始并通过依赖关系波及到受影响的调用方。这里 reactive analysis should start 中的 reactive 一词并非巧合——该选项正是为反应式分析服务的它定义分析的种子文件集而不是让分析器对全部捕获文件做一遍完整扫描。步骤二Feature 分支——先 capture 再 analyze第一次运行拆成两条命令而非一条infer run原因在于分离 capture 阶段以便复用infer capture -- make -j 4-j 4假设机器有 4 核让 make 并行编译Infer 拦截编译调用完成翻译。此时只做翻译不进行分析开销相对可控。infer analyze --changed-files-index index.txt分析从index.txt列出的文件出发。由于这是全新构建的infer-out/分析结果即为 feature 分支的完整报告。之后cp infer-out/report.json report-feature.json把 feature 分支的报告另存下来供最后比对使用。步骤三Main 分支——反应式捕获 增量分析切回main后两条命令出现了三个关键参数--reactive短选项-r告诉 Infer不要删除已有的infer-out/。默认情况下重新运行 Infer 会清空旧的结果目录这也是全局工作流每次全量分析的来源而反应式模式保留之前捕获的、内容未变的源文件翻译结果只有发生变化的文件才需要重新捕获。对于大项目这能显著缩短第二次运行的时间。--mark-if-unchanged即手册中的--mark-unchanged-procs在捕获阶段对新捕获过程做结构等价性比对——若新过程与旧版本结构等价则标记为未变更同时该选项还阻止捕获阶段删除结果数据库使未变更的结果能在后续增量分析中被复用。从 infer/man/man1/infer-capture.txt 的描述看它正是为重跑时尽量保留旧结果服务的。--incremental-analysis只对变更文件执行增量分析它会自动打开--mark-unchanged-procs。手册infer/man/man1/infer-analyze.txt同时注明它不兼容--reanalyze与--continue-analysis使用时需注意。三者配合的逻辑是capture 阶段尽量保留未变文件的中间产物analysis 阶段只重算真正受影响的函数从而让第二次运行只付出变更带来的代价。步骤四生成差异化报告infer reportdiff --report-current report-feature.json --report-previous infer-out/report.jsoninfer reportdiff接收两份标准 JSON 报告--report-current是最新版本此处为 feature 分支--report-previous是基线版本此处为 main 分支。它会在结果目录下的infer-out/differential/中生成三个文件格式与普通 Infer JSON 报告完全一致文件内容introduced.json在 feature 分支中出现、main 中不存在的问题新增fixed.json在 main 中存在、feature 分支中已消失的问题已修复preexisting.json两个分支中都存在的问题既有语义与 man 页infer/man/man1/infer-reportdiff.txt中introduced/fixed/preexisting的定义一一对应。此外infer reportdiff还支持--file-renamings提供文件重命名映射避免因文件改名被误判为新增 修复、--costs-current/--costs-previous对比成本分析报告等选项。这一输出契约在测试基建中也有体现仓库的 infer/tests/diff.make 定义了默认构建目标即$(INFER_OUT)/differential/introduced.json并把introduced.json、fixed.json、preexisting.json三个文件逐一用infer report --from-json-report转成文本期望文件*.exp.test再与基准比对验证差异化报告的正确性。实战示例Android Gradle 多分析器以下 CI 脚本同时运行默认分析与eradicate空安全分析器。假设feature为功能分支main为主干分支git diff --name-only origin/feature..origin/main index.txt infer capture -- ./gradlew --offline assembleDebug infer analyze --fail-on-issue --eradicate --changed-files-index ./index.txt这条脚本浓缩了官方推荐的四个要点用 Git 找出变更文件git diff --name-only不依赖 Infer 自行比对capture 只跑一次输出复用后续所有分析器共享同一份infer-out/叠加额外分析器--eradicate与默认分析器并行运行。eradicate是 Infer 的 Java/Kotlin 空安全分析器检查Nullable/NonNull注解是否被正确传播只分析变更文件--changed-files-index ./index.txt把分析范围限定在变更文件及其依赖闭包内大幅缩短 CI 关键路径。--fail-on-issue让 Infer 在发现问题时以非零退出码结束这是接入 CI 的必要条件——构建门禁build gate据此判定是否阻止合并。需要注意的是若把infer analyze改为infer run则--fail-on-issue需要在 capture 之前的全局参数位置传入分离式写法天然规避了该问题。为什么不直接infer run很多人会问既然infer run -- gradle build一行就能完成为什么 CI 脚本要拆成 capture 与 analyze 两步原因有二多分析器复用infer run的 capture 产物在一次运行结束后仍在infer-out/中保留若想跑第二个分析器只需再次infer analyze --新分析器而不必重跑gradle build。对 Gradle 这类增量构建系统这省去的往往是构建本身的数分钟开销。reactive 语义更清晰infer analyze单独执行时不会清空infer-out/它分析的文件就在那里配合--reactive捕获的既有产物天然契合只分析增量的差异化场景。结合源码理解背后的机制--changed-files-index的定位在 infer/src/base/Config.ml 中定义于Analyze命令的通用参数区说明它专属于分析阶段。分析器以索引文件中的源文件为根沿过程间依赖图Analysis Dependency Graph展开相关实现可追溯至 infer/src/backend/AnalysisDependencyGraph.ml 与 infer/src/base/SourceFile.ml。reactive 捕获的两种推进方式infer capture --reactive适合一批变更一次分析若在多次编辑之间连续运行可加--continue让多次捕获累积成一次分析--continue的语义是保留之前标记为变更的文件/过程并叠加本次新增的变更。官方工作流文档 01-infer-workflow.md 给出了完整示例且提示分析当前变更的隔离结果可以简写为infer run --reactive --continue -- analyze。差异化输出是受测试保护的契约infer/tests/diff.make 把introduced/fixed/preexisting三份 JSON 直接作为测试目标说明这三类文件是 Infer 差分能力对外承诺的稳定接口CI 脚本可以放心依赖其格式。落地建议与注意事项首次运行建议从干净项目开始首次全量 capture 前先make clean/gradle clean确保所有编译命令都被捕获见 01-infer-workflow.md 的 tl;dr。之后的运行才适合叠加--reactive。index.txt路径规范文件内路径应相对项目根目录或为绝对路径否则--changed-files-index可能解析不到目标源文件。多分析器并行需要多个分析器时保持一次 capture 多次 analyze的写法每个infer analyze用对应开关如--eradicate、--pulse、--starvation扩展分析器集合或用--checker-only只跑指定分析器。报告比较infer reportdiff的三个输出文件与普通报告同格式可直接接入后续的告警聚合、PR 评论或看板文件重命名较多时用--file-renamings提供映射以减少误报。CI 门禁用--fail-on-issue结合introduced.json而非全量报告决定是否阻断合并能避免历史遗留问题阻塞新变更的困境。将上述脚本嵌入 Git 钩子、Jenkins/GitHub Actions 或任意 CI 平台即可获得变更驱动、增量分析、前后对比的完整静态分析闭环。赞分享静态分析代码质量开发工具【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址https://gitcode.com/gh_mirrors/infer/infer点击查看免费下载相关推荐Infer 静态分析器 CI 集成指南reactive 增量分析与差分报告工作流Infer 静态分析器 CI 集成指南reactive 增量分析与差分报告工作流 导读 本文基于 Infer 官方文档《Recommended flow fo静态分析代码质量开发工具Infer 差分报告全解析使用 infer reportdiff 计算两次静态分析结果差异Infer 差分报告全解析使用 infer reportdiff 计算两次静态分析结果差异 infer reportdiff 是 Meta 开源静态分析工具静态分析代码质量开发工具Node.js文件系统增量构建使用node-fs-extra优化构建流程Node.js文件系统增量构建使用node fs extra优化构建流程 你是否还在为Node.js项目构建时的文件复制、清理和同步问题烦恼每次构建都要手动开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

telnet远程登录虚拟机Linux:从配置到排障
telnet远程登录虚拟机Linux:从配置到排障

简介:使用telnet远程登陆虚拟机下的Linux,是许多初学者的常见需求。这份参考文档以Red Hat Linux 9为例,面向Linux入门与运维人员,系统梳理了远程登录所需的环境检查与配置步骤。内容包括:通过rpm -q telnet与rpm -q t… · 2026/9/23 18:40:45

8683性能优化:告别代码跑不通,高频面试题实战拆解
8683性能优化:告别代码跑不通,高频面试题实战拆解

8683性能优化:告别代码跑不通,高频面试题实战拆解 复制来的代码跑不通,是不是经常卡在这里?不知道哪里错了,调了三天没结果,最后只能硬着头皮去问同事。这其实是很多开发者的日常噩梦,尤其是在准备面试或者接手新项目时,这种“黑盒”状态最让人焦… · 2026/9/23 18:40:39

《2012》下载一文搞懂
《2012》下载一文搞懂

《2012》下载源码解析:3步搞定官方文档痛点 官方文档往往篇幅冗长,新手容易迷失在细节中,抓不住核心逻辑。 很多开发者面对《2012》下载相关需求时,常被繁杂的配置项劝退,不知从何下手。… · 2026/9/23 18:40:26

3个狠招搞定utorrent中文版性能瓶颈,图解原理彻底搞懂
3个狠招搞定utorrent中文版性能瓶颈,图解原理彻底搞懂

3个狠招搞定utorrent中文版性能瓶颈,图解原理彻底搞懂 版本升级后 API 全变了,你的脚本还在用旧接口?别慌,今天不聊虚的,直接上代码,把 utorrent中文版 底层的调度逻辑拆开揉碎,用 图解原理… · 2026/9/23 19:18:50

红外YOLO多目标检测数据集:5000张实拍图+三格式标签+开箱训练
红外YOLO多目标检测数据集:5000张实拍图+三格式标签+开箱训练

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的红外多目标检测数据集及配套开发支持包,专为解决红外场景下小目标、低对比度目标识别难的问题而设计。资源包含5000张真实场景红外图像,全部经LabelImg高质量标注,提… · 2026/9/23 19:18:50

3步解决彩字怎么打的性能瓶颈与图解原理
3步解决彩字怎么打的性能瓶颈与图解原理

3步解决彩字怎么打的性能瓶颈与图解原理 刚学完正则表达式和字符串处理,代码能跑通,但一上真实项目就卡壳? 学会语法却不知怎么搭项目 ,这是很多初学者从“看例子”到“写业务”时的最大鸿沟。 别急,今天我们用 图解原理… · 2026/9/23 19:18:24

手游如何在电脑上玩避坑指南:面试必问的底层原理与实战
手游如何在电脑上玩避坑指南:面试必问的底层原理与实战

手游如何在电脑上玩避坑指南:面试必问的底层原理与实战 版本升级后 API 全变了,你的代码还能跑吗? 这是每个后端开发者在接手老项目时最头疼的问题,也是 面试必问 的高频场景。… · 2026/9/23 19:18:24

3258张马路裂缝数据集:YOLO双格式标签训练与避坑实践
3258张马路裂缝数据集:YOLO双格式标签训练与避坑实践

简介:这份面向道路裂缝检测的YOLO系列目标检测数据集,适合正在训练YOLOv5、YOLOv8、YOLOv9、YOLOv10、YOLO11等模型的开发者与算法工程师,可直接用于路面病害识别、裂缝定位等场景。数据集已预先划分好训练集、验证集和测试集,并附… · 2026/9/23 19:18:24

3年Java老兵总结:高级java工程师保姆级教程
3年Java老兵总结:高级java工程师保姆级教程

3年Java老兵总结:高级java工程师保姆级教程 看了一堆B站视频,背了无数八股文,为什么一到写项目还是抓瞎? 因为教程只教你“怎么用”,没教你“为什么这么设计”。 这篇保姆级教程,我不讲虚的,直接拆解高级java工程师的核心底层逻辑。… · 2026/9/23 19:18:18

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码