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

Infer 项目分析实战:构建系统集成、编译数据库与多语言捕获完整指南

发布时间:2026/9/22 9:47:46 来源:云帆数科 栏目:资讯中心
Infer 项目分析实战:构建系统集成、编译数据库与多语言捕获完整指南
Infer 项目分析实战构建系统集成、编译数据库与多语言捕获完整指南【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址: https://gitcode.com/gh_mirrors/infer/infer本篇技术指南围绕 Facebook Infer 静态分析器如何接进你的构建流程展开它支持哪些编译器和构建系统、每种集成方式的最稳用法、编译数据库compilation database的底层处理机制以及遇到不受支持的构建系统时如何用--force-integration兜底。读完本文你将能够把 Infer 接入 ant、Buck、cmake、Gradle、Make、Maven、Xcodebuild、xctool 等常见构建体系并对 Java、C/C/Objective-C 代码执行完整或增量分析。Infer 支持的编译器与构建系统总览Infer 分析文件的入口是编译器命令官方支持通过javacJava与clangC/C/Objective-C直接分析。也可以把gcc作为入口但 Infer 内部仍会用clang来编译你的代码因此如果你的代码无法用clang编译这条路就可能走不通。从源码结构看Infer 支持的构建系统在 infer/src/base/Config.ml 中通过build_system_exe_assoc表显式登记多个可执行文件可以映射到同一个构建系统其中第一个条目用于打印当前运行模式构建系统可识别的前端可执行文件antantbuck2buck、buck2gradlegradle、gradlewjavajavajavacjavackotlinckotlincclangcc、clang、gcc、clang、c、ghackchackcmakemake、configure、cmake、wafmavenmvn、mvnwndk-buildndk-buildpythonpython3rebar3rebar3rustrustcswiftswiftcerlangerlcxcodebuildxcodebuild注意cmake也出现在该表中并映射到 make 模式见后文cmake一节的两种用法而configure、waf这类脚本同样按 make 模式处理。每个构建系统对应一种驱动模式infer run -- build command会把命令分发到对应的驱动实现这一逻辑位于 infer/src/integration/Driver.ml 的mode_of_build_command。某个构建系统具体如何被支持可查看infer capture --help手册中的 SYNOPSIS 部分。用编译器直接分析单个文件分析单文件项目是最简单的用法直接以编译命令作为 infer 的参数即可infer run -- javac Hello.java infer run -- clang -c file.c这里--之后的内容会被原样交给真正的编译器执行。文件照常被编译同时被 Infer 翻译成内部中间表示用于后续分析——这意味着没有被编译的文件也不会被分析。因此在对整个项目做首次分析前务必先执行 clean如make clean、gradle clean确保编译器编译了全部文件Infer 也随之分析全部文件参见 Infer 工作流两阶段说明。主流构建系统集成实战antinfer run -- antBuck对 Buck 项目把要分析的 target 作为参数传入infer run -- buck buck target这会计算传入 target 中的 Infer 告警列表。若希望同时分析所有传递依赖transitive dependenciesinfer run -- buck --deep buck target需要注意--deep与普通 Buck 编译模式的区别仅对 Java 项目有效对其他类型的项目--deep选项不产生任何效果。从 Driver.ml 的源码看buck2 模式下还会依据指定的 buck 模式Clang/Erlang/Java/Python选择对应的驱动实现。cmake最稳健的方式是让 cmake 生成编译数据库再交给 Infer 处理cd build cmake -DCMAKE_EXPORT_COMPILE_COMMANDS1 .. cd .. infer run --compilation-database build/compile_commands.json另一种方式是欺骗 cmake 使用 infer 替代系统编译器infer 在 PATH 上以同名包装器覆盖编译器cd build infer compile -- cmake .. infer run -- make -j 4关于第二种方式的原理见下文 Make 一节cmake 在build_system_exe_assoc中被映射到 make 模式因此infer compile -- cmake ..捕获的仍是 make 风格命令随后infer run -- make -j 4复用已捕获的结果。Gradleinfer run -- gradle gradle task, e.g. build infer run -- ./gradlew gradle task, e.g. buildgradle与gradlew都映射到 gradle 构建系统。如果项目要求增量式incremental构建系统的改动级分析可结合--reactive模式使用详见下文全局与增量工作流。MakeMake 集成通过在运行时修改PATH把 make 调用的 C/C/Objective-C 或 Java 编译器替换为 infer 包装器来实现infer run -- make make target这个机制并不总是有效如果 Makefile 硬编码了编译器的绝对路径例如直接调用/usr/bin/gcc而非gcc由于集成依赖 PATH 覆盖这类调用会绕过包装器。仓库中 infer/lib/wrappers/ 目录存放了这些包装器cc、clang、clang、g、gcc、c均为指向bin/infer的符号链接而 javac 是一个 bash 脚本——它通过INFER_OLD_PATH找到宿主javac先执行宿主编译器再以infer capture --continue -- javac args触发捕获并用INFER_COMPILER_WRAPPER_IN_RECURSION防止包装器自我递归调用。Maveninfer run -- mvn maven targetmvn与mvnw均映射到 Maven 模式。XcodebuildiOS/macOS 项目最稳健的方式是先生成编译数据库再交给 Inferxcodebuild your build options | tee xcodebuild.log xcpretty -r json-compilation-database -o compile_commands.json xcodebuild.log /dev/null infer run --skip-analysis-in-path Pods --clang-compilation-db-files-escaped compile_commands.json注意--clang-compilation-db-files-escapedXcode 产出的编译命令是经过 shell 转义的因此需要这一选项对应源码中的compilation_database_escaped见 Config.ml。--skip-analysis-in-path Pods用正则匹配并跳过Pods路径下的文件。Infer 也提供直接替换 xcodebuild 所用编译器的集成方式。例如对 iOS 应用infer run -- xcodebuild -target target name -configuration build configuration -sdk iphonesimulator此外还有一种基于xcpretty的替代集成给 infer 传入--xcpretty即可xcodebuild 的输出会经 xcpretty 管道转为编译数据库。该选项在 Config.ml 中定义为--xcpretty默认关闭其底层实现在 CaptureCompilationDatabase.mlget_compilation_database_files_xcodebuild通过进程管道运行xcodebuild | xcpretty --report json-compilation-database --output tmp把产物作为转义形式的编译数据库交给捕获流程。xctool与 Xcode 的编译数据库路线一致xctool.sh your build options -reporter json-compilation-database:compile_commands.json infer run --skip-analysis-in-path Pods --clang-compilation-db-files-escaped compile_commands.json编译数据库Compilation Database最通用的集成方式cmake、Xcode、Buck 等许多构建系统都能生成编译数据库JSON 格式的 compile_commands 文件。Infer 可以直接消费该文件从而绕开对具体构建系统的识别infer --compilation-database compile_commands.json对应选项定义在 Config.ml--compilation-database可以多次指定且与--compilation-database-escaped针对 Xcode 这类含 shell 转义参数的数据库并存。从源码看这一模式的处理链路如下在 Driver.ml当命令行其余参数为空且检测到--clang-compilation-dbs或--compilation-database时进入ClangCompilationDB {db_files}模式CaptureCompilationDatabase.capture 把所有数据库路径转为绝对路径并通过CompilationDatabase.from_json_files解析 JSON对每条编译命令create_cmdCaptureCompilationDatabase.ml把可执行文件替换为 wrappers 目录下的clang/clang依据命令后缀是否含判断并追加-fsyntax-only -fno-builtin参数——即只做语法层面的前端捕获不产生真实目标文件is_skipped第 87-90 行用--skip-analysis-in-path提供的正则对源文件相对路径做匹配匹配上的文件不参与捕获--skip-analysis-in-path-skips-compilation可进一步控制这些路径是否连编译都跳过Config.ml默认false即仍然编译捕获任务通过进程池按--jobs并行执行第 56-62 行。其他构建系统与 --force-integration 兜底如果 Infer 无法识别你的构建命令会报出如下错误$ infer run -- foo Usage Error: Unsupported build command foo该错误由 Config.ml 中的build_system_of_exe_name抛出——build_system_exe_assoc反向查找可执行文件名失败时它会以 UserError 终止并提示使用--force-integration。其错误信息会列出所有受支持的构建系统。如果构建系统与上表某一项行为一致可用--force-integration强制走同一种集成。例如让foo表现得与make相同infer run --force-integration make -- foo在 Driver.ml 中force_integration指定的构建系统只在原始发起进程is_originator中生效子进程仍按实际可执行文件名识别其命令行定义见 Config.ml类型为build_system optionConfig.mli。如果你的构建系统更加特殊、无法输出编译数据库可以尝试先手工生成 compile_commands.json 再走编译数据库模式若仍不可行则需要反馈给 Infer 社区寻求支持。让分析更快、更完整的两个实践要点并行加速Infer 可以并行运行编译命令例如infer run -- make -j8。编译数据库模式的并行度则受--jobs控制见run_compilation_database中的进程池实现CaptureCompilationDatabase.ml。分析前先 clean对项目首次运行 Infer 前执行cleanmake 项目用make cleanGradle 用gradle clean依此类推否则增量构建系统可能跳过已编译文件导致 Infer 漏分析。全局分析与增量分析reactive 模式衔接虽然本页聚焦构建系统接入但两种运行模式直接影响你如何调用上述命令见 Infer 工作流文档 的完整说明要点如下默认全局模式infer run -- build command每次都会删除旧infer-out/并全量分析首次运行前需 clean 构建产物。增量reactive模式infer run --reactive -- build command保留infer-out/只分析改动文件及其依赖适合增量构建系统的日常开发循环可用--continue把多次改动合并为一次分析也可单独执行infer run --reactive --continue -- analyze对当前改动做隔离分析。分析结果输出在标准输出及infer-out/report.txt可在同一目录运行infer explore查看每个告警的详细错误轨迹。延伸阅读Infer 工作流capture/analyze 两阶段与全局/增量模式从零开始的 Infer 使用入门各构建系统的 SYNOPSIS 细节infer capture --help、infer run --help编译器包装器实现infer/lib/wrappers/javac 与 infer/lib/wrappers/ 下指向bin/infer的符号链接构建系统识别与驱动分发infer/src/base/Config.ml、infer/src/integration/Driver.ml编译数据库捕获实现infer/src/integration/CaptureCompilationDatabase.ml【免费下载链接】inferA static analyzer for Java, C, C, and Objective-C项目地址: https://gitcode.com/gh_mirrors/infer/infer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

