1、代码异味(code smell)又被称为代码坏味道,是由martin fowler于1999年提出的,表示存在于程序中的结构不良的代码段[1]。代码异味对软件的可理解性和可维护性产生诸多负面影响。这种由martin fowler提出的异味也被称为面向对象代码异味[2]。随着新技术的不断涌现和代码异味研究的持续发展,代码异味不再局限于表示面向对象代码中的潜在问题,已经拓展到众多领域[3],如安卓/ios应用程序[4,5]、测试[6]及sql[7]等代码异味。随着科学技术的迅猛发展,android应用程序由于其开放性和易用性,被广泛应用到人们的日常生活中。研究表明,代码异味不仅仅存在于传统的桌面应用程序中,也存在于android应用程序中[2]。与传统桌面应用程序相比,android应用程序没有主函数,程序执行入口是由activity所提供的;android应用程序没有j2se、api、swing和javafx,而且android应用程序上的gui是通过xml来声明的等。以上差异导致android应用程序中不仅存在传统面向对象代码异味,还存在着android特有的代码异味(android-specific smells)。2014年reimann[4]等人提出了android特有代码异味并给出了详细的异味列表。这种异味的存在对android应用程序产生诸多负面影响,比如能耗、安全性、稳定性、内存和启用时间等,极大降低了用户体验,不利于android应用程序的维护和演化[8]。manman等人的研究表明[9],可以使用传统的桌面应用程序中代码异味检测工具检测android应用程序中的面向对象代码异味。但是,研究表明[10],由于android应用程序与传统面向对象应用程序的结构不同,因此,传统检测工具不能检测android特有代码异味。
2、android特有代码异味共包括30种味道,相对于其他异味,忽略成员的方法不仅是存在于android应用程序中数量最多的一种异味,也是被学者们关注最多的一种异味[2,10,11,12,13];根据田迎晨等人提出的代码异味关键程度量化方法可知[3],忽略成员的方法是30种android特有代码异味中关键程度值最高的异味,应优先关注和重构;忽略成员的方法是某个类中的方法,该方法既不是空的方法,也不是静态方法,但该方法没有访问所在类的任何属性[2];这种异味的存在增加android程序的能耗,降低程序的可维护性[11];重构方法是将受感染的方法转换成静态方法,从而移除味道。目前检测android特有代码异味效果最好的工具是daap[10],该工具采用传统检测工具普遍使用的程序静态分析技术,定义启发式检测规则,通过遍历抽象语法树,实现异味的检测。
3、随着深度学习在自然语言处理、图像分类和生物信息等领域的广泛应用;是否可以结合深度学习或者传统机器学习方法解决传统软件工程领域的问题,已经引起了许多学者的关注;近年来,很多学者尝试使用不同的机器学习甚至深度学习方法检测代码异味,取得了很好的效果[8,14-18];机器学习是直接将结果输入模型,让机器学习数据从而获得知识,掌握检测规则,并经过多轮训练不断改善自身性能,达到提高检测精度的目的。然而,已有研究只关注传统的面向对象代码异味[8,14-18],还没有使用深度学习算法检测android特有代码异味的相关研究。
1、本发明的目的是为了解决传统检测工具在检测android特有代码异味时,准确率较低的问题,而提出基于深度学习的忽略成员的方法检测策略。
6、步骤四、对待测android特有代码异味输入训练好的深度神经网络分类器,输出待测android特有代码异味中是否存在成员异味。
9、步骤一二、使用工具reporeapers去除低质量的android应用程序,得到最终android应用程序作为代码语料库,获取数据集。
11、步骤一二一、使用javaparser将android应用程序源代码解析生成代码的抽象语法树;
12、步骤一二二、使用工具assd对代码的抽象语法树进行mim异味检测,输出mim异味检测结果;将mim异味检测结果中的漏检和误检移除;将移除漏检和误检后的检测结果中存在mim异味的方法和不存在mim异味的方法分别提取到单独的文件夹中,存在mim异味的方法对应的代码语料库中的程序构成正样本集,不存在mim异味的方法对应的代码语料库中的程序构成负样本集;
15、步骤一二二一、使用工具assd对代码的抽象语法树进行mim异味检测,输出mim异味检测结果;
16、步骤一二二二、将步骤一二二一输出的mim异味检测结果中的漏检和误检移除;具体过程为:
17、根据工具daap中检测规则遍历步骤一二二一输出的mim异味检测结果中的类中的方法,判断mim异味检测结果中的类中的方法是否为空方法,静态方法或者子类覆盖父类的方法,如果是,则将mim异味检测结果中的类中的方法放入不含异味的方法的集合nonsmellysets中;如果不是,根据mim异味检测结果中的类中的方法是否访问所在类的属性判断是否为mim异味,如果没有访问所在类的属性,则是mim异味,放入含异味的方法的集合smellysets中,如果访问所在类的属性,则不是mim异味,放入不含异味的方法的集合nonsmellysets中;
18、步骤一二二三、将移除漏检和误检后的检测结果中存在mim异味的方法和不存在mim异味的方法分别提取到单独的文件夹中,存在mim异味的方法对应的代码语料库中的程序构成正样本集,不存在mim异味的方法对应的代码语料库中的程序构成负样本集。
19、优选地,所述步骤二中对数据集进行预处理,得到预处理后的数据集;具体过程为:
20、使用工具tokenizer将样本集合中的代码语料转换为整数,用数字向量表示程序文本信息;
23、将归一化处理后的数字向量表示的程序文本信息作为深度神经网络分类器的输入数据。
24、优选地,所述步骤三中深度神经网络分类器为改进卷积神经网络模型cnn、改进循环神经网络模型rnn、cnn与rnn相结合的模型cnn-lstm、自编码全连接变体、自编码cnn变体中任意一个。
25、优选地,所述改进卷积神经网络模型cnn依次包括嵌入层、第一卷积层、第一最大池化层、第二卷积层、第二最大池化层、第三卷积层、第三最大池化层、dropout层、flatten层、第一全连接层,第二全连接层、输出层;
31、将步骤二预处理后的数据集输入改进卷积神经网络模型cnn,训练n次,得到训练好的改进卷积神经网络模型cnn。
32、优选地,所述改进循环神经网络模型rnn依次包括嵌入层、一个长短时记忆网络lstm、flatten层、第一全连接层、第二全连接层、第三全连接层、输出层;
41、将步骤二预处理后的数据集输入改进循环神经网络模型rnn,训练m次,得到训练好的改进循环神经网络模型rnn。
42、优选地,所述cnn与rnn相结合的模型cnn-lstm依次包括嵌入层、第一卷积层、第一最大池化层、第二卷积层、第二最大池化层、第三卷积层、第三最大池化层、一个长短时记忆网络lstm、一个dropout层、一个flatten层、第一全连接层、第二全连接层、第三全连接层、输出层;
54、所述第一卷积层、第一最大池化层、第二卷积层、第二最大池化层、第三卷积层、第三最大池化层、第一全连接层和第二全连接层激活函数为relu激活函数;
57、将步骤二预处理后的数据集输入cnn与rnn相结合的模型cnn-lstm,训练k次,得到训练好的cnn与rnn相结合的模型cnn-lstm。
68、所述作为输出层第六全连接层神经元个位为1024,激活函数为sigmoid;
70、将步骤二预处理后的数据集输入自编码全连接变体,训练l(20)次,得到训练好的自编码全连接变体。
72、编码部分依次包括嵌入层、第一卷积层、第一最大池化层、第二卷积层、第二最大池化层;
73、解码部分依次包括第三卷积层、第一上采样层、第四卷积层、第二上采样层、fatten层和全连接层;
85、所述第一卷积层、第一最大池化层、第二卷积层、第二最大池化层、第三卷积层、第一上采样层、第四卷积层、第二上采样层、fatten层和全连接层的激活函数为relu激活函数;
87、将步骤二预处理后的数据集分别输入自编码cnn变体,训练q(20)次,得到训练好的自编码cnn变体。
89、android特有代码异味共包括30种味道,本发明针对其中一种异味,忽略成员的方法,展开深入研究,研究其自动化检测方法;本发明提出基于深度学习的忽略成员的方法检测策略,该方法将程序文本信息作为特征集对模型进行训练,目的是避免模型因受限于度量信息,无法学习到度量之外的特征,以提高模型的检测效果。然后,使用五种深度神经网络分类器进行检测。
91、1)选取卷积神经网络cnn和循环神经网络rnn作为基础分类器,构建改进卷积神经网络模型cnn、改进循环神经网络模型rnn、cnn与rnn相结合的模型cnn-lstm、自编码全连接变体和自编码cnn变体实现忽略成员的方法的异味检测;
92、2)提出一种基于android项目构建正负样本的方法;通常情况下,深度学习模型需要大量的标记数据作为训练样本,虽然在图像处理领域,研究者可以免费获得这些数据;但在代码异味检测研究中,目前还没有类似的资源可供使用[18]。手工标记样本数据不仅耗时费力,准确率低,而且难以收集足够的训练样本[16]。因此,为了快速、准确获得深度学习模型所需的大量标签数据,本发明提出了一种基于开源android项目构造正负样本的方法并实现工具assd,实现从异味检测到样本生成自动完成。该工具在daap的基础上,对其功能进行扩展,首先,对基于程序分析的检测工具的输出结果进行漏检处理和误检移除操作,以提高检测工具的精度,然后,提取检测工具的输出结果,实现忽略成员的方法样本的自动生成和标注。
93、3)使用开源android数据集进行实验验证;实验结果表明,通过对比五种深度神经网络分类器的检测效果,得出综合性能最优的是改进cnn模型,并以此为基础模型与已有基于程序分析的检测方法对比。同时,参考面向对象代码异味检测的结果,选取性能最优的四种传统的机器学习模型与本发明提出的基于深度学习的检测方法进行对比,进一步验证了方法的有效性。
技术研发人员:边奕心 赵松 李禹齐 张子恒 孙梦琪 邢代鑫 涂杰 欧长艺
1.计算机视觉 2.无线.计算机仿线.网络安全;物联网安全 、大数据安全 2.安全态势感知、舆情分析和控制 3.区块链及应用