Bloaty 贡献指南:从测试编写、编码规范到 CLA 签署的完整参与流程
开发工具【免费下载链接】bloatyBloaty: a size profiler for binaries项目地址https://gitcode.com/gh_mirrors/bl/bloaty点击查看免费下载Bloaty 是 Google 开源的二进制体积剖析工具size profiler支持 ELF、Mach-O、PE/COFF、WebAssembly 等多种文件格式并提供 compileunits、symbols、sections 等多维数据源。如果你希望为 Bloaty 贡献代码、修复 bug 或新增特性CONTRIBUTING.md 是官方给出的参与路径先沟通、必测测试、守编码规范、走评审流程、签 CLA。本文以该文档为主线结合仓库中的测试体系、源码结构与构建配置为你展开一份可落地执行的贡献实操指南。一、动手前先沟通避免无效投入的“30 分钟原则”CONTRIBUTING.md 开篇给出的第一条建议非常朴素如果你的想法预计实现时间超过 30 分钟请先通过 issue tracker 与维护者沟通计划。这条原则的背后是 Bloaty 的功能复杂性。从 README.md 可以看到Bloaty 的功能面横跨多个维度文件格式ELF、Mach-O、PE/COFF实验性、WebAssembly实验性数据源compileunit、symbol、section、segment、inlines 等报告能力多数据源层级报告hierarchical profiles、尺寸 diff适合 CI、分离调试文件分析、符号 demangle 等。任何一个功能点都可能牵动解析器、range_map 数据结构、聚合报告逻辑等多处代码。提前在 issue tracker 中说明你的方案能获得早期反馈避免方向性返工。从源码结构看Bloaty 的解析器分散在 src/elf.cc、src/macho.cc、src/pe.cc、src/webassembly.cc 等文件中核心聚合逻辑位于 src/bloaty.cc其中data_sources[]定义了 armembers、archs、compileunits、inputfiles、inlines、sections、segments、symbols、rawsymbols 等数据源的名称与描述改动前与维护者对方案达成一致能显著降低工作量被否定的风险。二、Add tests测试是 Bloaty 贡献的第一要务CONTRIBUTING.md 明确要求任何新特性或 bugfix 都必须附带测试。理由是 Bloaty 功能众多不同数据源、文件格式、diff 模式、层级报告等测试是防止回归的核心保障。2.1 Bloaty 的两套测试体系按照 tests/README.md 的说明Bloaty 同时维护两套测试测试类型位置技术栈适用场景lit 测试tests/**/*.testLLVM 的lityaml2objFileCheck解析器级别的测试构造精确的 ELF/Mach-O/PE 输入并断言 Bloaty 输出C 单元测试tests/*.ccgoogletest数据结构与聚合/报告逻辑等不解析二进制输入的测试其中 lit 测试是当前重点发展方向项目正在逐步把现有测试迁移到 lit见 tests/README.md 中引用的 issue #221。2.2 lit 测试如何用 YAML 构造“精确到字节”的输入lit 测试的核心思路是用yaml2obj从文本化的 YAML 描述生成目标二进制文件再让lit把运行 Bloaty 的命令与断言交织在一起。这对解析器测试非常理想因为 YAML 是精确且可读的输入构造方式。以一个最小 ELF 可重定位目标文件为例tests/elf/sections/normal-obj.test 展示了完整写法# RUN: %yaml2obj %s -o %t.obj # RUN: %bloaty --raw-map %t.obj | %FileCheck %s --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64 Sections: - Name: .text Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_EXECINSTR ] AddressAlign: 0x0000000000000010 Content: 554889E5B8050000005DC3 - Name: .bss Type: SHT_NOBITS Flags: [ SHF_WRITE, SHF_ALLOC ] AddressAlign: 0x0000000000000010 Size: 0x000000000000007B # ... 更多 sections 与 Symbols 定义 ... # CHECK: FILE MAP: # CHECK: 000-040 64 [ELF Header] # CHECK: 040-050 16 .text # CHECK: VM MAP: # CHECK: 10000000000-1000000000b 11 .text # CHECK: 20000000000-2000000007b 123 .bss这个测试文件展示了三个关键机制# RUN:指令%yaml2obj把 YAML 转成%t.obj%bloaty运行分析| %FileCheck %s用当前文件中的CHECK行断言输出精确输入构造通过Content直接写入原始字节、通过Size精确控制 .bss 等 NOBITS 段大小连重定位、符号表、字符串表都可以逐一指定精确输出断言FILE MAP 与 VM MAP 中每个地址区间的起始偏移、大小和归属 section 都被严格校验。再看一个针对“畸形输入鲁棒性”的测试 tests/elf/sections/invalid-symtab-link.test它让.symtab段的Link指向一个不是字符串表的.not_a_strtab段验证 Bloaty 在这种非法结构下不崩溃而是优雅地输出[Anonymous symbol #1]并照常给出 TOTAL 汇总。对于需要 dSYM 分离调试信息的场景如 inlines 数据源tests/macho/inlines.test 展示了多文档 YAML 的用法——第一个文档是 Mach-O 可执行文件第二个文档是带__DWARF段的 dSYM测试通过%bloaty %t.binary --debug-file%t.dsym -d inlines --domainvm验证内联函数的源码行归属。2.3 C 单元测试不解析二进制时使用 googletestCONTRIBUTING.md 的测试要求对应到代码上主要集中在 tests/bloaty_test.cc、tests/bloaty_misc_test.cc、tests/bloaty_test_pe.cc 和 tests/range_map_test.cc 中。官方原则是C 测试只用于不解析二进制输入的场景例如数据结构和聚合/报告逻辑。tests/test.h 中的BloatyTestfixture 定义了整套一致性校验框架CheckConsistency()校验非 diff 模式下顶层行file size必须等于输入文件总大小每个父行的 vm/file 值必须等于其子行之和子行名称不能重复叶子行不能同时 vm 和 file 都为 0CheckCSVConsistency()校验 CSV 输出的表头格式header1,header2,...,vmsize,filesize及最后两列可解析为整数AssertChildren()允许对子行按名称与大致体积留出编译器自动插入符号、头部开销的容差做断言。例如 tests/bloaty_test.cc 中的SimpleObjectFile测试会逐一断言.bss、.data、.rodata下各自归属的符号及其大小同时验证-n 0与配置文件max_rows_per_level: 0具有相同效果对应 tests/testdata/max_rows_zero.bloaty。C 测试同样覆盖了容错场景比如 tests/bloaty_misc_test.cc 中的NoSections、SectionCountOverflow、GoBinary、ImplicitConstAndLineStrp、MultiThreaded等用例。此外仓库还维护了一组 fuzz 测试fuzz_target/fuzz_test语料库位于 tests/testdata/fuzz_corpus/在 CMakeLists.txt 中注册为fuzz_test用于持续验证解析器对随机输入的健壮性。2.4 如何运行测试运行 C 单元测试仅 Git 检出环境发布 tarball 不含这些测试$ cmake --build build --config Debug --target test运行 lit 测试需要额外指定三个工具路径见 tests/README.md-DLIT_EXECUTABLEPATHlit 工具可通过pip install --user lit安装-DFILECHECK_EXECUTABLEPATHFileCheck 工具-DYAML2OBJ_EXECUTABLEPATHyaml2obj 工具。FileCheck 与 yaml2obj 属于 LLVM 工具链需要非常新main 分支开发版的构建版本cmake -B build -G Ninja -S . \ -DLIT_EXECUTABLE${HOME}/Library/Python/3.8/bin/lit \ -DFILECHECK_EXECUTABLE${HOME}/BinaryCache/llvm.org/bin/FileCheck \ -DYAML2OBJ_EXECUTABLE${HOME}/BinaryCache/llvm.org/bin/yaml2obj cmake --build build --config Debug cmake --build build --target check-bloatycheck-bloaty目标在 CMakeLists.txt 中定义它通过tests/lit.site.cfg.in生成的tests/lit.site.cfg其中注入bloaty_src_root、bloaty_obj_root、filecheck_path、yaml2obj_path再加载 tests/lit.cfg 完成配置——lit.cfg中把%bloaty、%FileCheck、%yaml2obj替换为真实可执行文件路径并以.test为后缀、排除testdata目录来收集测试。C 测试目标在 CMake 中按平台注册了多个实例CMakeLists.txt 第 568-574 行例如bloaty_test_x86-64工作目录 tests/testdata/linux-x86_64、bloaty_test_pe_x64工作目录 tests/testdata/PE/x64等每个实例针对不同的二进制语料运行。三、Coding style遵循 Google C Style GuideCONTRIBUTING.md 要求所有代码遵循Google C Style Guide并推荐使用内置 Google 风格预设的clang-format来自动化格式。仓库源码确实贯彻了这一风格。以 src/bloaty.cc 为例可以看到典型的 Google 风格特征4 空格缩进、行宽约 80 列namespace bloaty { ... }包裹全部实现类名CamelCase如DataSourceDefinition、函数名PascalCase如ParseOptions、常量使用k前缀如kSymbols、kRawSymbols头文件包含顺序规范自身头文件优先其次是系统头文件、第三方库、项目头文件。constexpr DataSourceDefinition data_sources[] { {DataSource::kArchiveMembers, armembers, the .o files in a .a file}, {DataSource::kArchs, archs, architecture slices in universal binaries}, {DataSource::kCompileUnits, compileunits, source file for the .o file (translation unit). requires debug info.}, // ... };在提交代码前运行clang-format选择 Google 预设即可让格式与项目保持一致这也是评审中最容易提前消除的返工项。四、Code reviews所有提交都必须评审CONTRIBUTING.md 规定所有提交包括项目成员的提交都必须经过评审评审通过 GitHub Pull Request 进行。这意味着贡献流程是在 fork 的分支上完成实现附上对应测试提交 Pull Request根据评审意见迭代修改评审通过后合入。在合入前建议自查清单是否在 issue tracker 中先沟通过方案超过 30 分钟工作量的情况是否为新特性/bugfix 添加了 lit 或 C 测试测试是否在本地完整通过--target test与--target check-bloaty代码是否经过clang-formatGoogle 预设是否已准备好签署 CLA。五、Legal Requirements贡献前必须签署 CLACONTRIBUTING.md 对法律合规有明确要求在代码被合入仓库之前贡献者必须在线签署 Google Individual Contributor License AgreementCLA。几个关键细节签署时机不需要在提交代码前就签——可以等到代码提交评审且成员批准之后再签但合入代码库之前必须完成签署对象个人贡献者签署Google Individual CLA公司贡献者由企业/公司做出的贡献适用另一份协议——Software Grant and Corporate Contributor License Agreement即文档中的 The small print 部分与个人协议不同企业贡献需走企业级协议流程为什么需要 CLA因为即使贡献被并入项目代码库贡献者仍对自己的修改拥有版权项目需要获得使用和分发这些代码的许可同时还需要确认贡献者已知悉其代码是否侵犯他人专利等情况。结语一次规范的 Bloaty 贡献是什么样综合 CONTRIBUTING.md 与仓库实践一次完整的 Bloaty 贡献可以概括为六步沟通实现预估超过 30 分钟先在 issue tracker 对齐方案实现遵循 Google C Style Guide用clang-format校准格式测试解析器相关改动优先写 lit 测试yaml2obj 构造输入 FileCheck 断言输出数据结构/报告逻辑用 googletest确保cmake --build build --target test与check-bloaty全部通过评审提交 GitHub Pull Request等待项目成员评审含项目成员自己的提交合规评审批准后签署 Google Individual CLA企业贡献走企业 CLA合入完成全部流程后由维护者合入。如果你想进一步理解要贡献的代码区域建议先阅读 doc/how-bloaty-works.md了解分析原理与 doc/using.md了解全部命令行与配置能力再结合 tests/README.md 熟悉测试工具链。Bloaty 对测试的坚持正是它能在多种文件格式与数据源组合下长期保持稳定的根基。赞分享开发工具【免费下载链接】bloatyBloaty: a size profiler for binaries项目地址https://gitcode.com/gh_mirrors/bl/bloaty点击查看免费下载相关推荐Python Fire 贡献指南从 CLA 签署到代码评审、测试与 Lint 的完整参与流程Python Fire 贡献指南从 CLA 签署到代码评审、测试与 Lint 的完整参与流程 Python Fire 是一个能从任意 Python 对象自动生开发工具CLIYAPF 贡献指南从 CLA 签署、编码规范到 tox 开发与版本发布全流程YAPF 贡献指南从 CLA 签署、编码规范到 tox 开发与版本发布全流程 YAPFYet Another Python Formatter是一个基于代码质量开发工具CLIDart SDK Linter 贡献指南从 CLA 签署、代码评审到基准测试的完整参与流程Dart SDK Linter 贡献指南从 CLA 签署、代码评审到基准测试的完整参与流程 pkg/linter/CONTRIBUTING.md 是 Dar编程语言编译器语言运行时标准库开发工具上一篇G-Helper华硕笔记本控制工具告别臃肿重获性能掌控权下一篇Phan Suppression Auto-Fixer 实战指南用 add_suppressions.php 为存量 PHP 项目自动生成 phan-suppress 注解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Apache Beam Java SDK 连接器路线图解读:Couchbase、InfluxDB 与 Memcached