京津冀地图渲染引擎源码解析与选型实战
京津冀地图渲染引擎源码解析与选型实战

京津冀地图渲染引擎源码解析与选型实战 版本升级后 API 全变了,导致原本跑得好好的京津冀区域地图项目直接报错,这种崩溃感只有做过地理信息系统的老铁才懂。很多团队在接手遗留代码时,发现 ECharts 或 Leaflet… · 2026/9/22 9:47:40

2026最新hdarea对比选型:3种方案解决版本API全变痛点
2026最新hdarea对比选型:3种方案解决版本API全变痛点

2026最新hdarea对比选型:3种方案解决版本API全变痛点 版本升级后 API 全变了,你是不是也盯着报错日志头疼半天? 别慌,2026最新的 hdarea 生态里,其实藏着三条截然不同的技术路径。… · 2026/9/22 9:47:27

3种方案深度解析通讯录怎么备份,源码级对比避坑指南
3种方案深度解析通讯录怎么备份,源码级对比避坑指南

3种方案深度解析通讯录怎么备份,源码级对比避坑指南 看了一堆教程还是不会写项目?别怪自己笨,是那些文章只给了个 copy 按钮,没告诉你底层数据流怎么走的。今天咱们不整虚的,直接拿【通讯录怎么备份】这个看似简单实则坑爹的需求,做一次硬核的… · 2026/9/22 9:47:21

