6.4.1 研究任务
作者身份属性识别是指识别文本的作者身份。文本类型包括文学作品、论文、作业、电子邮件、博客、源代码和在线论坛消息等[78,80,122]。其中,源代码的作者身份属性识别任务是作者身份识别的重要研究内容。源代码作者身份属性识别任务是指,根据给定候选程序员集合的代码样本,识别源代码或程序的作者[83,123]。另外,源代码的作者身份识别任务也是计算机软件取证领域的重要研究内容。计算机软件取证领域是通过分析软件源代码或可执行代码,来识别软件的作者或者软件作者的个性特点。本节论述源代码作者属性识别方法[124]。
源代码作者身份识别任务本质上是一个分类问题。给定一个程序员集合{P}以及这些程序员撰写的源代码样本,源代码作者身份识别任务是指,对于未知作者的源代码{C},在程序员集合{P}中识别哪位程序员是源代码{C}的作者。
源代码的作者身份识别技术广泛应用于软件知识产权侵权、恶意代码检测、软件维护和更新[125,126,127,128]。首先,软件知识产权侵权包含软件版权或专利侵权。源代码的作者身份识别能够用于解决未知源代码的所有权争议[127,128]。其次,恶意代码检测是检测计算机病毒、计算机蠕虫、间谍软件和广告软件等[128]。作者身份识别有助于识别恶意代码的作者或开发人员。最后,源代码的作者身份识别能够用于识别以前程序或程序模块的作者、跟踪软件维护和更新过程中程序变体的作者。
然而,以人工方式识别源代码作者费时费力,效率低[125,127]。因此,本节阐述研究如何自动地识别源代码的作者或程序。与面向自然语言文本的作者身份识别任务相比,源代码的作者身份识别有其自身特点[128,129]。第一,自然语言是一种开放而复杂的语言。但是,编写源代码的编程语言是一种形式化的限制性语言。第二,源代码灵活性主要体现在程序的布局、风格、结构、逻辑等方面,且与程序员个人的经验和习惯紧密相关。
源代码的作者身份识别方法包括排序方法和机器分类器方法[128,129,130,131]。另外,机器分类方法可以进一步分为三种类型:统计分析方法、机器学习方法和相似度计算方法[128]。例如,Abuhamad等[132]设计基于深度学习的方法来识别源代码作者。该方法利用递归神经网络进行特征学习和提取,利用随机森林来识别作者身份。Mateless等[133]设计分层的深度神经网络框架来识别代码作者身份。该框架包括token层编码器、函数层编码器以及全连接层。
源代码作者身份识别的主要挑战在于以下三个方面。第一,所提取的特征应独立于源代码的功能或用途以及标识符名称,例如变量和方法的名称。第二,所提取的特征在同一个程序员的不同程序中应相对稳定,且应在其随后的编程演化中相对稳定[83]。第三,所提取的特征应能够突出不同程序员的鉴别特征[126,127]。
为此,本节论述一种识别源代码作者身份属性,即识别程序员作者画像的方法。该方法包含连续词段级N-gram模型、离散词段级N-gram模型以及基于循环结构、数组和方法的多级上下文模型。另外,利用支持向量机序列最小优化来识别源代码的作者身份。通过两个开源网站程序的实验结果表明,源代码作者身份识别方法优于基线方法。