论文部分内容阅读
在软件工程领域,源代码分析是软件上线前必不可少的一环。静态分析工具的作用就是在不执行代码的情况下检查代码的缺陷,并对可能的缺陷生成报告。目前,Coverity,Kolowork,CppTest等主流的静态分析工具在源代码分析方面都有着不错的表现。然而这些工具所生成的报告中原本不存在的代码错误数量比代码本身所存在的错误要多出至少3倍以上,这使代码审核工作变得庞大而复杂。随着人工智能的高速发展,现有的分类模型日趋成熟。本文尝试将人工智能运用在软件工程领域,从而提出使用人工智能算法对静态分析工具的结果进行分类预测,将报告中真的代码错误与非代码错误分开,来大幅度降低人工审核的难度。本文将人工智能算法运用到源代码分析的尝试中。首先,针对静态分析工具所生成的分析报告中不同的数据特征,我们采用了与之相对应的特征工程方法来提取更多信息。对于自然语言特征我们采用了TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文件频率)算法、LSI(Latent Semantic Index,隐含语义索引)等自然语言处理方法,对于有序特征我们进行了数字转化,对于类别型特征我们进行了 one-hot编码之后并科学降维保证了数据所携带信息的完整性。接着,由于人工智能算法对训练数据的要求,考虑到人工打标签的巨大工作量,本文提出采用半监督学习算法通过机器为训练数据打标签,这样可以使得在不损失数据有效性的前提下,尽量保证最终模型的分类准确率。最后,本文采用了LightGBM(Light Gradient Boosting Machine)进行分类,给出最终的分类模型。本文采用的软件项目含有106372个C++文件,其中包含的代码错误共65363个。我们分别采用Coverity,KlocWork,CppTest和codesonar四种主流的代码分析工具对其进行扫描形成报告。实验证明,本文提出的基于弱监督的分类模型在4个报告集上都获得了不错的效果,实现了人工智能在软件工程领域的应用。