3.6万余字的决议稿是怎样形成的源码解析
3.6万余字的决议稿是怎样形成的源码解析

手写实现3.6万余字决议稿生成器,新手避坑指南 看了一堆教程还是不会写项目?别慌,问题不在你笨,而在你没动过手。很多初学者盯着屏幕看视频,觉得“我懂了”,一关视频就卡壳。真正的掌握,靠的是 手写实现… · 2026/9/22 10:12:38

2026最新cdr标注尺寸实战:5步搞定自动化工具
2026最新cdr标注尺寸实战:5步搞定自动化工具

2026最新cdr标注尺寸实战:5步搞定自动化工具 配置环境就卡半天?别急,这篇2026最新的实战指南能帮你省下3小时。 很多刚入行的兄弟,一接触CAD或CDR标注就头大。手动改尺寸、调格式,稍不留神就错漏百出。更头疼的是,每次导出前都要花… · 2026/9/22 10:12:30

RK3588 GStreamer MPP硬解实战:多路4K性能调优与避坑指南
RK3588 GStreamer MPP硬解实战:多路4K性能调优与避坑指南

在嵌入式视频处理这条线上摸爬滚打几年,GStreamer 和 Rockchip MPP 这套组合几乎绕不开。RK3588、RK3568 这类芯片的 VPU 硬解能力摆在那里,4K 多路解码不调用 MPP 纯靠 CPU 软解,帧率直接掉到个位数,风扇还呼呼转。但真把 GStrea… · 2026/9/22 10:12:30

