源代码静态分析装置的制作方法

文档序号:20996020发布日期:2020-06-05 22:11阅读:189来源:国知局
源代码静态分析装置的制作方法

本申请涉及软件检测技术领域,具体涉及一种面向星载软件的源代码静态分析装置。



背景技术:

随着现代信息技术的飞速发展,人类社会的信息化、智能化程度越来越高,计算机软件支撑起了物联网、大数据、人工智能等新兴领域的发展,计算机软件已经成为社会各个领域前进的重要载体,渗透到了社会生活的各个方面,普及到社会的各行业各领域,如交通、通信、金融以及国防安全等领域。因此,作为社会生活领域各方面的支撑,软件系统的安全性和可靠性显得尤其重要。不断提高软件的可靠性一直都是软件质量保证的研究重点。目前,软件产品的应用越来越广泛,软件系统的规模也越来越大,复杂度越来越高,人们对软件的可靠性和安全性要求也越来越高。

由于静态代码分析技术能够克服人工测试速度慢、效率低下的缺点,能在软件开发早期发现绝大多数的编码缺陷,是目前软件质量保障领域的研究重点和热点。静态分析技术是一种常用的软件分析技术,通过对源代码进行扫描,并分析其静态属性,能够在软件开发的早期发现并排除软件可能存在缺陷。静态代码分析可以在软件开发的整个生命周期中检测软件缺陷。学术界和工业界对此都做出了很多的努力,涌现出了大量的验证方法和工具。这些方法和工具针对的是系统不同的方面,而且各有优劣。然而,实际应用中,现有的方法和工具在提高软件源代码的安全性、可靠性方面效果不佳,不能满足实际应用的需要。



技术实现要素:

本申请的目的是提供一种源代码静态分析装置。为了对披露的实施例的一些方面有一个基本的理解,下面给出了简单的概括。该概括部分不是泛泛评述,也不是要确定关键/重要组成元素或描绘这些实施例的保护范围。其唯一目的是用简单的形式呈现一些概念,以此作为后面的详细说明的序言。

根据本申请实施例的一个方面,提供一种源代码静态分析装置,包括:

第一分析模块,用于对源代码进行词法分析和语法分析,生成抽象语法树;

第二分析模块,用于对所述抽象语法树进行语义分析,得到有向控制流图和数据流图;

遍历模块,用于对所述有向控制流图进行遍历,获取切片数据;

查找模块,用于根据所述数据流图和所述切片数据,查找并输出所述源代码中可能存在缺陷的变量。

进一步地,所述第一分析模块包括用于对源代码进行词法分析的词法分析模块;所述词法分析模块包括:

扫描识别模块,用于对所述源代码进行扫描,根据构词规则,采用正则表达式来识别所述源代码中的有用部分作为词法单元,产生由词法单元构成的序列;

匹配模块,用于将所述由词法单元构成的序列与预定义的缺陷序列进行匹配,将所述源代码中匹配成功的缺陷部分找出来并删除所述缺陷部分。

进一步地,所述第一分析模块包括用于对源代码进行语法分析的语法分析模块;所述语法分析模块具体用于:将经过所述词法分析的源代码按照语法规则转化成语句单元,构建抽象语法树。

进一步地,所述第二分析模块包括:

推导模块,用于定义所述抽象语法树的不同类型的节点,基于所述节点利用文法结构推导出所述抽象语法树中的语句;

第三分析模块,用于对所述语句进行控制流分析和数据流分析,生成有向控制流图和数据流图。

进一步地,所述遍历模块具体用于:

对所述有向控制流图的控制流指针进行分析,以指针作为参数和返回值,通过指针分析确定调用对象,通过所述调用对象确定新的指向关系,将传参和返回值赋值都作为指针赋值操作进行分析;采用路径敏感方法收集路径约束条件和变量约束条件的信息,得到所述切片数据。

进一步地,所述查找模块具体用于:根据分类安全规则集,结合抽象解释方法对所述数据流图和所述切片数据进行静态分析,查找出所述源代码中可能存在缺陷的变量并将其输出。

进一步地,所述遍历模块包括替换模块,所述替换模块用于:采用深度优先的遍历算法遍历所述控制流程图的各条分支路径,在每一条所述分支路径上,针对外部输入数据或者变量的值无法确定的情况,采用符号值替换的方式,将所述分支路径上对应的变量、参数和返回值进行符号替换。

进一步地,所述装置还包括预处理模块。

进一步地,所述预处理模块用于:在所述第一分析模块对源代码进行词法分析和语法分析,生成抽象语法树之前,滤掉源程序中的注释和空白,得到预处理后的源代码。

