软件研发效能实验室匡宏宇副教授课题组在Linux内核代码注释维护研究上取得新进展

发布日期:2026-08-28 浏览次数:


Linux内核处于持续快速的演化之中,其中的函数常常被重命名、拆分或删除,但代码注释却不会随之自动更新。这类"过期函数引用"不仅会误导维护者、增加代码理解和排查成本,有时还会暴露更深层的代码缺陷。图1的案例显示,注释里提到的 hw_perf_group_sched_in() 函数早在2010年就已被删除,但相关注释却一直没有更新。南京大学软件研发效能实验室匡宏宇副教授课题组进一步排查后发现,与这条注释相连的一段条件分支代码,实际上也已经变成了无法被执行的死代码——这正说明了"过期注释"背后可能藏着的问题。



图 1 Linux内核中过期函数引用及其修复示例


已有代码注释一致性研究大多关注函数与其直接关联注释之间的语义偏差,难以发现由其他文件中的函数独立演化造成的失效引用。研究数据显示,在能够定位原始引用对象的案例中,60.5%的注释引用指向其他文件中的函数。针对这一问题,匡宏宇副教授及其指导的博士生孙可心,联合新加坡管理大学的David Lo 教授、 博士生吕允博,以及法国国家数字科学与技术研究院(Inria)的 Julia Lawall 教授,提出了面向Linux内核代码注释的检测与修复方法 ReCite,重点回答如何识别、追踪、修复并评估这类过期引用。


ReCite包含三个阶段:首先,系统从注释中提取形如 foo() 的函数形式符号,并结合文本搜索与Coccinelle静态分析,判断当前代码库中是否仍存在对应的函数;随后,ReCite回到该引用首次进入注释的历史版本,确定注释当时实际指向的代码实体,再沿Git提交历史追踪函数的重命名、拆分和删除过程,构建函数演化树;最后,系统把原始注释、当前代码上下文和演化历史共同提供给大语言模型,生成有历史依据的修复建议。



图 2 ReCite检测与修复过期函数引用的整体流程


课题组在Linux内核 v6.18-rc1 上评估了 ReCite。从约62,000个C语言源文件和头文件中分析了227万条代码注释,共提取出49,302个不同的函数形式符号,涉及83,241次引用。经过逐步筛选、实体定位和历史追踪,ReCite识别出869个值得修复的过期函数引用,并为其生成了修复建议。在随机抽取的200条建议中,85条(42.5%)可以直接应用,93条(46.5%)能够为人工修复提供有效参考,二者合计178条(89.0%)。


为了检验这些结果能否真正用于软件维护,课题组向Linux内核社区提交了75个修复补丁。截至论文定稿,已有50个补丁进入维护者代码树或Linux主线。一位维护者在审阅补丁时写道:"We must have missed this comment ... a few years ago(我们几年前一定漏掉了这条注释)。"论文标题也由此而来。


该研究相关成果论文《We Must Have Missed This Comment: Detecting and Repairing Stale Function References in Linux Kernel Comments》已被第41届IEEE/ACM自动化软件工程国际会议(ASE 2026,CCF-A国际会议)录用,南京大学为第一作者单位。智能软件与工程学院本科生关宇聪、孙佳琪、潘益枫、宋臻彦、李宇轩亦对本研究作出贡献。


孙可心同学由马晓星教授和匡宏宇准聘副教授共同指导,其主要研究方向包括:代码审查、软件可追踪和基于文本情绪分析的软件仓库挖掘,其研究成果先后发表在TSE、ASE、ICPC等高水平软件工程国际会议上。欢迎对相关研究内容感兴趣的同学加入软件研发效能实验室及Sqd.HUM(Software’s Qualified Development of, by, for the HUManity )课题组。