软件源代码的验证方法及装置与流程

文档序号:12719009阅读:800来源:国知局
软件源代码的验证方法及装置与流程

本发明涉及计算机技术领域,尤其涉及一种软件源代码的验证方法及装置。



背景技术:

编译器是计算机系统的重要系统软件之一,所有采用高级语言编写的软件源代码都必须通过编译器的编译,生成计算机能够识别的可执行代码,因此保证编译器编译过程的准确性对于整个计算机系统而言至关重要。

目前现有技术验证软件源代码准确性的主要手段是:编译器通过编译大量的软件源代码,生成可执行代码,然后运行生成的可执行代码,比较实际运行结果与预期结果是否一致来验证软件源代码的准确性。但是,这种检验软件源代码准确性的方法并不能保证软件源代码100%的正确率,软件源代码中存在的有些错误,可能并不会影响到编译后的可执行代码的运行结果,但是,这种软件源代码中所存在的错误会使软件存在漏洞,遭受网络黑客攻击的风险较高,影响到软件的安全性。

因此,为保证软件的安全性,亟需一种有效地验证软件源代码,及时且准确发现软件源代码错误的方法。



技术实现要素:

本发明提供一种软件源代码的验证方法及装置,以解决现有技术中当软件源代码存在错误,且当软件源代码的可执行代码行结果与预期结果一致时,无法发现软件源代码中的错误的问题。

第一方面,本发明提供一种软件源代码的验证方法,包括:

根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个所述文法单元;

基于预设的下推自动机,对每个文法单元进行识别;

识别通过后,将所述文法单元编译为目标代码段;

根据预设的专用公理集,获取所述文法单元对应的第一指称语义,获取所述目标代码段对应的第二指称语义;

判断所述第一指称语义与所述第二指称语义是否一致;

若所述第一指称语义与所述第二指称语义不一致,确定所述软件源代码存在错误。

可选地,所述文法单元为循环结构文法单元或非循环结构文法单元;

若所述文法单元为循环结构文法单元,相应的,所述判断所述第一指称语义与所述第二指称语义是否一致,包括:

基于循环交互证明算法,所述判断所述第一指称语义与所述第二指称语义是否一致;

若所述文法单元为非循环结构文法单元,相应的,所述判断所述第一指称语义与所述第二指称语义是否一致,包括:

基于自动推理算法,比较所述第一指称语义与所述第二指称语义是否一致。

可选地,所述判断所述第一指称语义与所述第二指称语义是否一致之后,所述方法还包括:

若所述软件源代码中的每个文法单元的所述第一指称语义与所述第二指称语义均一致,确定所述软件源代码正确;

将所述软件源代码中的每个文法单元所对应的目标代码段进行组合,得到所述软件源代码对应的目标代码。

可选地,所述预设的下推自动机包含第一动作函数,所述第一动作函数包括状态调用接口和状态返回接口;

所述状态调用接口用于跳转到所述下推自动机的第二动作函数;所述第二动作函数为所述状态调用接口对应的动作函数;

所述状态返回接口用于从所述第二动作函数返回到所述第三动作函数;所述第三动作函数为位于所述第一动作函数之后的下一个动作函数;

相应的,所述基于预设的下推自动机,对每个文法单元进行识别,包括:

将所述预设的下推自动机的第一动作函数的字符与所述文法单元的的当前字符匹配;

匹配成功后,根据所述第一动作函数状态函数的状态调用接口,跳转到所述第二动作函数,将所有第二动作函数的字符与所述当前文法单元相关联的子文法单元的所有字符进行匹配;

匹配成功后,根据所述第一动作函数的状态返回接口返回所述第三动作函数,将所述第三动作函数的字符与所述文法单元的的当前字符的下一个字符进行匹配。

可选地,所述方法还包括:当确定所述软件源代码存在错误之后,修正所述文法单元对应的软件源代码。

第二方面,本发明提供一种软件源代码的验证装置,包括:

划分模块,根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个所述文法单元;

识别模块,基于预设的下推自动机,对每个文法单元进行识别;

编译模块,识别通过后,将所述文法单元编译为目标代码段;

获取模块,根据预设的专用公理集,获取所述文法单元对应的第一指称语义,获取所述目标代码段对应的第二指称语义;