进一步地,所述有向控制流图包括节点以及节点间的有向边,其中,所述节点表示基本代码块,所述节点间的有向边代表控制流路径,所述有向边中的反向边代表可能存在的循环。

本申请实施例的其中一个方面提供的技术方案可以包括以下有益效果:

本申请实施例提供的源代码静态分析装置,通过对源代码进行词法分析和语法分析,生成抽象语法树,对抽象语法树进行语义分析,得到有向控制流图和数据流图,对有向控制流图进行遍历,获取切片数据,根据所述数据流图和所述切片数据,查找并输出源代码中可能存在缺陷的变量,可以完成对源代码的较全面的检查,可以解决星载软件中的编码缺陷问题,不仅提高了检查效率,降低了人力成本,而且能够有效地提高软件源代码的安全性、可靠性,降低了程序错误发生的几率,能够很好地满足实际应用的需要。

本申请的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者,部分特征和优点可以从说明书中推知或毫无疑义地确定,或者通过实施本申请实施例了解。本申请的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了本申请的一个实施例的源代码静态分析装置的结构框图;

图2示出了本申请的一个实施例中的遍历抽象语法树进行代码有效性检验的流程图;

图3示出了本申请的一个实施例中的第一分析模块的结构框图;

图4示出了本申请的一个实施例中的第二分析模块的结构框图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,下面结合附图和具体实施例对本申请做进一步说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本申请所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。

如图1所示,本申请的一个实施例提供了一种源代码静态分析装置,用于星载软件的源代码静态分析,包括:

第一分析模块10,用于对源代码进行词法分析和语法分析,生成抽象语法树。

具体地,静态分析验证工具首先对源代码进行词法分析和语法分析等,然后生成抽象语法树。通过词法分析对源代码进行分词。分词功能将顺序性读入源程序中的有限字符序列组织成具有词法含义的单词,称为词素或符号。其中词法分析依赖的词法规则,由编程语言所限定;比如c语言保留的关键字、所有运算符、控制字符和合法的标识符等。语法分析依赖于语法规则,而语法规则的设定由文法给出。一种编程语言的文法推导即是语言的语法规则,但是并不是文法的全部推导,而是其中部分推导才具有语法规则的意义。

对源程序字符流按顺序逐个字符进行扫描,同时根据构词规则,采用正则表达式的方法来识别有用部分作为词法单元,产生一个个词法单元构成的序列用以供后续语法分析,词法分析过程中能够记录每次读入源程序字符行的位置(这里指行号),当发生错误时可以顺利定位错误的位置;语法分析器将源代码标记符按照语法规则转化成语句单元,语句的结构表示基于抽象语法树。抽象语法树树形结构很好表示了代码的静态结构和文法信息,按照树的结构信息很容易知道程序的执行结果。

例如,首先通过命令行读入带检测工程的路径,遍历该路径下的所有cpp/c文件,对于每一个cpp/c文件,将其中包含的.h文件进行引入,将文件中的内容直接添加到cpp/c文件的首部。建立token符号链表,然后进行语法分析。

第二分析模块20,用于对抽象语法树进行语义分析,得到有向控制流图和数据流图。

具体地,对抽象语法树进行语义分析,对结构上正确的源程序进行上下文有关性质的审查;进行控制流分析和数据流分析,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环,生成有向控制流图。

抽象语法树是基于抽象语法结构将源代码转化为树形结构的一种表示方式。它描述了如何从文法结构来推导程序语言中的语句的过程。树的节点分为不同的类型如二元表达式、声明、函数定义等。抽象语法树不仅能获取语法信息如整数指针赋值给指针,还可以获取抽象语法树的语义信息如私有变量访问出错。在某些实施方式中,对抽象语法树进行语义分析包括遍历抽象语法树进行代码有效性检验的步骤。如图2所示,编译器遍历抽象语法树进行代码有效性检验,同时生成一些中间单元,为编译链接做准备。binaryoperator代表二进制操作符。

语义分析是在语法无误的基础上对源代码的逻辑判断阶段,通过分析源代码的上下文信息保证语义的正确性。如在对某个变量赋值时需要检测被赋值变量和赋值变量的类型是否一致或是否满足强制转化关系,在函数调用时不仅需要检测函数是否声明、函数定义参数个数和类型,函数调用使用的参数是否和定义一致,是否存在重载等。语义分析通过判断源代码语义逻辑,将各种语义信息插入到生成的抽象语法树中,为程序的执行做准备。抽象语法树包含各种不同的节点类型、变量类型转化过程和计算的优先过程等等各种信息,这些都是语义分析的结果。语义分析的结果通过抽象语法树反映,为静态检测的过程提供了信息基础。

