1. 代码审查总论:嵌入式C代码审查的目标、原则与流程概述
各位同行,咱们今天聊聊代码审查这件事。说实话,我做了十几年嵌入式开发,见过太多因为代码审查不到位而翻车的项目。有一次,一个同事在中断服务函数里调用了printf,审查时没人发现,结果产品在现场跑着跑着就死机了。嗯,从那以后,我对代码审查的态度就变得特别认真。
1.1 我们为什么要做代码审查?
说白了,代码审查不是为了找茬,而是为了省钱。你想想看,一个bug在编码阶段发现,改起来可能就几分钟。要是流片回来才发现,那代价可就大了去了。
我个人习惯把嵌入式C代码审查的目标归纳为三点:
- 发现缺陷:逻辑错误、边界条件、资源泄漏这些硬伤
- 保证规范:代码风格、命名规则、注释质量这些软实力
- 知识传递:让团队里每个人都理解这段代码为什么这么写
核心观点:代码审查不是质量检查的终点,而是质量内建的过程。我见过太多团队把审查当成走形式,结果就是「审查过了,该出的问题一个没少」。
1.2 嵌入式C代码审查的特殊性
做嵌入式的人都知道,咱们的代码和纯软件不一样。我在项目中遇到过这样一个场景:一个看起来完全正确的C代码,放到ARM Cortex-M3上跑得好好的,换到M0上就出问题了。为什么?因为M0不支持某些指令,编译器悄悄做了替换。
嵌入式C代码审查需要特别关注以下几点:
| 审查维度 | 典型问题 | 我的经验 |
|---|---|---|
| 资源约束 | 栈溢出、堆碎片、内存泄漏 | 我曾经在审查时发现一个递归函数,递归深度超过栈空间,但测试时没触发 |
| 实时性 | 中断延迟、临界区过长、优先级反转 | 有个项目因为关中断时间太长,导致串口丢数据,审查时一眼就看出来了 |
| 硬件依赖 | 寄存器操作、位域对齐、volatile使用 | volatile这个关键字,我见过至少十次因为漏写导致的诡异bug |
| 可移植性 | 字节序、数据类型长度、编译器差异 | int到底是16位还是32位?别猜,用 |
1.3 审查原则:少即是多
做审查这么多年,我总结出几条铁律:
- 每次审查不超过400行代码。人的注意力是有限的,超过这个量,效果直线下降。我试过一次性审查2000行,结果后面1000行基本是白看。
- 审查时间控制在60分钟以内。超过一小时,大脑就开始疲劳了。如果代码量大,分多次审查。
- 作者先自审,再提交审查。我见过有人提交的代码连编译都不过,这不是浪费大家时间吗?
- 审查者要理解代码,不只是看格式。格式问题交给工具去做,人应该关注逻辑和设计。
我的小技巧:审查时先看整体架构,再看具体实现。就像看一栋楼,先看结构稳不稳,再看装修好不好。我曾经跳过架构直接看细节,结果发现整个模块的设计都有问题,白白浪费了半小时。
1.4 审查流程:从提交到关闭
一个标准的审查流程,我建议这样走:
1. 代码提交阶段
- 开发者完成自审
- 确保编译通过,静态检查无严重问题
- 提交审查请求,附上变更说明
2. 审查分配阶段
- 指定至少两名审查者
- 确保审查者熟悉相关模块
- 设置审查截止时间
3. 审查执行阶段
- 审查者逐行阅读代码
- 记录问题,分类标记(严重/一般/建议)
- 与作者沟通确认问题
4. 问题修复阶段
- 作者根据反馈修改代码
- 对每个问题给出回应(已修复/无需修复并说明原因)
- 重新提交审查
5. 审查关闭阶段
- 审查者确认所有问题已处理
- 签署审查通过
- 归档审查记录
嗯,这里要注意一点:审查不是一次性的。如果修改后的代码变化很大,我建议重新审查一遍。别嫌麻烦,我吃过这个亏——有一次觉得「就改了几行」,结果那几行里藏着一个严重的竞态条件。
1.5 常见误区与避坑指南
这些年我踩过的坑,给大家列出来:
- 误区一:审查就是找bug。其实审查更重要的是发现设计缺陷和可维护性问题。bug迟早会被测试发现,但糟糕的设计会一直拖累项目。
- 误区二:审查越严格越好。我曾经见过一个审查者要求把所有的
for循环改成while,理由是「for循环容易出错」。这种吹毛求疵只会让团队反感。 - 误区三:审查可以替代测试。千万别这么想!审查和测试是互补的,谁也替代不了谁。审查发现逻辑问题,测试验证功能正确。
避坑指南:我曾经在一个项目里,因为赶进度,跳过审查直接合入代码。结果那个模块在集成测试时暴露了十几个问题,修复成本是审查阶段的五倍。从那以后,我坚持「不审查,不合入」的原则。
1.6 审查的文化建设
最后说点软性的东西。代码审查能不能做好,很大程度上取决于团队文化。我见过一些团队,审查时火药味十足,作者和审查者吵得不可开交。这样搞下去,谁还愿意提交代码审查?
我个人建议:
- 审查时对事不对人,讨论代码而不是讨论写代码的人
- 审查者要给出建设性意见,不只是说「这里不对」
- 作者要保持开放心态,别把审查当成批评
说白了,代码审查是团队协作的一部分。你想想看,如果每个人都能从审查中学到东西,那这个团队的技术水平一定会越来越高。
好了,这一章就聊到这里。下一章咱们深入讲讲审查清单的具体内容,包括哪些问题必须查、哪些可以放一放。到时候我会拿几个真实的代码片段出来,咱们一起分析分析。