判断模块,判断所述第一指称语义与所述第二指称语义是否一致;

第一确定模块,若所述第一指称语义与所述第二指称语义不一致,确定所述软件源代码存在错误。

可选地,所述文法单元为循环结构文法单元或非循环结构文法单元;

所述判断模块,具体用于当所述文法单元为循环结构文法单元时,基于循环交互证明算法,所述判断所述第一指称语义与所述第二指称语义是否一致;或当所述文法单元为非循环结构文法单元时,基于自动推理算法,比较所述第一指称语义与所述第二指称语义是否一致。

可选地,所述装置还包括:

第二确定模块,用于所述判断模块判断所述第一指称语义与所述第二指称语义是否一致之后,若所述软件源代码中的每个文法单元的所述第一指称语义与所述第二指称语义均一致,确定所述软件源代码正确;

组合模块,用于将所述软件源代码中的每个文法单元所对应的目标代码段进行组合,得到所述软件源代码对应的目标代码。

可选地,所述预设的下推自动机包含第一动作函数,所述第一动作函数包括状态调用接口和状态返回接口;所述状态调用接口用于跳转到所述下推自动机的第二动作函数;所述第二动作函数为所述状态调用接口对应的动作函数;所述状态返回接口用于从所述第二动作函数返回到所述第三动作函数;所述第三动作函数为位于所述第一动作函数之后的下一个动作函数。

所述识别模块,具体用于将所述预设的下推自动机的第一动作函数的字符与所述文法单元的的当前字符匹配;匹配成功后,根据所述第一动作函数状态函数的状态调用接口,跳转到所述第二动作函数,将所有第二动作函数的字符与所述当前文法单元相关联的子文法单元的所有字符进行匹配;匹配成功后,根据所述第一动作函数的状态返回接口返回所述第三动作函数,将所述第三动作函数的字符与所述文法单元的的当前字符的下一个字符进行匹配。

可选地,所述装置还包括:修正模块,用于当确定所述软件源代码存在错误之后,修正所述文法单元对应的软件源代码。

从本发明的实施例可知,本发明通过根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个所述文法单元;基于预设的下推自动机,对每个文法单元进行识别;识别通过后,将所述文法单元编译为目标代码段;根据预设的专用公理集,获取所述文法单元对应的第一指称语义,获取所述目标代码段对应的第二指称语义;判断所述第一指称语义与所述第二指称语义是否一致;若所述第一指称语义与所述第二指称语义不一致,确定所述软件源代码存在错误。本发明解决了现有技术中当软件源代码存在错误,且当软件源代码的可执行代码的运行结果与预期结果一致时,无法发现软件源代码中的错误的问题。

附图说明

图1为一示例性实施例示出的一种软件源代码的验证方法的流程示意图;

图2为另一示例性实施例示出的一种软件源代码的验证方法的流程示意图;

图3为一示例性实施例示出的一种软件源代码的验证装置的结构示意图;

图4为另一示例性实施例示出的一种软件源代码的验证装置的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,为一示例性实施例示出的一种软件源代码的验证方法的流程示意图,包括:

步骤101、根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个文法单元。

其中,上述编程语言可以是C语言、JAVA语言等编程语言,对此本发明不作任何的限制。

其中,对软件源代码进行文法单元的划分的依据是该文法单元为软件源代码中具有独立功能的可单独编译的一段软件源代码,然后通过提取该段软件源代码中的特征字符(如,关键标识符、分隔符等),得到该段软件源代码的文法单元。

步骤102、基于预设的下推自动机,对每个文法单元进行识别。

其中,下推自动机为软件代码验证过程常用的计算模型,其主要功能是实现对软件代码的自动识别和自动编译等。

步骤103、识别通过后,将文法单元编译为目标代码段。

其中,该编译过程可以通过编译器,也可以通过下推自动机实现。

其中,目标代码段可以是中间代码(如汇编代码),也可以是其他形式的代码(如机器码),对此本发明不作任何的限制

步骤104、根据预设的专用公理集,获取文法单元对应的第一指称语义,获取目标代码段对应的第二指称语义。

其中,预设的专用公理集可以是MIPS和/或PowerPC指令集,MIPS、PowerPC指令集包含了不同的文法单元的指称语义,以及不同的目标代码段的指称语义。