控制流信息基于编程语言的控制语句获取源代码的执行流程。如if或while语句。控制流语句不同于顺序执行语句,它可以通过改变条件判断语句控制程序的执行过程。分析控制语句获取控制流信息可以获取源代码的静态执行逻辑,进而判断是否存在缺陷。如在判断循环语句是否会陷入死循环时,通过获取条件语句和内部执行语句中条件变量的变化情况判断条件语句的执行过程。如果条件语句变量无变化且内部语句块没有该变量值变化的语句块,那么可以判断代码会陷入死循环,存在缺陷漏洞。

数据流信息是变量在程序执行过程中取值和状态不断变化是信息汇总。数据流信息是研究一段代码如何操纵其数据的全局信息变化的重要依据。数据流信息主要追踪变量的值变化情况如在函数参数引用、变量赋值、指针修改等操作都有可能改变变量值的状态,从而发现重复代码错误、数值范围类型、越界类型、控制流类型、数据流类型、函数调用类型和代码格式类型等类型的缺陷漏洞。控制流图为一个有向图,由基本代码块表示节点集合,节点之间的关系表示边集合组成,路径则为控制流程图中任意一条执行序列,根据需求给出路径条件的定义以及约束集合。

遍历模块30,用于对有向控制流图进行遍历,获取切片数据。

具体地,对有向控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。

查找模块40,用于根据所述数据流图和所述切片数据,查找并输出所述源代码中可能存在缺陷的变量。

具体地,分析验证工具基于数据流图和所述切片数据判断源代码中哪些变量可能存在缺陷,是否存在验证程序输入、识别代码表达缺陷等问题。

在某些实施方式中,所述装置还包括:

预处理模块00,用于对源代码进行预处理。

预处理模块00具体用于:在所述第一分析模块10对源代码进行词法分析和语法分析,生成抽象语法树之前,滤掉源程序中的注释和空白,得到预处理后的源代码。

预处理包括:滤掉源程序中的注释和空白,去除注释语句,得到预处理后的源代码。

在某些实施方式中,对源代码进行预处理,包括:去除注释语句,处理宏定义和预编译。

参考图3所示,第一分析模块10包括用于对源代码进行词法分析的词法分析模块101和用于对源代码进行语法分析的语法分析模块102;

词法分析模块101包括:

扫描识别模块1011,用于通过词法分析器对预处理后的源代码进行扫描,根据构词规则,采用正则表达式的方法来识别预处理后的源代码中的有用部分作为词法单元,产生由词法单元构成的序列;

匹配模块1012,用于将由词法单元构成的序列与预定义的缺陷序列进行匹配,以将源代码中匹配成功的缺陷部分找出来并删除缺陷部分;

语法分析模块102,用于通过语法分析器将经过词法分析的源代码按照语法规则转化成语句单元,构建抽象语法树,其达到的有益技术效果是能够清晰有效地表示代码的静态结构和文法信息,按照树的结构信息很容易得出源代码的执行结果。

如图4所示,第二分析模块20包括:

推导模块201,用于定义所述抽象语法树的不同类型的节点(如二元表达式、声明、函数等),基于所述节点利用文法结构推导出所述抽象语法树中的语句,其目的是对结构上正确的源程序进行上下文有关性质的审查;

第三分析模块202,用于对所述语句进行控制流分析和数据流分析,生成有向控制流图和数据流图。

所述有向控制流图包括节点以及节点间的有向边,其中,节点表示基本代码块,节点间的有向边代表控制流路径,有向边中的反向边代表可能存在的循环,其达到的有益技术效果是能够通过编译器遍历语法获取语法树的语义信息,从而实现对代码的有效性检验,同时生成一些中间单元,为编译链接做准备。

在某些实施方式中,遍历模块30具体用于:

对所述有向控制流图的控制流指针进行分析,以指针作为参数和返回值,通过指针分析确定调用对象,通过所述调用对象确定新的指向关系,采用内联的方法处理上下文敏感性,将传参和返回值赋值都作为指针赋值操作进行分析。采用路径敏感方法收集路径约束条件和变量约束条件的信息,记录和保存切片相关数据信息,得到切片数据;其达到的有益技术效果是使得静态属性分析更加充分,能够有效减少误报和漏报。

在某些实施方式中,遍历模块30包括替换模块301,所述替换模块301用于:采用深度优先的遍历算法遍历控制流程图的各条分支路径,在每一条分支路径上,针对外部输入数据或者变量的值无法确定的情况,采用符号值替换的方式,将分支路径上对应的变量、参数和返回值等进行符号替换,如果变量的值能够确定,则采用确定的实际值。

