Page 336 - 《软件学报》2021年第7期
P. 336
2254 Journal of Software 软件学报 Vol.32, No.7, July 2021
Table 6 Fingerprint generation efficiency
表 6 3 种指纹的计算效率
指纹计算方法 耗时(s) 平均速度(工程/s)
MD 5 2 144.36 10.72
相似哈希-改进前 2 959.34 14.8
相似哈希-改进后 2 143.7 10.71
4.2 对研究问题2的分析
在 RQ1 的实际检测结果中,出现了大量相似文件对均为文件名相同的文件的情况.在 Mockus [27] 关于开源
软件中大规模代码复用的研究中,曾使用基于文件名的比较方法,以代码功能模块为检测的粒度进行实验,将文
件名相同的文件均判定为相似,若两个文件夹下超过一定比例的文件名称相同,则将其视作一对克隆的功能模
块对.为了验证能否简单地通过文件名匹配取得 RQ1 中相近的检测结果,仅使用文件名作为匹配标准对数据集
进行检测,获取的结果见表 7.
Table 7 Experimental results of RQ2
表 7 RQ2 的实验结果
匹配工程总数 总工程对数 总匹配对数 精确度(%)
200 19 900 849 757 12.65
事实证明,仅靠文件名匹配的相似文件对中会有大量的误报情况,因此在实际同源检测过程中,仅靠文件名
匹配会报出大量不正确的结果,结果的精确度会随着库规模的扩大越来越低,因此在小规模库上或许可以通过
文件名匹配来缩小检测范围,但在大规模数据集上,这种方法是不可行的.另外,对 RQ1 中的改进后相似哈希的
文件匹配结果进行统计后可以发现,虽然大部分结果中文件名是相同的,但仍然有 17%的正确文件对文件名并
不相同,这些相似文件对仅通过文件名匹配的方法是无法被发现的.
然而,通过对比文件名匹配的结果,改进后的相似哈希算法也暴露出一些漏报的问题.文件名匹配的方法精
确度较低,仅为 12.65%,但实际匹配出的正确文件对数量达 107 512 对,而在相同数据集下改进后的相似哈希方
法仅报出 40 082 对.为了分析本文方法产生漏报的主要原因,对漏报的文件随机抽取了其中 30 对进行人工核验
统计与分析,分析结果如图 6 所示.由分析结果可见,漏报的出现主要分为以下几种情况.
(1) 行筛选后文件为空
由于在本文提出的方法中,对不同语言的文件所对应的常见行进行了筛选,因此会出现一些小文件中所有
行都是常见行,筛选后文件的所有特征都被筛除的情况,约有 27%的漏报属于此类原因.此类文件中包含的语义
信息通常较少,因此同源分析价值比较低,文件的漏报对结果的影响也较低.在未来的工作中,也可以对目前统
计的不同语言的常见行进行筛选和取舍,以减少非必要的筛选对结果的影响.
(2) 两文件行数相差 1.5 倍及以上
此类情况约占漏报情况中的 17%,主要是由相似哈希的计算特点所致.相似哈希的原理是将所有特征转化
为哈希值并累加起来得到最终的指纹结果,在本文的方法中,这些特征就是文件的每一行.当两个文件行数相差
较大时,如一个文件的行数达到了另一个行数的 1.5 倍,那么即使两文件共同行数占据了小文件的绝大部分(若
超过 70%,则按目前的标准将判定两文件为相似),大文件额外多出的行数仍会对大文件的指纹造成较大的额外
影响,从而导致两者的指纹距离超过了阈值.因此,本方法不适用于行数差距过大的相似文件对的比较,对于这
些文件可以考虑将指纹采集的对象从文件细化到方法和函数,以获得更加精准的匹配结果.
(3) 其他情况
最后,对不同海明距离的情况进行统计.可见,有将近一半的情况是距离大于 8 小于等于 15 的情况,这些情
况下的文件可以通过对海明距离阈值的向上调整而被检测到,需要注意的是,上调阈值可能会伴随着精确度的
降低.另一半的海明距离大于 15,无法通过少量提高阈值检测到这部分漏报文件.为了进一步分析漏报原因,对
图 6 所示其他情况的文件对作进一步统计分析,结果如右侧饼状图所示.在其他情况中,44%的文件行数小于等
于 50,由于小文件本身的特征较少,较小的修改就会导致文件整体指纹有较大波动,因此在小文件上大规模相似