论文部分内容阅读
作为软件系统中的重要组成部分,注释对于程序理解和软件维护有着重大意义。软件开发过程中,项目代码与其注释往往存在不一致的问题,这在增加程序理解难度的同时,也大大降低了软件的可维护性。现有工作大多利用程序分析和文本分析技术来检测代码与注释参数约束的不一致性。然而,由于现有使用程序分析进行检测的方法大多仅基于AST,往往存在缺失控制流和数据流信息的问题,而文本分析技术则存在参数约束识别率低的问题;此外,现有工具没有考虑代码与注释描述内容不一致情况的检测。本文提出一种基于数据流分析和文本分析技术进行项目代码与注释不一致检测方法。该方法不仅能准确检测Java方法中代码与注释中4类参数约束的不一致问题,还对代码与注释描述内容的不一致性进行检测。论文的主要工作包括:(1)提出一种代码与注释参数约束的不一致性检测方法,设计实验了工具原型DCCI(Detecting Code Comment Inconsistency)。首先,通过对Java字节码文件进行静态数据流分析,全面提取代码中的4类参数约束,包括:参数不允许空值约束、参数允许空值约束、参数范围限制约束和参数类型限制约束。通过构建高精度方法调用图来分析方法调用引起的参数约束传递,最终整合代码中的参数约束;接着,在文本分析阶段,基于依存分析和启发式规则,对代码注释进行文本分析,提取4类参数约束;最后,对代码和注释中参数约束的逻辑表达式进行不一致性判定,从而检测出代码与注释参数约束的不一致问题。为评估代码与注释中参数约束不一致性检测方法的有效性,在7个应用广泛的Java项目上进行了实验,DCCI检测出2412条不一致问题,其中真实的不一致问题为2030条,占84.16%;而现有工具DRONE只检测出2183条不一致问题,其中真实的不一致问题为1747条,占80.02%。(2)提出一种代码与注释描述不一致性检测方法,包括代码与注释预处理、词嵌入、基于Bi-LSTM和注意力机制的Siamese网络模型、内容不一致判定部分。首先,使用静态程序分析技术,将Java代码解析为抽象语法树AST,通过遍历AST定位并提取相关节点内容;接着利用预训练的词嵌入模型,将代码token序列和注释token序列映射到同一个语义空间,表征为固定长度的向量;接着,Siamese网络模型利用两个结构完全相同的子模型,分别处理代码与注释,使用曼哈顿距离来度量代码与注释的相似度;最后通过设定阈值来检测代码与注释描述内容的不一致问题。为评估代码与注释描述内容不一致性检测方法的有效性,选用公开数据集进行实验,随机选取300个样本(约10%)作为测试集,其余作为训练集训练模型。方法在测试集上取得了89.42%的精度,相比现有方法SVM的精度(82.46%)有较大提升。