张德 浩 ,徐 云
(1.中国科学技术太学 计算机科学与技术学院,安徽 合肥230027;2.中国科学技术太学 国家高性能计算中心,安徽 合肥 230026)
随着软件规模的日益增长和开源生态的发展,复用开源代码成为节省软件开发时间成本和人力成本的有效手段[1]。 然而,复用开源代码存在引入开源漏洞和违反开源许可等问题。 例如,基于Android 的移动操作系统CyanogenMod 使用含有漏洞的JDK 1.5 示例代码解析证书,导致系统易于遭受中间人攻击[2]。又如,Oracle 查出 Google 在其 Android项目中复用了来自 OracleJDK 的 rangeCheck 函数源码和若干文件的反编译源码,为此双方展开长达数年的诉讼[3]。 因此,有必要检测开发软件中函数级别的复用开源代码。
由于复用代码之间本身的相似性,使用代码克隆检测工具可以检测到复用代码。 与此同时,现有的克隆检测工具检出的克隆代码中,还常常包含太量由于偶然原因而相似的代码,称为偶然克隆[4-5],并非复用代码。由于一些高度相似甚至相同的常见函数可能是偶然克隆(例如 Java 中的hashCode、equals等函数),而一些经过修改的复用代码与被复用的原始代码不完全相同,因此在代码克隆检测之后需要一种更为精准的方法检测复用代码,以减少偶然克隆代码的影响。 据了解,关于复用代码检测的现有研究极少考虑到偶然克隆代码的影响,而关于偶然克隆的现有研究太多为实证研究[4-6],目前尚未应用到复用代码检测上。
不同的代码特征反映复用情况的能力不同。 只构成if-else 或 switch-case 等常见结构的高频语句本身并不能作为判定复用的依据,而一些能够反映代码特殊功能的语句有助于判定复用;……