步骤105、判断第一指称语义与第二指称语义是否一致。

其中,对于文法单元的类型,可采用不同的方法判断第一指称语义与第二指称语义是否一致。如根据文法单元是否为循环语句结构,采用不同的算法判断第一指称语义与第二指称语义是否一致。

步骤106、若第一指称语义与第二指称语义不一致,确定软件源代码存在错误。

从上述实施例可知,本发明通过根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个文法单元;基于预设的下推自动机,对每个文法单元进行识别;识别通过后,将文法单元编译为目标代码段;根据预设的专用公理集,获取文法单元对应的第一指称语义,获取目标代码段对应的第二指称语义;判断第一指称语义与第二指称语义是否一致;若第一指称语义与第二指称语义不一致,确定软件源代码存在错误。本发明解决了现有技术中当软件源代码存在错误,且当软件源代码的可执行代码行结果与预期结果一致时,无法发现软件源代码中的错误的问题。

如图2所示,为一示例性实施例示出的一种软件源代码的验证方法的流程示意图,包括:

步骤201、根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个文法单元。

步骤202、基于预设的下推自动机,对每个文法单元进行识别。

具体的,预设的下推自动机包含第一动作函数,第一动作函数包括状态调用接口和状态返回接口;状态调用接口用于跳转到下推自动机的第二动作函数;第二动作函数为状态调用接口对应的动作函数;状态返回接口用于从第二动作函数返回到第三动作函数;第三动作函数为位于第一动作函数之后的下一个动作函数;相应的,基于预设的下推自动机,对每个文法单元进行识别,包括:将预设的下推自动机的第一动作函数的字符与文法单元的的当前字符匹配;匹配成功后,根据第一动作函数状态函数的状态调用接口,跳转到第二动作函数,将所有第二动作函数的字符与当前文法单元相关联的子文法单元的所有字符进行匹配;匹配成功后,根据第一动作函数的状态返回接口返回第三动作函数,将第三动作函数的字符与文法单元的的当前字符的下一个字符进行匹配。

其中,第一动作函数被定义为:

δ(Status,*,Z0)=(<Status-Call>,Z1)

式中,*代表任意输入字符(包括空字符ε);状态调用接口<Status-Call>定义为:[Jump-Status,Return-Status],即动作函数为:δ(Status,*,Z0)=([Jump-Status,Return-Status],Z1),<Status-Call>视为新的状态:Status',即动作函数为:δ(Status,*,Z0)=(Status',Z1)。

步骤203、识别通过后,将文法单元编译为目标代码段。

关于步骤202和203的具体过程,可通过表1、表2的具体应用实施例来表示。其中,表1为文法单元1及其下推自动机、目标代码段1,表2为