CH340T USB转串口电路设计:原理图、冷启动排查与PCB布局实战
CH340T USB转串口电路设计:原理图、冷启动排查与PCB布局实战

1. 为什么CH340T至今仍是USB转串口的首选方案如果你拆开过市面上任何一款几十块钱的开发板、Arduino兼容板或者ESP8266/ESP32下载器,大概率会在板子边缘看到一颗SOP-16封装的小芯片,丝印写着CH340T或者CH340G。这颗芯片从2010年前后量产到现在&#xff0… · 2026/9/22 10:12:24

避坑指南:int转double的5个实战项目陷阱,别再硬转了
避坑指南:int转double的5个实战项目陷阱,别再硬转了

避坑指南:int转double的5个实战项目陷阱,别再硬转了 昨天还在帮一个刚入行的学弟调Bug,他盯着屏幕上一行 double d = (double) i;… · 2026/9/22 10:12:24

苹果笔记本双系统安装一文搞懂:避坑指南与实战选型
苹果笔记本双系统安装一文搞懂:避坑指南与实战选型

苹果笔记本双系统安装一文搞懂:避坑指南与实战选型 看了一堆教程还是不会写项目?别急,很多老手都卡在这一步。苹果笔记本双系统安装不是简单的“装个系统”,而是涉及磁盘分区、启动引导、驱动兼容的复杂工程。今天咱们 一文搞懂… · 2026/9/22 10:12:12

5个电影海报图片处理坑,新手避坑指南
5个电影海报图片处理坑,新手避坑指南

5个电影海报图片处理坑,新手避坑指南 刚写完代码,一运行屏幕直接炸了。满屏红色的 StackTrace 滚得比弹幕还快,什么 NullPointerException 、 ImageIO.read() returned null 、… · 2026/9/22 0:00:07

注册微信公众账号:一文搞懂从0到1全流程
注册微信公众账号:一文搞懂从0到1全流程

注册微信公众账号:一文搞懂从0到1全流程 复制来的代码跑不通,报错信息满屏飞,到底卡在哪?别急,咱们先停下手里的调试。很多开发者觉得注册微信公众账号只是填个表单、传个身份证那么简单,真上手才发现坑深不见底。今天这篇 一文搞懂… · 2026/9/22 0:00:07

手写实现图片压缩网站核心:搞定WebP转换与质量调优
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站… · 2026/9/22 0:00:19

了解更多?预约专属演示

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

企业微信二维码