在某些实施方式中,查找模块40具体用于:根据分类安全规则集,结合抽象解释方法对所述数据流图和所述切片数据进行静态分析,查找出所述源代码中可能存在缺陷的变量并将其输出。

在某些实施方式中,在符号执行的过程中,为每一个动态分配的内存维持一个内存状态转移图,根据相关指针的状态和内存行为,来实现内存泄漏缺陷的检测。最后通过token的行号定位出程序缺陷位置,实现软件缺陷自动检测。

本实施例的装置通过对星载软件的静态分析,结合抽象解释等技术,可以解决星载软件中的数据溢出、资源泄露,内存泄漏、空指针引用和参数非空检查等问题。

本实施例的源代码静态分析装置,利用抽象语法树将程序组织成树形结构,树形结构中的相关节点代表了程序中的相关代码,然后通过工具对抽象语法树进行语义分析,对树形结构上正确的源程序进行上下文有关性质的审查,进行控制流分析和数据流分析,生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。最后,通过分析验证工具基于数据流图判断源代码中哪些变量可能存在缺陷。

通过对星载软件的静态分析,结合抽象解释等技术,可以解决星载软件中的数据溢出、资源泄露,内存泄漏、空指针引用和参数非空检查等问题,可以达到对源代码进行较全面的检查。而且本装置是很容易扩展的,即添加对新语言的支持是非常容易的,需要定义相应的缺陷规则即可。本装置不仅提高了检查效率,降低了人力成本,而且能够有效地提高软件源代码的安全性、可靠性,降低了出现程序错误的几率。

本申请的另一实施例提供了一种面向星载软件的源代码静态分析装置,用于对星载软件的源代码进行静态分析,包括:

第一模块,用于通过命令行读入带检测工程的路径,遍历该路径下的所有cpp/c文件,对于每一个cpp/c文件,将其中包含的.h文件进行引入,将文件中的内容直接添加到cpp/c文件的首部。

第二模块,用于建立token符号链表,然后进行语法分析。在语法分析的基础上,对程序进行针对性的处理,主要是指针作为函数参数和返回值,指针赋值等与内存相关的操作等上下文信息的分析。为了在静态分析中生成控制流程图时,减少循环造成的分支路径爆炸的问题,并检测内存和数组的越界访问缺陷,在静态分析过程中将计算循环迭代次数,然后将循环替换成if条件分支,在控制流程图上与条件分支一样做处理,然后生成控制流程图,并对控制流程图进行不可达分支剪枝。

第三模块,用于采用深度优先的遍历算法遍历控制流程图的各条分支路径,在每一条分支路径上,针对外部输入数据或者变量的值无法确定的情况,采用符号值替换的方式,将分支路径上对应的变量、参数和返回值等进行符号替换,如果变量的值能够确定,则采用实际值。在符号执行的过程中,为每一个动态分配的内存维持一个内存状态转移图,根据相关指针的状态和内存行为,来实现内存泄漏缺陷的检测。最后通过token的行号定位出程序缺陷位置,实现软件缺陷自动检测。

第四模块,用于采用路径敏感方法收集路径约束条件和变量约束条件的信息,记录和保存切片相关数据信息,结合抽象解释等技术,可以解决星载软件中的数据溢出、资源泄露,内存泄漏、空指针引用和参数非空检查等问题,使得静态属性分析更加充分,能够有效减少误报和漏报。

本实施例的装置能够通过对星载软件的源代码的静态分析,结合抽象解释等技术,可以解决星载软件中的数据溢出、资源泄露,内存泄漏、空指针引用和参数非空检查等问题。

需要说明的是:

术语“模块”并非意图受限于特定物理形式。取决于具体应用,模块可以实现为硬件、固件、软件和/或其组合。此外,不同的模块可以共享公共组件或甚至由相同组件实现。不同模块之间可以存在或不存在清楚的界限。

在此提供的算法和显示不与任何特定计算机、虚拟装置或者其它设备固有相关。各种通用装置也可以与基于在此的示教一起使用。根据上面的描述,构造这类装置所要求的结构是显而易见的。此外,本申请也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本申请的内容,并且上面对特定语言所做的描述是为了披露本申请的最佳实施方式。

在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本申请的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。

类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本申请的示例性实施例的描述中,本申请的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本申请要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本申请的单独实施例。

本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。

此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本申请的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。

本申请的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(dsp)来实现根据本申请实施例的虚拟机的创建装置中的一些或者全部部件的一些或者全部功能。本申请还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本申请的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。

应该注意的是上述实施例对本申请进行说明而不是对本申请进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本申请可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

以上所述实施例仅表达了本申请的实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

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