第二节 软件源代码同一性鉴定
无论是以主张著作权进行的软件知识产权民事或刑事诉讼,还是以主张商业秘密进行的软件知识产权刑事诉讼,在涉及软件源代码层面的问题时,一般都需要对源代码的同一性进行司法鉴定,以辅助判断诉讼双方源代码是否相同或相似。软件源代码同一性鉴定已成为软件知识产权司法鉴定中最为常见、最为基础的鉴定事项之一。本节从软件源代码同一性鉴定的背景和法律依据入手,归纳了以代码重构形式进行源代码修改的代码表现形式;进而提出源代码同一性鉴定的技术性原则、鉴定方法;最后,本节探讨了对通过反编译获取的源代码和跨语言的源代码进行同一性鉴定的思路。
一、软件源代码同一性鉴定的背景与法律依据
软件源代码也称软件源程序。在以主张著作权进行的软件知识产权民事诉讼和刑事诉讼中,以及以主张商业秘密进行的软件知识产权刑事诉讼案件中均有涉及。但两种情况的鉴定依据、鉴定原则不完全相同,基于著作权的代码同一性鉴定相对于基于商业秘密的代码同一性鉴定更加严格。这是因为软件著作权的保护不延及开发软件所用的思想、处理过程、操作方法或者数学概念等。本节主要研究基于著作权的软件源代码同一性鉴定。基于商业秘密的代码同一性鉴定可应用、但不限于本节提出的研究方法。
对软件源代码同一性进行鉴定的主要依据来源于《中华人民共和国著作权法》和《计算机软件保护条例》。《计算机软件保护条例》第二条、第三条均已给出了计算机软件的相关定义:“计算机软件是指计算机程序及其有关文档。计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。文档,是指用来描述程序的内容、组成、设计、功能规格、开发情况、测试结果及使用方法的文字资料和图表等,如程序设计说明书、流程图、用户手册等。”《计算机软件保护条例》第七条明确了软件著作权保护的客体:“本条例对软件著作权的保护不延及开发软件所用的思想、处理过程、操作方法或者数学概念等。”因此,从著作权的角度进行源代码同一性鉴定主要从源代码的表现形式进行。同时,《北京市高级人民法院关于审理计算机软件著作权纠纷案件几个问题的意见》规定:“使用他人软件部分构成被使用软件的必要部分、主要部分或实质部分的,构成侵权。”因此,鉴定软件源代码同一性,还要兼顾代码的“必要部分、主要部分或实质部分”。
二、基于代码重构的源代码表现形式分析
在软件源代码同一性鉴定中,最常见的源代码修改方式是基于代码重构技术的源代码表现形式上的修改。软件设计所说的重构是指在不改变软件现有功能的基础上,通过调整程序源代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。目前,很多集成开发环境平台都有代码重构的功能。代码重构的原始目的是改善程序,其目的是友好的。但正是这种技术在软件知识产权侵权案件和司法鉴定中成为最常见的,也是最低级的代码修改方式。由于代码重构多是对源代码形式上的机械性的修改,并没有改变代码的逻辑功能,也没有创造性的劳动,经过修改的代码应受到著作权法的保护。
为此,在建立软件源代码同一性鉴定方法前,就重构的源代码表现形式进行分析,有利于建立更加科学、直接的司法鉴定方法。一般情况下,代码重构的表现形式可归纳为以下四种情况。
(1)名称的修改。如源代码文件名称、类名称、函数名称、变量名称的修改。其中,变量名称和函数名称修改又最为常见。
(2)编程语言不同语法间的切换。多数编程语言在实现某一功能时会有多于一种的语法表现形式。例如,最简单的循环语句for、foreach、while、do等。这种编程语言语法间的切换,也是代码修改的主要形式之一。
(3)代码块组合或拆分。把原来两个或多个代码块,如函数、宏,合并、简单修改组合成一个代码块;或者,采用相反的操作方式将代码块拆分。
(4)代码位置修改。程序设计时某些代码位置的变化,不影响程序的逻辑功能。比如,同时声明多个变量时,哪个变量在前,哪个变量在后,从本质上说,并没有改变源代码的执行。在面向对象的程序设计中,类中的函数哪个放前、哪个置后,也不会对类文件的编译执行产生影响。
以上四种类型的代码“重构”,不改变初始代码的逻辑功能,而且不需要付出太大的代价却依然能保证源代码达到相同的功能。因此,在相对简单的软件知识产权侵权案件中,以上四种情况最为普遍。
三、软件源代码同一性鉴定的技术性原则
1.机械比对原则
在不对源代码进行功能含义阅读和理解的情况下,以机械的源代码行与行比对结果(相同和不同)为基础,多采用Beyond Compare软件,统计源代码比对中相同源代码行数的比例。如果这个比例越高,那么双方源代码所具有同一性的概率就越大。
2.实质相似原则
实质相似原则主要针对以代码重构进行源代码修改情况下,鉴定人应遵守的基本原则。该原则是指对于那些没有对源代码的逻辑功能进行实质性修改,仅做类似于代码重构的形式上修改的源代码。应该认为修改后的代码与原始代码具有实质相似的关系,或者说等同关系。
3.核心功能突出原则
在一般情况下,完成特定功能的源代码会有“主次”之分。有些是必不可少的核心功能源代码,有些是为了更好地完成任务的非核心代码。例如,管理信息系统用户在登录这一过程中,对用户名的拼写验证具有辅助的功能,核心功能在于用户名在数据库中的校验。在软件源代码的同一性鉴定中,应遵循核心突出功能,减少非核心功能源代码对同一性判断的影响。该原则也是对《北京市高级人民法院关于审理计算机软件著作权纠纷案件几个问题的意见》的具体体现。
4.规模不对等原则
规模不对等原则是指源代码在同一性比对中代码规模相差较大时,应遵守的比对规则。例如,A软件的源代码有10000行,B软件的源代码有100百行,这100行源代码A软件中都有或者绝大部分有对应的源代码,可以说B的源代码与A的源代码具有同一性;反之,一般不成立。
5.预处理对等原则
在源代码同一性分析和判断中,对于源代码的预处理应遵循对等的原则。例如,如果对被比对一方源代码预处理中删除了空行和注释行,那么另外一方的注释行和空行同样不应作为同一性判断的依据,更不应被纳入代码的数据统计中。如果一方的源代码是通过反编译得到的,那么另一方源代码即便是有原始源代码,也应该尽量采用反编译的手段获得类似的源代码,并且反编译的语言、环境和参数设计应尽量保持一致。
6.模块对等原则
如被比对双方软件涉及多个功能模块,应尽量按照功能模块进行源代码的划分后,再进行同一性比对。尤其是在软件整体源代码相似程度不高,但在个别模块高度相似的情况下,应在鉴定意见中对各个功能模块的比对情况分别进行描述,以便更加真实地反映代码的相似程度。
四、软件源代码同一性鉴定方法
(一)鉴定前的源代码预处理
源代码预处理的目的是为了统一源代码的书写格式,以便在进行代码数量统计时,使被比对双方的源代码统计基准保持一致。预处理主要包括以下五个方面。
1.去除第三方的源代码
本节所指第三方的源代码是指非比对双方原创的代码。这些代码可能来自公开的开源软件、教科书,与硬件搭配的其他企业实例源代码等。这些代码一般可以通过代码文件的版权信息、开发者信息等注释内容加以区分。在进行源代码同一性鉴定前,应把这些代码文件或代码片段与比对双方原创的代码区别开来,在比对过程中不参与比对,或者参与比对了,应当在比对结果统计和鉴定意见中指明。
2.确定文件对应关系
确定源代码文件的对应关系是进行源代码比对的前提。任何软件的源代码都是以文件的形式存在,以文件夹的形式进行组织的。通过代码文件的名称、代码的逻辑功能确定被比对双方源代码的对应关系,进而开展源代码比对,这是进行科学而有效的源代码比对的基础。随着软件完成功能的不断完善,软件源代码规模不断增大,确定对应关系成为源代码比对中基础而又费时费力的一个重要环节。
3.规范空行和注释行的处理
严格来说,空行和注释行不是源代码的组成部分。在源代码编译成目标代码时,不计入目标代码中。因此,依据对等原则对被比对双方的源代码空行和注释行进行预处理,多数情况下删除双方的空行和注释行。也有例外的情况,如被比对双方的源代码基本相同,连注释行或者空行的位置也相同。这种现象从侧面反映被比对双方源代码具有同一性,而且得出同一性意见的依据与空行和注释行的处理没有直接关系。
4.规范源代码换行的格式
每一种计算机编程语言都规定了其特定的换行规则,程序员在编写代码时遵守这些规则进行代码换行。但在鉴定实践中,经常出现这样的情况:按照常规的换行,每一行的代码都非常短。比如,连续多个变量的声明,占用的行数比较多,程序员为了方便,将常规的多行代码写在一行。这种情况对源代码进行同一性比对,要将双方的换行规则进行统一,以便得出正确的行数统计结果。
5.以函数为单元重新组织代码顺序或重新拆分源代码文件
通过上述操作预处理后的代码,在代码组织结构上,还存在物理顺序不一致的情况。例如,同一函数在双方代码文件中的前后顺序不一致,多个函数则会产生函数位置交叉的情况。如果采用Beyond Compare进行机械的比对,比对结果显然不够准确,这也是现实鉴定案件中产生鉴定偏差的最为普遍的现象之一。鉴定中采用的处理方式是:增加源代码行号,按照函数的对应关系,重新组织代码文件,或者以函数为单元重新拆分源代码文件。对于代码文件数量多、代码量大的情况,采用前一种方式较为方便;对于代码文件数量少,每个文件的代码又比较多的情况,如嵌入式软件的源代码,采用后一种方式更为方便。
(二)单一源代码文件同一性比对
1.源代码的形式比对
单一源代码文件构成的软件系统多存在嵌入式软件中。首先,进行源代码的形式比对,即在对源代码文件进行规范空行和注释行、规范源代码换行格式预处理的基础上,应用Beyond Compare比对双方源代码,统计相同代码比例,见表4-1。
表4-1 单一源代码文件同一性比对结果统计表(形式一)
形式比对是在不关注源代码功能情况下进行的,一般是鉴定人采取的试探性比对,以了解双方代码相似性概况为目的。因此,只有在其比对结果相同比例较高的情况下,才会直接给出同一性的鉴定意义;否则,需要进一步对源代码进行功能性比对。
2.源代码的功能比对
进行功能性比对需要做进一步的代码预处理,其基本比对过程如下。
(1)标注行号。
(2)确定函数对应关系,按对应关系调整代码顺序。
(3)阅读源代码,以函数为单元,进行代码功能比对。
这里所说的代码功能以代码本身的逻辑功能为主,同时兼顾其业务功能。例如,下面这一段代码:int a=50; int b=60; int c=a+b;代码的逻辑功能是说变量c是变量a和b之和。如果对代码所处的前后环境和软件功能缺乏进一步的信息,就难以确定这段代码的业务功能。因为这既可以是计算两个人的体重之和,也可以是计算两个地点之间的距离。
代码的功能比对可以按行逐一比对,也可以按函数逐一比对。比对的结果一般分为相同、实质相同(或实质相似)和不同。其中,实质相同(或实质相似)适用于以代码重构方式进行的源代码修改。
4.统计比对结果,绘制统计数据表
按照表4-2的形式统计比对结果。
表4-2 单一源代码文件同一性比对结果统计表(形式二)
(三)源代码文件集合同一性比对
对比对双方源代码由多种计算机语言设计、包含多种类型、多个源代码文件的鉴定,在确定功能模块对应关系、代码文件对应关系、代码预处理、单一文件比对基础上,为了反映比对结果的整体情况,应对比对结果进行整体层面的统计,统计形式可参看表4-3。
表4-3 源代码文件集合同一性比对结果统计表
(四)鉴定意见的表述
源代码同一性鉴定的比对结果要在最终的鉴定意见中加以体现。然而,由于软件鉴定案件的复杂性,多数鉴定案件很难直接给出相同或不相同的结论。
1.单一源代码文件的同一性鉴定意见表述
目前,国内各鉴定机构在源代码同一性鉴定意见的表述中经常使用相同、不同、基本相同、实质相同、实质相似的表述。其中,相同、不同较为明确;但对于基本相同、实质相同、实质相似,业界并没有统一的标准,甚至是争议比较大的内容。在作者所参与的鉴定案件中,基于以下理解对鉴定意见加以表述:“基本相同”侧重代码规模,可以理解为比对双方相同和实质相同的代码行数占双方各自代码行数的比例较大;“实质相同”侧重代码质量,可以理解为比对双方的代码排除代码重构因素后,代码相同;实质相似与实质相同的表述类似,在实践中不严格区分。除此之外,无法用上述概念给出鉴定意见的情况下,直接用表4-2、表4-3的形式作为鉴定意见,也是较为常见的。
2.源代码文件集合的同一性鉴定意见表述
相同、不同、基本相同、实质相同、实质相似的表述,在源代码文件集合的同一性鉴定中仍然广泛应用。只是在这种情况下,基本相同侧重代码文件的数量,可以理解为相同或实质相同的代码文件数量占比对双方代码文件数量的比例较高;实质相同和实质相似也是从代码集合的角度考虑。同样,在对于无法用上述表述给出鉴定意见的情况下,可以考虑直接用表4-3的形式作为鉴定意见。
对于鉴定意见,应根据案件的性质、代码的内容、比对的结果有针对性地、尽可能明确地予以表述。
五、源代码同一性鉴定问题探讨
(一)反编译得到的源代码比对
在对软件目标代码同一性鉴定中,常常需要对目标代码进行反编译获得反编译后的代码进行比对,如C、C++语言反编译得到汇编代码进行比对,JAVA程序反编译、C#程序反编译等。这类鉴定问题虽然是针对目标代码进行,但实际上仍采用源代码的比对方式。其中,需要特别注意的是,对比对双方进行反编译时,反编译的相关工具使用、条件设置须保持一致,因为不同的反编译工具,或者相同反编译工具的不同环境设置,都会导致反编译结果的较大差异,导致比对结果上差异。同时,也要注意反被编译得到的源代码中的一些非功能性内容,如代码的注释。
以上所说的反编译与《最高人民法院关于审理不正当竞争民事案件应用法律若干问题的解释》中的反向工程不完全相同。反向工程在该司法解释中被定义:通过技术手段对从公开渠道取得的产品进行拆卸、测绘、分析等而获得该产品的有关技术信息。而代码反编译,由于有反编译工具,使反编译极其简单,基本不需要进行“分析”,即可获得反编译代码。举例来说,针对百万行数量级的JAVA或C#代码,反编译时间仅以秒为单位,且反编译得到的代码与原始源代码差别非常小。
(二)跨语言的源代码比对
由于《计算机软件保护条例》第七条规定:“本条例对软件著作权的保护不延及开发软件所用的思想、处理过程、操作方法或者数学概念等。”因此,以往针对不同语言设计、编写的源代码,鉴定机构在多数情况下不予比对。但是,随着计算机编程语言的丰富,出现了源代码的跨语言的自动修改技术和工具,使侵权人在不需要付出一定劳动的情况下,就能够快速地将一种计算机语言的源代码转换成另一种语言,软件侵权也变得更加隐蔽。在这种情况下,采用适当的鉴定技术,是可以进行跨语言的源代码比对的。因此,要求计算机软件的司法鉴定要与时俱进,适应新技术的发展需求,更加谨慎细致地对待跨语言的软件知识产权司法鉴定问题。
随着人们知识产权保护意识的增强,软件知识产权纠纷显著增加。依托领域内技术专家的知识经验进行的知识产权司法鉴定,成为纠纷解决的主要依据之一。本节针对软件知识产权诉讼中源代码的同一性问题展开讨论,从源代码同一性司法鉴定的背景、法律依据、鉴定原则、鉴定方法进行分析总结。通过本节的研究为国内软件知识产权司法鉴定实践工作提供参考,也为国内软件企业进行知识产权保护提供借鉴。在后续的研究中,如何建立软件知识产权司法鉴定标准体系、方法体系,都是值得进一步研究的问题。