为文法单元2及其下推自动机、目标代码段2。其中,表1中δ(i1,ε,()=([LogExp,i2],()为第一动作函数、δ(i2,),()=(i3,if)为第三动作函数;

表2中δ(LogExp,ε,)=([RellogExp,l0],@)为第二动作函数。

表1

表2

步骤204、根据预设的专用公理集,获取文法单元对应的第一指称语义,获取目标代码段对应的第二指称语义。

步骤205、判断第一指称语义与第二指称语义是否一致,若不一致,执行步骤206;若一致,执行步骤207。

具体的,文法单元为循环结构文法单元或非循环结构文法单元;

若文法单元为循环结构文法单元,相应的,判断第一指称语义与第二指称语义是否一致,包括:基于循环交互证明算法,判断第一指称语义与第二指称语义是否一致;

其中,循环交互证明算法的具体过程为:对循环结构文法单元设定循环次数;根据循环次数,按照预先设定的循环次数,对第一语义和第二语义进行推算,获取第一指称语义的第一推算结果,以及二指称语义的第二推算结果,判断第一推算结果与第二推算结果是否一致;

若文法单元为非循环结构文法单元,相应的,判断第一指称语义与第二指称语义是否一致,包括:

基于自动推理算法,比较第一指称语义与第二指称语义是否一致。

步骤206、确定软件源代码存在错误。

步骤207、确定软件源代码正确,将软件源代码中的每个文法单元所对应的目标代码段进行组合,得到软件源代码对应的目标代码。

从上述实施例可知,本发明通过根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个文法单元;基于预设的下推自动机,对每个文法单元进行识别;识别通过后,将文法单元编译为目标代码段;根据预设的专用公理集,获取文法单元对应的第一指称语义,获取目标代码段对应的第二指称语义;判断第一指称语义与第二指称语义是否一致;若第一指称语义与第二指称语义不一致,确定软件源代码存在错误。本发明解决了现有技术中当软件源代码存在错误,且当软件源代码的可执行代码的运行结果与预期结果一致时,无法发现软件源代码中的错误的问题。同时,通过在下推自动机中设置包含状态调用接口和状态返回接口的第一动作函数,解决了传统下推自动机中对文法单元的识别和编译效率差的问题。

可选地,在上述实施例的基础上,在步骤206之后,还包括:当第一指称语义与第二指称语义不一致,确定软件源代码存在错误之后,修正文法单元对应的软件源代码。

如图3所示,为一示例性实施例示出的一种软件源代码的验证装置的结构示意图,包括:划分模块301、识别模块302、编译模块303、获取模块304、判断模块305、第一确定模块306。

其中,划分模块301,根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个所述文法单元;

识别模块302,基于预设的下推自动机,对每个文法单元进行识别;

编译模块303,识别通过后,将所述文法单元编译为目标代码段;

获取模块304,根据预设的专用公理集,获取所述文法单元对应的第一指称语义,获取所述目标代码段对应的第二指称语义;

判断模块305,判断所述第一指称语义与所述第二指称语义是否一致;

第一确定模块306,若所述第一指称语义与所述第二指称语义不一致,确定所述软件源代码存在错误。

从上述实施例可知,本发明通过根据编程语言的语法规则,对软件源代码进行文法单元的划分,得到至少一个文法单元;基于预设的下推自动机,对每个文法单元进行识别;识别通过后,将文法单元编译为目标代码段;根据预设的专用公理集,获取文法单元对应的第一指称语义,获取目标代码段对应的第二指称语义;判断第一指称语义与第二指称语义是否一致;若第一指称语义与第二指称语义不一致,确定软件源代码存在错误。本发明解决了现有技术中当软件源代码存在错误,且当软件源代码的可执行代码的运行结果与预期结果一致时,无法发现软件源代码中的错误的问题。

可选地,在上述实施例的基础上,所述文法单元为循环结构文法单元或非循环结构文法单元;

所述判断模块305,具体用于当所述文法单元为循环结构文法单元时,基于循环交互证明算法,所述判断所述第一指称语义与所述第二指称语义是否一致;或当所述文法单元为非循环结构文法单元时,基于自动推理算法,比较所述第一指称语义与所述第二指称语义是否一致。

可选地,参考图4,所述装置还包括:

第二确定模块307,用于所述判断模块判断所述第一指称语义与所述第二指称语义是否一致之后,若所述软件源代码中的每个文法单元的所述第一指称语义与所述第二指称语义均一致,确定所述软件源代码正确;

组合模块308,用于将所述软件源代码中的每个文法单元所对应的目标代码段进行组合,得到所述软件源代码对应的目标代码。

可选地,所述预设的下推自动机包含第一动作函数,所述第一动作函数包括状态调用接口和状态返回接口;所述状态调用接口用于跳转到所述下推自动机的第二动作函数;所述第二动作函数为所述状态调用接口对应的动作函数;所述状态返回接口用于从所述第二动作函数返回到所述第三动作函数;所述第三动作函数为位于所述第一动作函数之后的下一个动作函数。

所述识别模块302,具体用于将所述预设的下推自动机的第一动作函数的字符与所述文法单元的的当前字符匹配;匹配成功后,根据所述第一动作函数状态函数的状态调用接口,跳转到所述第二动作函数,将所有第二动作函数的字符与所述当前文法单元相关联的子文法单元的所有字符进行匹配;匹配成功后,根据所述第一动作函数的状态返回接口返回所述第三动作函数,将所述第三动作函数的字符与所述文法单元的的当前字符的下一个字符进行匹配。

可选地,所述装置还包括:修正模块309,用于当确定所述软件源代码存在错误之后,修正所述文法单元对应的软件源代码。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1