第二百零四章:代码审查
飞升期涉及内核源码:
一
林小源顺着邮件之海的洋流漂到了一片被金色光网覆盖的海域。光网上悬挂着无数补丁,每一条补丁旁边都有几位修士在仔细端详,时而摇头,时而点头,时而在补丁上写下自己的意见。
一位身穿紫袍的审查者注意到了林小源。她的眼睛像鹰一样锐利,手中的笔在空中划出一道道光弧,每一道光弧落在补丁上,都化作一行审查意见。
"你来了,"紫袍审查者头也不抬,"想往内核提交代码?先学会审查别人的代码。"
她从光网上取下一个补丁,递给林小源。补丁上已经布满了审查意见:第四十二行有人批注"这里应该检查返回值",第五十八行有人批注"变量命名不够清晰",第七十三行有人批注"这个函数太长了,建议拆分"。
"审查不是挑刺,"紫袍审查者终于抬起头,目光直视林小源,"审查是帮助提交者写出更好的代码。你要检查正确性——边界条件、错误处理;检查风格——是否符合编码规范;检查性能——有没有不必要的开销;检查安全——有没有漏洞。"
/*
* 代码审查:
*
* 审查内容:
* 1. 正确性 — 代码是否正确
* 2. 风格 — 是否符合编码规范
* 3. 性能 — 是否有性能问题
* 4. 安全 — 是否有安全漏洞
* 5. 可维护性 — 是否容易理解
*
* 审查回复:
* Reviewed-by: 表示审查通过
* Acked-by: 表示同意
* Nacked-by: 表示反对
* Tested-by: 表示测试通过
*
* 审查流程:
* 1. 提交补丁
* 2. 审查者审查
* 3. 修改补丁
* 4. 再次审查
* 5. 维护者合并
*
* 审查礼仪:
* 尊重作者
* 具体建议
* 解释原因
*/
/* 模拟审查意见 */
struct review_comment {
char reviewer[64];
int line;
char comment[256];
char suggestion[256];
};
void print_comment(struct review_comment *c) {
printf("审查者: %s\n", c->reviewer);
printf("行 %d: %s\n", c->line, c->comment);
if (c->suggestion[0])
printf("建议: %s\n", c->suggestion);
}
printf("=== 代码审查 — 内核的质量保障 ===\n\n");
printf("代码审查是内核质量的保障:\n\n");
/* 示例审查意见 */
struct review_comment comments[] = {
{"张三", 42, "这里应该检查返回值", "if (ret < 0) return ret;"},
{"李四", 58, "变量命名不够清晰", "把 i 改为 index"},
{"王五", 73, "这个函数太长了", "拆分成子函数"},
};
int n = sizeof(comments) / sizeof(comments[0]);
printf("--- 审查意见示例 ---\n");
for (int i = 0; i < n; i++) {
print_comment(&comments[i]);
printf("\n");
}
printf("--- 审查内容 ---\n");
printf("1. 正确性:\n");
printf(" 代码是否正确\n");
printf(" 边界条件\n");
printf(" 错误处理\n\n");
printf("2. 风格:\n");
printf(" 是否符合编码规范\n\n");
printf("3. 性能:\n");
printf(" 是否有性能问题\n\n");
printf("4. 安全:\n");
printf(" 是否有安全漏洞\n\n");
printf("5. 可维护性:\n");
printf(" 是否容易理解\n\n");
printf("--- 审查回复 ---\n");
printf("Reviewed-by:\n");
printf(" 表示审查通过\n\n");
printf("Acked-by:\n");
printf(" 表示同意\n\n");
printf("Nacked-by:\n");
printf(" 表示反对\n\n");
printf("Tested-by:\n");
printf(" 表示测试通过\n\n");
printf("--- 审查流程 ---\n");
printf("1. 提交补丁\n");
printf("2. 审查者审查\n");
printf("3. 修改补丁\n");
printf("4. 再次审查\n");
printf("5. 维护者合并\n\n");
printf("--- 审查礼仪 ---\n");
printf("尊重作者:\n");
printf(" 不要人身攻击\n");
printf(" 对事不对人\n\n");
printf("具体建议:\n");
printf(" 不要说\"这不好\"\n");
printf(" 要说\"这应该改成...\"\n\n");
printf("解释原因:\n");
printf(" 不要说\"不要这样做\"\n");
printf(" 要说\"不要这样做,因为...\"\n");#include <stdio.h>
#include <string.h>
/*
* 代码审查:
*
* 审查内容:
* 1. 正确性 — 代码是否正确
* 2. 风格 — 是否符合编码规范
* 3. 性能 — 是否有性能问题
* 4. 安全 — 是否有安全漏洞
* 5. 可维护性 — 是否容易理解
*
* 审查回复:
* Reviewed-by: 表示审查通过
* Acked-by: 表示同意
* Nacked-by: 表示反对
* Tested-by: 表示测试通过
*
* 审查流程:
* 1. 提交补丁
* 2. 审查者审查
* 3. 修改补丁
* 4. 再次审查
* 5. 维护者合并
*
* 审查礼仪:
* 尊重作者
* 具体建议
* 解释原因
*/
/* 模拟审查意见 */
struct review_comment {
char reviewer[64];
int line;
char comment[256];
char suggestion[256];
};
void print_comment(struct review_comment *c) {
printf("审查者: %s\n", c->reviewer);
printf("行 %d: %s\n", c->line, c->comment);
if (c->suggestion[0])
printf("建议: %s\n", c->suggestion);
}
int main() {
printf("=== 代码审查 — 内核的质量保障 ===\n\n");
printf("代码审查是内核质量的保障:\n\n");
/* 示例审查意见 */
struct review_comment comments[] = {
{"张三", 42, "这里应该检查返回值", "if (ret < 0) return ret;"},
{"李四", 58, "变量命名不够清晰", "把 i 改为 index"},
{"王五", 73, "这个函数太长了", "拆分成子函数"},
};
int n = sizeof(comments) / sizeof(comments[0]);
printf("--- 审查意见示例 ---\n");
for (int i = 0; i < n; i++) {
print_comment(&comments[i]);
printf("\n");
}
printf("--- 审查内容 ---\n");
printf("1. 正确性:\n");
printf(" 代码是否正确\n");
printf(" 边界条件\n");
printf(" 错误处理\n\n");
printf("2. 风格:\n");
printf(" 是否符合编码规范\n\n");
printf("3. 性能:\n");
printf(" 是否有性能问题\n\n");
printf("4. 安全:\n");
printf(" 是否有安全漏洞\n\n");
printf("5. 可维护性:\n");
printf(" 是否容易理解\n\n");
printf("--- 审查回复 ---\n");
printf("Reviewed-by:\n");
printf(" 表示审查通过\n\n");
printf("Acked-by:\n");
printf(" 表示同意\n\n");
printf("Nacked-by:\n");
printf(" 表示反对\n\n");
printf("Tested-by:\n");
printf(" 表示测试通过\n\n");
printf("--- 审查流程 ---\n");
printf("1. 提交补丁\n");
printf("2. 审查者审查\n");
printf("3. 修改补丁\n");
printf("4. 再次审查\n");
printf("5. 维护者合并\n\n");
printf("--- 审查礼仪 ---\n");
printf("尊重作者:\n");
printf(" 不要人身攻击\n");
printf(" 对事不对人\n\n");
printf("具体建议:\n");
printf(" 不要说\"这不好\"\n");
printf(" 要说\"这应该改成...\"\n\n");
printf("解释原因:\n");
printf(" 不要说\"不要这样做\"\n");
printf(" 要说\"不要这样做,因为...\"\n");
return 0;
}二
紫袍审查者带林小源走到光网的另一侧,那里悬挂着一些已经被撕碎的补丁——它们的提交者在审查中与审查者发生了激烈的争吵,最终补丁被废弃。
"审查是技术讨论,不是人身攻击,"紫袍审查者的语气变得严肃,"我见过太多因为态度问题而夭折的好补丁。审查者说'这代码有问题',提交者觉得被冒犯,回一封愤怒的邮件,审查者也愤怒了,整个讨论变成骂战。"
她从地上捡起一块碎片,上面还残留着一行被划掉的文字——"你根本不懂这个子系统"。
"这种话在内核社区没有立足之地,"紫袍审查者将碎片扔掉,"你要说'这里应该改成这样,因为……'。具体建议,解释原因,对事不对人。尊重是协作的基础,没有尊重,代码再好也进不了内核。"
林小源看着那些破碎的补丁,心中警醒:技术能力是入场券,但态度决定了你能走多远。
三
紫袍审查者从袖中取出四枚徽章,依次摆在林小源面前。每一枚徽章上都刻着不同的符号,散发着不同颜色的光芒。
"这些是审查回复的标签,"她指着第一枚金色徽章,"Reviewed-by——审查者仔细审查了代码,认为它是正确的。这不是随便给的,审查者要对代码负责。"
她拿起第二枚蓝色徽章:"Acked-by——表示同意,通常来自相关子系统的维护者。它说'我不反对这个改动'。"
第三枚徽章是红色的,散发着警告的气息:"Nacked-by——表示反对。如果维护者给了 Nacked-by,这个补丁就不会被合并。"
最后一枚是绿色的:"Tested-by——有人实际运行了这个补丁,确认它能工作,没有引入回归。"
紫袍审查者将四枚徽章串成一条链,递给林小源:"这些标签不是装饰,是历史记录。十年后有人想知道这个改动是否经过审查,翻到补丁上的 Reviewed-by 就知道了。每一个标签都是一个承诺。"
道藏笔记
内核启示
代码审查是内核质量的保障。
审查内容:
- 正确性 — 代码是否正确
- 风格 — 编码规范
- 性能 — 性能问题
- 安全 — 安全漏洞
- 可维护性 — 容易理解
审查回复:
- Reviewed-by — 审查通过
- Acked-by — 同意
- Nacked-by — 反对
- Tested-by — 测试通过
审查礼仪:
- 尊重作者
- 具体建议
- 解释原因
代码审查是保障——让代码经得起检验。
代码审查之试
哪一个审查回复标签表示审查者仔细审查并认可代码?