Apache Beam Java SDK 连接器路线图解读:Couchbase、InfluxDB 与 Memcached

批处理流处理大数据 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam15/beam 点击查看 免费下载 Apache Beam 的官方路线图页面按 SDK 维度拆分了各语…

2026/10/13 6:06:56 阅读更多 →
Dapp-Learning 实战指南:使用 Waffle + ethers.js 为 ERC20 智能合约编写单元测试与链上部署

Dapp-Learning 实战指南:使用 Waffle + ethers.js 为 ERC20 智能合约编写单元测试与链上部署

示例工程区块链 【免费下载链接】Dapp-Learning Dapp learning project for developers at all stages. Becoming and cultivating sovereign individuals. Nonprofit organization. 项目地址: https://gitcode.com/gh_mirrors/da/Dapp-Learning 点击查看 免费下载 …

2026/10/13 6:06:59 阅读更多 →
Godot 4.6 逆向运动学关节限制:JointLimitation3D 与 JointLimitationCone3D 完全指南

Godot 4.6 逆向运动学关节限制:JointLimitation3D 与 JointLimitationCone3D 完全指南

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 导读:本文围绕 Godot 官方文档(godot-docs 仓库 classes/class_joint…

2026/10/13 6:07:02 阅读更多 →

最新新闻

最佳接收全解析:从匹配滤波到瑞利衰落,三种信号场景的接收机设计指南

最佳接收全解析:从匹配滤波到瑞利衰落,三种信号场景的接收机设计指南

写在前面的几句话做接收机设计这些年,我最大的感受是:教科书里"最佳接收"这一章,看起来全是数学推导,其实每一个结论背后都是一个非常具体的工程决策。你在调试时遇到的误码率比理论差几个dB、同步环路不稳、门限设了跟…

2026/10/13 10:40:26 阅读更多 →
Java实战验证库:203个JDK17可运行示例与故障复现现场

Java实战验证库:203个JDK17可运行示例与故障复现现场

简介:本资源是《Java for Programmers 第二版》配套的完整示例代码集,专为具备编程基础、正系统学习Java的开发者设计,旨在通过可运行的实践案例深化对Java核心机制的理解与应用。压缩包为RAR格式,共34.9MB,涵盖从基础…

2026/10/13 10:40:26 阅读更多 →
专科毕业论文AI辅助全流程:9个平台从选题到答辩的实用拆解

专科毕业论文AI辅助全流程:9个平台从选题到答辩的实用拆解

1. 别急着骂AI,先搞清楚专科毕业论文的真相 每年到三四月份,我就会被各种学弟学妹的私信轰炸,问题出奇一致:学长,专科毕业论文到底怎么搞?不会写、没思路、导师催、查重高,四座大山压下来&#…

2026/10/13 10:40:26 阅读更多 →
Git Worktree 实操:一套仓库多个工作目录,彻底告别分支切换之痛

Git Worktree 实操:一套仓库多个工作目录,彻底告别分支切换之痛

平时在项目里同时推进多个分支时,最烦人的不是写代码本身,而是 Git 的切换成本。一个仓库默认只有一个工作区,你想看看另一个分支,就得先 stash 或者 commit 当前改动,然后 checkout 过去,忙完再切回来&…

2026/10/13 10:40:26 阅读更多 →
SpringBoot+Vue前后端分离宽带业务管理系统源码实战解析

SpringBoot+Vue前后端分离宽带业务管理系统源码实战解析

1. 项目核心价值:为什么你需要一套宽带业务管理系统 做后台管理系统开发的朋友,应该都有过这种经历:面试官让你写一个XX管理系统,或者公司内部要快速搭一套业务支撑平台,结果你从零开始设计数据库表结构、写权限拦截器…

2026/10/13 10:40:26 阅读更多 →
以太坊幽灵交易根因与Nonce管理实战:从卡死到自动化防护

以太坊幽灵交易根因与Nonce管理实战:从卡死到自动化防护

凌晨三点十七分,监控大屏的告警把值班手机震醒。点开一看,某资金归集服务最近的链上交易数为零,进程却还活着,日志里没有任何异常。刷新区块浏览器,交易列表躺着一串 pending,确认数全是零。再往下翻&#…

2026/10/13 10:39:24 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →