CN101036127A - 源码检查器、方法、程序以及存储介质 - Google Patents
源码检查器、方法、程序以及存储介质 Download PDFInfo
- Publication number
- CN101036127A CN101036127A CNA200580033901XA CN200580033901A CN101036127A CN 101036127 A CN101036127 A CN 101036127A CN A200580033901X A CNA200580033901X A CN A200580033901XA CN 200580033901 A CN200580033901 A CN 200580033901A CN 101036127 A CN101036127 A CN 101036127A
- Authority
- CN
- China
- Prior art keywords
- source code
- mentioned
- program
- model
- extracted
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Abstract
本发明涉及一种对计算机程序的源码所表示的程序动作相关的诸性质进行检查的源码检查器以及源码检查方法、执行该方法的程序、以及存储该程序的存储介质。该源码检查方法具有:路径抽出步骤、和检查内容决定步骤。路径抽出步骤,通过模拟执行预先输入的计算机用程序的源码所描述的程序,来抽出实际执行的命令串。检查内容决定步骤,根据路径抽出步骤所抽出的命令串,决定源码的检查内容。
Description
技术领域
本发明,涉及一种对与计算机程序的源码所表示的程序的动作相关各个性质进行检查的源码检查器以及源码检查方法、用来执行该方法的程序、以及用来存储该程序的存储介质。
背景技术
作为以往的源码检查器,有对与源码所表示的程序(以下也称作应用程序)的动作相关的诸性质进行检查的源码分析器。作为源码分析器的例子,有使用模型检查技术对源码进行分析的源码模型检查器。
源码所表示的应用程序的动作,是指按照源码中所描述的一系列命令的、程序的一系列动作。与该动作相关的诸性质的例子,可以列举出:在动态确保存储器的情况下必须释放该存储器的性质、在执行了程序中的某个命令的情况下早晚必须要执行对应的特定命令的性质等。
模型检查是指,输入表示要检查的性质的规格与成为检查对象的模型,判断模型是否具有规格所表示的性质。进行模型检查的装置称作模型检查器,描述成为检查对象的模型的称为模型描述。用于描述模型的语言,根据模型检查器而有所不同。例如,在模型检查器SPIN的情况下,用来描述模型的语言称作“Promela”。
模型检查器SPIN,是对作为有限状态迁移系统而模型化的系统是否满足通过线性时间逻辑式所描述的检查式以全状态检索进行网罗式检查的检查器。模型检查器SPIN,例如公开在Gerard J.Holzmann,‘The modelChecker Spin’,IEEE Trans,On Software Engineering,Vol.23,No.5,May1997,pp.279-295。
源码模型检查,是指以源码为检查对象的模型检查,是用来与以逻辑电路等硬件为对象的模型检查即硬件模型检查对比而使用的术语。
作为以往的源码检查器,有的使用用来将源码翻译成模型检查器的输入语言的变换表。这种构成,例如公开在美国专利申请公开第2001/037492号、美国专利申请公开第2002/100022号中。图14为表示美国专利申请公开第2001/037492号中所记载的以往的源码检查器之构成的方框图。
作为图14中所示的以往的源码检查器的模型检查器,从源码输入部1302输入成为检查对象的源码1301。接下来,该源码检查器,在源码变换表生成部1303中,基于由源码输入部1302所接收的源码1301,构成控制流向图。然后,对根据该控制流向图成为检查对象的源码1301的各个语句,生成集合有通过对应的模型描述语言、例如Promela描述写出的对译例的源码变换表1304。
接下来,模型描述生成部1305,使用源码变换表1304中含有的对译例,将源码1301变换成模型描述语言。另外,规格输入部1307,将记载有表示所输入的要检查的源码1301的性质的规格的要检查的规格1308,发送给模型检查器执行部1306。之后,模型检查器执行部1306,使用来自规格输入部1307的规格1308、和模型描述生成部1305中所生成的模型描述,执行模型检查,并输出检查结果1309。
另外,在自动生成的源码变换表1304不符合源码模型检查器使用者的意图的情况下,使用者的修正机构1310需要对源码变换表1304适当进行修正。例如,成为检查对象的源码1301,处理该源码以外的、例如与外部模型间的通信等情况。源码变换表生成部1303经常无法示出适当的翻译例,需要使用者进行弥补。
源码模型检查中所使用的Promela等模型描述语言,与描述源码的例如C语言等编程语言的表现力是不同的。具体的说,存在编程语言能够描述,而模型描述语言无法描述的迁移条件。因此,本质上就很难将源码所表示的动作准确地翻译成模型描述语言,经常难以生成适当的源码变换表。因此,存在的问题是,很多情况下无法获得对成为检查对象的源码所表示的动作准确进行再现的模型描述,导致检查不正确。
详细说明的话,模型检查按照以下顺序进行:根据模型的描述,生成标号有向图(labeled directed graph),并对该图是否满足例如通过线性时间逻辑式等所给出的规格所表示的制约进行判断。线性时间逻辑式,通过给命题逻辑式添加时间概念而构成,广泛应用于对状态迁移模型进行形式描述时等。
标号有向图由顶点与边的集合构成。各个边表示两个顶点间的关系,在连接顶点彼此的边中存在朝向。也即,标号有向图中,存在与边的起点以及终点逐个对应的顶点,各个顶点中附有标号。
在将标号有向图的各个顶点看作状态,将沿着边的朝向移动顶点看作状态迁移时,可以将标号有向图看作状态迁移图。各个顶点的标号,能够看作各个状态下所产生的事件等。另外,模型检查,对该事件发生的列是否满足所给出的规格的制约进行判断。
但是,标号有向图不存在迁移条件。迁移条件是指在存在以某个顶点为起点的多个边时,对应当迁移到哪个边终点的起点进行判断的条件。迁移条件不存在,表示在有以某个顶点为起点的多个边时,能够任意选择将哪个边的顶点所对应的状态看作下一个状态。模型检查通常对是否违反了要检查的规格的制约进行确认,因此对于可任意选择的迁移目的地,总是选择最差的情况。
但是,表示源码所表示的动作的状态迁移图,一般通过带有迁移条件的标号有向图来表示。例如,通过if语句等所表示的条件节,通过该条件式的真伪来决定下一个状态。
根据以上理由,存在的问题是:通过没有迁移条件的标号有向图所表示的模型描述语言,与通过带迁移条件的标号有向图所表示的一般的编程语言之间,通过逐句翻译来进行变换本质上很困难。另外,以往的方法中,检查器的使用者很难对源码变换表进行修正。
具体来说,检查器的使用者进行源码变换表的修正时,需要理解变换表中所描述的模型描述。进而,需要确定出没有正确反映出源码所表示的应用程序的动作之处。另外,对于成为检查对象的源码以外的部分,考虑到要适当进行模型检查,需要给出对该部分进行补足的模型描述。这些既便使用者是模型检查的专家,也需要非常困难且复杂的工作。
发明内容
本发明的目的在于,提供一种更正确地对成为检查对象的源码所表示的动作进行检查的源码检查器以及源码检查方法、用来执行该方法的方法执行程序、以及存储该程序的存储介质。
本发明包括:路径抽出步骤,通过模拟执行由预先输入的计算机用程序的源码所描述的程序,来抽出实际执行的命令串;以及,检查内容决定步骤,根据上述路径抽出步骤所抽出的命令串,决定上述源码的检查内容。通过本发明,能够更加正确地检查源码所表示的动作。
附图说明
图1为本发明的第1实施例中的包含源码检查器的源码检查系统的方框图。
图2为表示该实施例中的成为检验对象的源码的例子的图。
图3为表示根据图2中所示的源码所构成的控制流向图的图。
图4为表示将图2中所示的源码改变为路径抽出用所得到的源码的图。
图5为表示根据从图2中所示的源码中抽出路径得到的结果所构成的模型图。
图6为表示根据图5的模型图所生成的模型描述的图。
图7为表示本发明的第2实施例,将图2中所示的源代码改变为使用CBMC的路径抽出用所得到的源代码的图。
图8为本发明的第3实施例中的包含源码检查器的源码检查系统的方框图。
图9为本发明的第4实施例中的源码检查器的方框图。
图10为表示该实施例中的检验程序之一例的图。
图11为表示该实施例中的检验程序之一部分的第1图。
图12为表示该实施例中的检验程序之一部分的第2图。
图13为表示该实施例中的检验程序之一部分的第3图。
图14为表示以往的源码检查器之构成的方框图。
图中:100、600-源码检查系统,102-源码输入部,103-路径抽出部,104-模型图构成部,105-模型描述生成部,106-模型检查器执行部,107-规格输入部,120、122-检查内容决定部,130、131、700-源码检查器,140-控制部,150-存储介质,601-规格自动生成部,701-检验程序生成部,702-检验程序执行部。
具体实施方式
本发明的源码检查方法,具有路径抽出步骤,和检查内容决定步骤。路径抽出步骤,通过模拟执行预先输入的计算机用程序的源码所描述的应用程序,来抽出实际执行的命令串。检查内容决定步骤,根据路径抽出步骤所抽出的命令串,决定源码的检查内容。
通过这样,能够进行源码的检查,而且不会脱离成为检查对象的源码所表示的程序的动作。
另外,本发明的源码检查方法中,检查内容决定步骤,置于通过模型描述、与表示检查源码的性质的规格进行源码的模型检查的模型检查执行步骤之前,具有模型图(model graph)构成步骤、和模型描述生成步骤。模型图构成步骤,根据由路径抽出步骤所抽出的命令串构成模型图。模型描述生成步骤,根据模型图构成步骤所构成的模型图生成模型描述。可以通过模型描述生成步骤所生成的模型描述与预先输入的规格,在模型检查执行步骤中进行源码的检查。
通过该方法,使用模型检查方法,还不会生成脱离了成为检查对象的源码所表示的程序的动作的模型描述。因此,不会进行与脱离了成为检查对象的源码所表示的程序的动作的那一部分相对应的模型描述所引起的、错误的异常检测。也即,本发明的方法中,不存在脱离源码动作的模型描述。因此,不会尽管原来的源码动作满足检查对象的规格制约,而报告出不符合规格的误检测结果。另外,通过在进行模型检查之前事先抽出模型图,还能够留出应用对模型图进行压缩等的效率化手段的余地。
另外,本发明的源码检查方法中,路径抽出步骤,可以通过将源码变换成逻辑式并进行逻辑式的充分可能性判断,来抽出源码的可执行命令串。
通过该方法,通过进一步将成为检查对象的源码所给出的程序模拟地、也即对条件语句是否成立进行充分可能性判断,能够抽出程序的动作。这样,由于不需要对成为检验对象的源码进行编译、链接使其能够执行,因此能够进行例如无法链接的、在一系列的源码群中只以一部分源码的集合为对象的模型检查。
另外,本发明的源码检查方法,还可以具有自动生成规格的规格自动生成步骤,预先输入的规格,是规格自动生成步骤所生成的规格。
通过该方法,还不需要手动输入规格。也即,不需要烦杂且有时需要专业知识的规格的手动输入。
另外,本发明的源码检查方法中,可以让规格自动生成步骤,自动生成表示源码所描述的程序不会非法使用存储器的规格。
通过该方法,还不需要关于存储器的非法使用的知识,就能够进行与存储器的非法使用相关的模型检查。另外,不需要规格的手动输入,就能够进行关于程序对存储器的非法使用的检查。
再有,本发明的源码检查方法中,检查内容决定步骤可以具有检验程序生成步骤与检验程序执行步骤。检验程序生成步骤,生成用来对所抽出的命令串是否非法使用存储器进行单独判断的检验程序。检验程序执行步骤,执行所生成的检验程序。
通过这样,不需要执行模型检查执行步骤就能够进行源码的检查。也即由于不需要使用外部的模型检查方法,因此提高了可移动性与便利性。
本发明的方法执行程序,是一种用来在计算机中执行上述源码检查方法的程序。另外,本发明的存储介质,是存储上述方法执行程序的存储介质。
下面参照附图对本发明的实施例进行说明。
(第1实施例)
对照图1,对含有本发明的第1实施例的源码检查器的源码检查系统进行说明。图1为表示含有第1实施例中的源码检查器的源码检查系统的方框图。
第1实施例的源码检查系统100,是一种计算机系统,具有:源码检查器130、模型检查器106、以及规格输入部107。源码检查器130具有:源码输入部102、路径抽出部103、检查内容决定部120、控制部140、以及存储介质150。检查内容决定部120具有:模型图构成部104与模型描述生成部105。
源码输入部102,输入作为计算机用程序的源码101。路径抽出部103,抽出通过源码输入部102所接收的源码101的可被执行的命令串,并将所抽出的命令串发送给模型图构成部104。模型图构成部104将路径抽出部103所抽出的路径的信息作为图(graph)归纳起来,并将所归纳的图发送给模型描述生成部105。
模型描述生成部105,根据模型图构成部104中所构成的图生成模型描述,并将所生成的模型描述,发送给位于源码检查器130的外部的模型检查器执行部106。
控制部140,通过存储介质150中所存储的用来执行源码检查方法的方法执行程序,控制源码检查器130的各部。存储介质150由硬盘存储装置或半导体存储器、CD-ROM等构成。
模型检查器执行部106,使用从规格输入部107所接收到的记载有表示要检查的源码101之性质的制约的要检查的规格108、和模型描述生成部105中所生成的模型描述,执行模型检查,并输出检查结果109。上述控制部140还可以通过存储介质150中所存储的程序,对模型检查器执行部106进行控制。源码检查器的各个部,可以为使用随机逻辑的硬件结构,或由使计算机执行的软件构成,或者为它们混合。
接下来,对路径抽出部103进行详细说明。
路径抽出部103中,首先根据成为检查对象的源码101,构成其控制流向图(flow graph)。
控制流向图用来表现源码101的控制构造,是由处理模块节点、判断节点、合流节点这3个基本要素构成的图。处理模块节点,是与没有基于判断的分支的连续源码命令串相对应的图的顶点。判断节点是表示通过某个式子的真伪值所执行的命令串发生分支的点的图的顶点。合流节点是表示多个命令串合流的点的图的顶点。
图2中示出了本实施例中的源码之一例,图3中示出了根据图2的源码所构成的控制流向图之一例。
图3由处理模块节点301、303、305、306、判断节点302、合流节点304、以及连接各个节点的有向边构成。
路径抽出部103生成这样的控制流向图。
接下来,路径抽出部103,进行可根据所构成的控制流向图执行的命令串的抽出,也即进行执行路径抽出。这里示出了基于C语言的执行路径抽出例,但并不仅限于C语言,在C++或Java(注册商标)等语言中也能够通过同样的方法抽出命令串。
路径抽出部103改变成为检查对象的源码101,对所改变的源码进行编译并执行,通过这样进行执行路径抽出。路径抽出部103所进行的源码101的改变,用来抽出要执行的命令串,但不会给原来的源码101所表示的动作带来影响。也即,路径抽出部103模拟执行源码101,并抽出所执行的命令串。
下面使用图3与图4,对路径抽出部103的处理进行具体说明。图4为表示为了执行路径抽出而改变了图2中所示的源码的例子的图。
401所示的语句,是对flag变量进行定义并初始化的语句。402所示的语句是表示开始点的标号与变量定义中含有的初始化语句。403所示的语句是改变具有不定值的变量的函数。404所示的语句是给对应分支命令的flag变量代入1的语句。405所示的语句,是判断flag变量是否都为1的函数。
首先,路径抽出部103,在全局变量定义区域中定义与控制流向图中含有的判断节点的数目相同数目个flag变量。图4的例子中,路径抽出部103在从int main(){起开始,并以对应该{的最后的}结束的区域外,也即401所位于的场所,或最后的}以下的区域中,定义全局变量定义区域。
设flag变量,是分别具有不同的名称,初始化为0,并且具有存储0或1这两个值的区域的全局变量。例如,在控制流向图中含有的判断节点有3个的情况下,路径抽出部103在要改变的源代码的开头的全局变量定义区域中,描述“int flag1=0,flag2=0,flag3=0;”。
接下来,路径抽出部103,对控制流向图中含有的各个判断节点302,选择1个分支,并在与分支目的地的处理方框节点303相对应的命令串(free(p);)的开头,插入给flag变量赋值1的命令句404。
路径抽出部103,不使用曾使用过的flag变量,重复给flag变量赋值1的操作。另外,路径抽出部103,在对应各个判断节点的分支命令句的跟前,插入为了执行路线探索而改变成为不定值的变量的函数403。
不定值的变量,表示因来自源码描述范围外的输入、例如程序使用者的输入而改变的值,或由随机数所决定的值,还有具有由该值决定的值的变量。通过数据流解析,能够判断各个变量是否具有不定值。
所插入的函数,将对应的分支命令句中含有的成为不定值的变量作为自变量,并改变各个变量的值。另外,该函数每次被调用时,将不同值的组合赋值给自变量给出的各个变量。
接下来,路径抽出部103,在将源码101中的除了变量定义语句之外最早执行的命令所对应的命令句(在位于图4中的402所示的部分之后的p=malloc(sizeof(char)))之前,插入表示开始点的标签(402中所示的第一行,init_point),在插入了该标签的场所之后,添加变量定义语句中含有的变量的初始化命令(402中所示的部分的第2行,p=0;)。
接下来,路径抽出部103在源码中所含有的表示程序结束的语句之前(405所示的部分之后,return 0;),判断分别通过上述顺序所插入的flag变量全体是否都被赋值为1,在都被赋值为1的情况下结束,此外的情况下,插入返回由上述顺序所插入的标签处的函数(405中所示的check_point(flag 1))。
这里,在结束的情况下,路径抽出部103将执行过的命令串的信息传送给模型图构成部104。
这样,路径抽出部103在图2中所示的源码中插入通过401~405所示的语句。
通过这样,路径抽出部103通过对所有的判断节点的组合重复代入flag变量的操作,能够将可执行的命令串全部抽出。
另外,在源码的规模较大,且组合的数目庞大的情况下,最好通过能够使用的计算机资源适当中止上述抽出,进入以下顺序。
接下来,对检查内部决定部120中含有的模型图构成部104进行详细说明。
通过路径抽出部103的执行,所执行的命令串的集合传送给模型图构成部104。模型图构成部104根据该集合,构成模型图。这里所构成的模型图由顶点与边的集合构成,各个顶点中分别标注有对应的命令句作为标签,各个边是起点与终点分别与图中的顶点逐一对应的有向边。
下面,对模型图构成部104构成模型图的方法进行说明。
首先,模型图构成部104,从命令串的集合中读出1个命令串。接下来,模型图构成部104,生成标注有表示与该列命令的出现顺序相对应的命令语句之标签的顶点,生成将前一个生成的顶点与新生成的顶点分别作为起点、终点的边。通过该操作,构成与1个所选择的命令串相对应的一列模型图。这里,将首先所生成的顶点称作开始顶点。
接下来,模型图构成部104,(1)从命令串的集合中取出1个命令串,与上述同样构成一列模型图。
接下来,模型图构成部104,(2)与已构成的模型图从各自的开始顶点起进行比较,在出现标注有对应不同命令句的标签的顶点的情况下,让图进行分支,给原来的模型图中添加与剩下的命令串相对应的新的模型图。
接下来,模型图构成部104,(3)返回(1)直到没有命令串的集合要素为止,并将这一顺序从(1)起顺次执行。通过这样能够构成模型图。另外,模型图构成部104,将所构成的模型图传送给模型描述生成部105。图5所示的图,是根据从图2中所示的源码中抽出路径得到的结果而构成的模型图。
这样,模型图构成部104如图5所示,构成带迁移条件的也即正确再现了源码所表示的动作的模型图。
接下来,对模型描述生成部105进行详细说明。这里,列举出根据从模型图构成部104传送的图5所示的模型图,生成基于模型检查器SPIN用模型描述语言Promela的模型描述(图6中所示)的例子。这里所生成的模型描述是字符串的列。图6为根据图5的模型图所生成的基于Promela的模型描述。
首先,模型描述生成部105,生成通过Promela所描述的模型的开始点。这里开始点的描述,是601所示的部分,为“proctype main(){”。
接下来,模型描述生成部105从模型图的开始点起顺次选择顶点,并执行以下操作。
首先,模型描述生成部105,(1)在接着所选择的顶点没有分支的情况下(图5中的500a~500i所示的部分),在标注给该顶点的标签为L时,如图6中的602a~602i所示,在模型描述中添加“L:skip;”。
接下来,模型描述生成部105,选择接下来的模型图中的顶点,执行(1)或以下的(2)。
(2)模型描述生成部105,在接着所选择的顶点有分支的情况下(通过图5中的501所示的部分),在设标注给该顶点的标签为L时,如图6中的603以后的部分所示,在模型描述中添加“L:if∷A∷B fi;”。
接下来,模型描述生成部105,选择各个分支目的地的顶点,分别执行(1)、(2),覆盖上述A、B。这种情况下,A为图6中604所示的部分,B为605所示的部分。
然后,模型描述生成部105重复以上操作,直到选择并执行了模型图的所有顶点。最后,将图6中606所示的“}”添加到模型描述中。
模型描述生成部105,将这里所得到的模型描述发送给模型检查器执行部106。
之后,模型检查器执行部106中,将从上述模型描述生成部获得的模型描述、与从规格输入部107所接收到的规格,输入给模型检查器,并输出模型检查的结果作为检查结果109。
如上所述,通过第1实施例,路径抽出部103通过模拟执行源码所描述的应用程序,来抽出实际执行的命令串。然后,能够根据检查内容决定部120中含有的模型图构成部104所抽出的命令串构成模型图,根据模型描述生成部105所构成的模型图生成模型描述,从而能够进行源码的检查。
这样,通过模拟执行源码,不会生成脱离了成为检查对象的源码所表示的程序的动作的模型描述。因此,不会产生与脱离了成为检查对象的源码所表示的程序的动作的那一部分相对应的模型描述所引起的、错误的异常检测。也即,“尽管原来的源码的动作满足检查对象的规格制约,但由于存在脱离了该动作的模型描述,从而不满足规格的性质的情况下所检测出的、不符合规格的这种误检测结果”,不会再报告出来。
另外,通过在进行模型检查之前抽出模型图,还能够给使用对模型图进行压缩等的效率化手段留出余地。
另外,通过第1实施例,还可以去掉以往必需的源码变换表,因此,检查源码的人不需要修正源码变换表。
(第2实施例)
对本发明的第2实施例进行说明。第2实施例中,作为路径抽出部103模拟执行程序的方法,是通过将源码变换成逻辑式,并进行该逻辑式的充分可能性判断,来抽出实际执行的命令串。逻辑式的充分可能性判断,是指对是否存在使得所给出的逻辑式整体为1、也即为真的变量值的分配进行判断。
由于含有第2实施例中的源码检查器的源码检查系统的构成与第1实施例相同,因此使用图1对第1实施例中的源码检查器进行说明。
第2实施例中的源码检查器130,在路径抽出部103中,将源码101变换成逻辑式,并进行该逻辑式的充分可能性判断,通过这样抽出源码所执行的命令串。
这里,作为路径抽出部103将源码101变换成逻辑式,并进行充分可能性判断的工具,使用模型检查器CBMC(Bounded Model Checker forANSI-C programs)。CBMC,是输入C语言的源码,将其变换成逻辑式,并进行该逻辑式的充分可能性判断,通过这样来检查所输入的源码的诸性质的模型检查器。路径抽出部103为了抽出路径,使用对总是满足assert语句这一性质进行检查的功能。
使用图7对路径抽出部103的处理进行具体说明。图7为表示本发明的第2实施例中,为了执行路径抽出而改变图2中所示的源码的例子的图。
图7中所示的源码,给图2所示的源码插入了flag变量504、502以及assert语句503。
路径抽出部103根据成为检查对象的源码101,构成其控制流向图。接下来,路径抽出部103通过改变所输入的源码,来生成用来输入给CBMC的C语言源码。
首先,路径抽出部103与第1实施例一样,进行flag变量504之定义的插入、赋值语句503的插入。
接下来,路径抽出部103在源码中所含有的表示程序结束的语句之前,插入表示不给所有分别通过上述顺序插入的flag变量赋值1的声明语句,也即assert语句503。例如,在设flag变量为flag1、flag2、flag3这3个时,所插入的assert语句是“assert(flag1!=1||flag1!=1||flag1!=1)”。
接下来,路径抽出部103,将通过上述顺序所改变并得到的源码输入给CBMC。
此时,如果CBMC指出有违反assert语句的声明的情况,则表示有所插入的flag变量都变为1的情况。也即,表示存在全部通过对flag变量赋值1的场所的可执行路径。
因此,在基于CBMC的assert语句的违反的指出,是输入给CBMC,且所执行的结果中含有字符串“Failed assertion:”的情况下,路径抽出部103通过检索所输出的字符串,能够判断违反了assert语句。
路径抽出部103在判断为是可执行路径的情况下,将该路径所对应的命令串的信息,发送给检查内容决定部120中含有的模型图构成部104。
路径抽出部103变更给flag变量502赋值1的场所的同时,重复以上顺序,通过这样,在模型图构成部104中收集可执行的命令串的信息。
这样,收集了足够的信息之后,通过同样进行第1实施例中所列举出的模型图构成部104的执行及其之后的执行,能够进行源码的检查。
如上所述,通过本实施例,通过在路径抽出部103中将源码101变换成逻辑式,并进行逻辑式的充分可能性判断,能够抽出源码101的可被执行的命令串。通过这样,不需要对成为检查对象的源码101所给出的程序实际进行执行,就能够抽出程序的动作。这样,由于不需要对作为检查对象的源码101实际进行编译、链接来使其可以执行,因此能够进行无法进行例如链接的、在一系列的源码群中只以一部分源码的集合为对象的模型检查。
(第3实施例)
本发明的第3实施例,具有根据源码的信息自动生成用来输入给模型检查器执行部的规格的机构。
下面,对第3实施例的源码检查器进行说明。图8为含有本发明的第3实施例中的源码检查器的源码检查系统的方框图。另外,给与图1构成相同的部分标注同一符号,省略其说明。
本实施例中的源码检查系统600的特征在于,具有根据源码输入部102所接收到的源码101的信息,自动生成输入给模型检查器执行部106的规格的规格自动生成部601。源码检查器131,具有:源码输入部102、路径抽出部103、检查内容决定部120、规格自动生成部601、控制部140、以及存储介质150。
接下来,对规格自动生成部601的规格的自动生成法进行说明。
首先,规格自动生成部601读取由源码输入部102所接收到的源码101,并将一定要成对使用的命令句全部进行检索。
例如,在处理通过C语言所描述的源码的情况下,对应fopen的fclose、对应open的close、与malloc或calloc等将存储器在堆栈区中确保的语句相对应的含有free的命令句等,均分别是一定要成对使用的命令句。
接下来,规格自动生成部601,对作为用上述顺序所检索出的结果检测出的命令句之对A、B,在规格中添加以下式子“[](A-><>B)”。
上式是表示在出现了A的情况下,B一定会出现的这一制约的式子。
例如,在存在fp=fopen(fname,“w”)与fclose(fp)这一成对的命令句的情况下,规格自动生成部601在规格中添加下面的式子:“[](“fp=fopen(fname,“w”)”-><>“fclose(fp)”)”。
规格自动生成部601,对所检测出的所有语句重复以上处理。
另外,规格自动生成部601,在已经存在式子作为规格,并给其增加了新式子的情况下,使用运算符“&&”连接起来。运算符“&&”表示逻辑和,在新增加制约的情况下使用。
如上所述,通过第3实施例,与第1实施例不同,用户不需要从规格输入部107输入规格108,能够自动生成例如表示源码所描述的应用程序不会非法使用存储器的规格。也即,不需要烦杂且有时需要专业知识的规格108之输入。
(第4实施例)
本发明的第4实施例,对所抽出的可被执行的命令串是否会非法使用存储器进行判断。
下面,使用图9对本实施例中的源码检查器进行说明。图9为表示本实施例中的源码检查器之构成的方框图。另外,给与图1的构成相同的标注同一符号,省略其说明。
第4实施例中的源码检查器700,具有源码输入部102、路径抽出部103、检查内容决定部122、控制部140、以及存储介质150。检查内容决定部122,具有检验程序生成部701与检验程序执行部702。检验程序生成部701,接收由路径抽出部103所抽出的可被执行的命令串,并生成用来单独对该命令串是否会非法使用了存储器进行判断的检验程序。检验程序执行部702,执行检验程序生成部701中所生成的检验程序。
接下来,对检验程序生成部701中的检验程序生成方法进行详细说明。检验程序生成部701所生成的检验程序,是根据路径抽出部103所抽出的可被执行的命令串所生成的字符串。
使用图10对检验程序生成部701生成该字符串的顺序进行说明。图10为表示本实施例中,根据图5中所示的图的左侧的分支,通过检验程序生成部701中的处理所生成的程序之一例的图。
首先,检验程序生成部701,将1001所示的部分“int main(){(1001)}”作为开始字符串。检验程序生成部701,通过给该开始字符串1001顺次添加字符串,来构成检验程序的字符串。接下来,检验程序生成部701,将给路径抽出部703所生成的命令串所对应的命令句添加分号得到的字符串,顺次添加给上述开始字符串。
此时,在如图5的500c所示,存在malloc函数,且如图5的500d、500e所示,存在wz_malloc、free函数的情况下,检验程序生成部701,如图10中的1002所示,将wz_malloc、free函数替换成wz_free。
另外,在命令串中含有的式子中有指针变量的情况下,检验程序生成部701,对各个该指针变量,将以该指针变量为参数的wz_check函数的调用语句插入到式子之前。
另外,在命令串的最后没有return语句的情况下,检验程序生成部701添加“return 0;”,另外在有return的情况下,如图10中的1003所示,添加“}”。
最后,检验程序生成部701添加如图11~13所示的字符串。
如上所述,检验程序生成部701生成检验程序。并且,检验程序生成部701,将所生成的检验程序发送给检验程序执行部702。
检验程序执行部702中,对从检验程序生成部701所接收到的检验程序进行编译、执行。并将所执行的结果作为检查结果109显示出来。这里,如果显示出“Memory leak was detected.”,则意味着在执行由路径抽出部103所抽出的命令串的情况下,检测出了存储器发生泄漏。
另外,如果显示出“Used non-active object.”,则意味着在执行由路径抽出部103所抽出的命令串的情况下,检测出了要使用空指针。
如上所述,通过本实施例,由于检验程序生成部701自动生成表示程序不会非法使用存储器的规格,因此不需要存储器的非法使用的相关知识,就能够进行关于存储器的非法使用的源码检查。另外,不需要第1实施例中的规格输入部107,就能够进行关于程序是否非法使用存储器的检查。
另外,通过本实施例,通过输出单独进行源码检查的程序,可以不需要第1实施例中的模型检查器执行部106。也即不需要外部的模型检查器,提高了可移动性与便利性。
如上所述,通过本发明,能够进行源码的检查,而不会脱离源码所表示的程序的动作。不会脱离成为检查对象的源码所表示的动作,而能够更加正确地实现源码的检查。另外,本发明还能够应用于软件的适当性检查等领域,应用可能性非常大。
Claims (14)
1.一种源码检查方法,其特征在于,具有:
路径抽出步骤,通过模拟执行由预先输入的计算机用程序的源码所描述的程序,来抽出实际执行的命令串;以及,
检查内容决定步骤,根据上述路径抽出步骤所抽出的命令串,决定上述源码的检查内容。
2.如权利要求1所述的源码检查方法,其特征在于:
上述检查内容决定步骤,置于根据模型描述和表示检查上述源码的性质的规格来进行上述源码的模型检查的模型检查执行步骤之前,
具有:根据上述路径抽出步骤所抽出的命令串构成模型图的模型图构成步骤;以及,
根据上述模型图构成步骤所构成的模型图生成模型描述的模型描述生成步骤,
根据上述模型描述生成部所生成的模型描述和预先输入的规格,在上述模型检查执行步骤中进行上述源码的检查。
3.如权利要求1所述的源码检查方法,其特征在于:
上述路径抽出步骤,通过将上述源码变换成逻辑式并进行上述逻辑式的充分可能性判断,来抽出上述实际执行的命令串。
4.如权利要求2所述的源码检查方法,其特征在于:
还具有自动生成上述规格的规格自动生成步骤,上述预先输入的规格,是上述规格自动生成步骤所生成的规格。
5.如权利要求4所述的源码检查方法,其特征在于:
上述规格自动生成步骤,自动生成表示由上述源码所描述的程序不会非法使用存储器这一意思的规格。
6.如权利要求1所述的源码检查方法,其特征在于:
上述检查内容决定步骤,具有:检验程序生成步骤,其生成用来对上述路径抽出步骤所抽出的命令串是否会非法使用存储器进行检验的检验程序;以及检验程序执行步骤,执行上述检验程序生成步骤所生成的检验程序。
7.一种用来在计算机中执行源码检查方法的方法执行程序,其特征在于,上述方法具有:
路径抽出步骤,通过模拟执行由预先输入的计算机用程序的源码所描述的程序,来抽出实际执行的命令串;以及,
检查内容决定步骤,根据上述路径抽出步骤所抽出的命令串,决定上述源码的检查内容。
8.一种存储用来在计算机中执行源码检查方法的方法执行程序的存储介质,其特征在于,上述方法具有:
路径抽出步骤,通过模拟执行由预先输入的计算机用程序的源码所描述的程序,来抽出实际执行的命令串;以及,
检查内容决定步骤,根据上述路径抽出步骤所抽出的命令串,决定上述源码的检查内容。
9.一种源码检查器,其特征在于,具有:
路径抽出部,通过模拟执行由预先输入的计算机用程序的源码所描述的程序,来抽出实际执行的命令串;以及,
检查内容决定部,根据上述路径抽出步骤所抽出的命令串,决定上述源码的检查内容。
10.如权利要求9所述的源码检查器,其特征在于:
上述检查内容决定部,置于根据模型描述和表示检查上述源码的性质的规格来进行上述源码的模型检查的模型检查执行部之前,
具有:根据上述路径抽出部所抽出的命令串构成模型图的模型图构成部;以及,
根据上述模型图构成部所构成的模型图生成模型描述的模型描述生成部,
根据上述模型描述生成部所生成的模型描述和预先输入的规格,在上述模型检查执行部中进行上述源码的检查。
11.如权利要求9所述的源码检查器,其特征在于:
上述路径抽出部,通过将上述源码变换成逻辑式并进行上述逻辑式的充分可能性判断,来抽出上述实际执行的命令串。
12.如权利要求10所述的源码检查器,其特征在于:
还具有自动生成上述规格的规格自动生成部,上述预先输入的规格,是上述规格自动生成部所生成的规格。
13.如权利要求12所述的源码检查器,其特征在于:
上述规格自动生成部,自动生成表示由上述源码所描述的程序不会非法使用存储器这一意思的规格。
14.如权利要求9所述的源码检查器,其特征在于:
上述检查内容决定部,具有:检验程序生成部,其生成用来对上述路径抽出部所抽出的命令串是否会非法使用存储器进行检验的检验程序;以及检验程序执行部,执行上述检验程序生成部所生成的检验程序。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004291987 | 2004-10-04 | ||
JP291987/2004 | 2004-10-04 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101036127A true CN101036127A (zh) | 2007-09-12 |
Family
ID=36142479
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA200580033901XA Pending CN101036127A (zh) | 2004-10-04 | 2005-08-29 | 源码检查器、方法、程序以及存储介质 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8020153B2 (zh) |
JP (1) | JPWO2006038394A1 (zh) |
CN (1) | CN101036127A (zh) |
WO (1) | WO2006038394A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106980506A (zh) * | 2017-03-31 | 2017-07-25 | 山东超越数控电子有限公司 | 一种php源码保护方法 |
CN109271507A (zh) * | 2018-09-21 | 2019-01-25 | 长沙学院 | 处理子串信息的方法、计算机数据管理系统、舆情分析系统、社会网络分析系统 |
Families Citing this family (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8713513B2 (en) * | 2006-12-13 | 2014-04-29 | Infosys Limited | Evaluating programmer efficiency in maintaining software systems |
JP4679540B2 (ja) * | 2007-03-16 | 2011-04-27 | 株式会社日立情報システムズ | プログラム検証方法とシステムおよびプログラム |
JP2008257390A (ja) * | 2007-04-03 | 2008-10-23 | Toshiba Information Systems (Japan) Corp | プログラム検査装置及びプログラム検査用プログラム |
JP4924188B2 (ja) * | 2007-04-27 | 2012-04-25 | トヨタ自動車株式会社 | クロス検証装置 |
US8997054B2 (en) * | 2007-11-30 | 2015-03-31 | Red Hat, Inc. | Software application certification service |
US8397216B2 (en) * | 2008-02-29 | 2013-03-12 | International Business Machines Corporation | Compiler for a declarative event-driven programming model |
US8627299B2 (en) | 2008-02-29 | 2014-01-07 | International Business Machines Corporation | Virtual machine and programming language for event processing |
US8365149B2 (en) * | 2008-02-29 | 2013-01-29 | International Business Machines Corporation | Debugger for a declarative event-driven programming model |
JP2009211503A (ja) * | 2008-03-05 | 2009-09-17 | Nec Corp | ソースコード検証装置、及びソースコード検証方法 |
US8402440B2 (en) * | 2008-07-07 | 2013-03-19 | Nec Laboratories America, Inc. | Program verification through symbolic enumeration of control path programs |
JP5396930B2 (ja) * | 2009-03-10 | 2014-01-22 | 日本電気株式会社 | 検証対象関数自動選択装置、検証対象関数自動選択方法、及び検証対象関数自動選択用プログラム |
US8412668B2 (en) * | 2009-10-14 | 2013-04-02 | GM Global Technology Operations LLC | Offline formal verification of executable models |
US20110302559A1 (en) * | 2010-06-04 | 2011-12-08 | Mayur Naik | Method and apparatus for leveraging path-program analysis for effective static whole-program analysis |
JP5463226B2 (ja) * | 2010-07-15 | 2014-04-09 | 株式会社日立製作所 | ソースコード検査方法およびソースコード検査装置 |
JP2012059026A (ja) * | 2010-09-09 | 2012-03-22 | Hitachi Ltd | ソースコード変換方法およびソースコード変換プログラム |
CN103140838B (zh) * | 2010-10-27 | 2015-06-17 | 株式会社日立制作所 | 源代码转换方法 |
JP5643971B2 (ja) * | 2011-12-01 | 2014-12-24 | 株式会社日立製作所 | ソースコード変換方法及びソースコード変換プログラム |
US8819772B2 (en) * | 2012-06-25 | 2014-08-26 | Appthority, Inc. | In-line filtering of insecure or unwanted mobile device software components or communications |
US10133557B1 (en) * | 2013-01-11 | 2018-11-20 | Mentor Graphics Corporation | Modifying code to reduce redundant or unnecessary power usage |
US8990777B2 (en) | 2013-05-21 | 2015-03-24 | Concurix Corporation | Interactive graph for navigating and monitoring execution of application code |
CN105229617A (zh) * | 2013-05-21 | 2016-01-06 | 肯赛里克斯公司 | 用于导航应用代码的图表 |
US9734040B2 (en) | 2013-05-21 | 2017-08-15 | Microsoft Technology Licensing, Llc | Animated highlights in a graph representing an application |
US9280841B2 (en) | 2013-07-24 | 2016-03-08 | Microsoft Technology Licensing, Llc | Event chain visualization of performance data |
US9292415B2 (en) | 2013-09-04 | 2016-03-22 | Microsoft Technology Licensing, Llc | Module specific tracing in a shared module environment |
EP3069267A4 (en) | 2013-11-13 | 2017-09-27 | Microsoft Technology Licensing, LLC | Software component recommendation based on multiple trace runs |
EP3563232A1 (en) | 2017-02-01 | 2019-11-06 | Siemens Industry Software NV | Methods and systems for verifying a software program |
EP3610395A4 (en) * | 2017-05-31 | 2020-09-30 | Shiftleft Inc. | SYSTEMS AND PROCEDURES FOR PROFILING APPLICATION SAFETY |
US10956574B2 (en) | 2017-10-07 | 2021-03-23 | Shiftleft Inc. | System and method for securing applications through an application-aware runtime agent |
EP3493051A1 (en) * | 2017-11-30 | 2019-06-05 | The MathWorks, Inc. | System and methods for evaluating compliance of implementation code with a software architecture specification |
US11074362B2 (en) | 2017-12-04 | 2021-07-27 | ShiftLeft, Inc. | System and method for code-based protection of sensitive data |
DE102018003142A1 (de) | 2017-12-13 | 2019-06-13 | The Mathworks, Inc. | Automatische Einstellung von Multitasking-Konfigurationen für ein Codeprüfsystem |
US11514172B2 (en) | 2018-11-15 | 2022-11-29 | Grabango Co. | System and method for information flow analysis of application code |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS6415836A (en) | 1987-07-10 | 1989-01-19 | Mitsubishi Electric Corp | Detection system for comprehensiveness of software test |
JPH01237737A (ja) | 1988-03-17 | 1989-09-22 | Fujitsu Ltd | フラグ識別支援方式 |
US5781753A (en) * | 1989-02-24 | 1998-07-14 | Advanced Micro Devices, Inc. | Semi-autonomous RISC pipelines for overlapped execution of RISC-like instructions within the multiple superscalar execution units of a processor having distributed pipeline control for speculative and out-of-order execution of complex instructions |
JPH04289928A (ja) | 1991-03-19 | 1992-10-14 | Hitachi Ltd | マイクロプログラム検証方式 |
US5854929A (en) * | 1996-03-08 | 1998-12-29 | Interuniversitair Micro-Elektronica Centrum (Imec Vzw) | Method of generating code for programmable processors, code generator and application thereof |
EP1018684A2 (en) | 1998-12-15 | 2000-07-12 | Lucent Technologies Inc. | Method and apparatus for developing event driven software |
JP4098448B2 (ja) | 1999-10-07 | 2008-06-11 | 富士通株式会社 | プログラム検証方法及び装置 |
US7490292B2 (en) * | 1999-12-17 | 2009-02-10 | International Business Machines Corporation | Web-based instruction |
US7024661B2 (en) * | 2000-01-07 | 2006-04-04 | Hewlett-Packard Development Company, L.P. | System and method for verifying computer program correctness and providing recoverable execution trace information |
US20010047397A1 (en) * | 2000-02-18 | 2001-11-29 | Jameson David H. | Method and system for using pervasive device to access webpages |
US20010037492A1 (en) | 2000-03-16 | 2001-11-01 | Holzmann Gerard J. | Method and apparatus for automatically extracting verification models |
US20020100022A1 (en) | 2000-05-08 | 2002-07-25 | Holzmann Gerard J. | Method and apparatus for automatic verification of properties of a concurrent software system |
US7146605B2 (en) * | 2001-01-15 | 2006-12-05 | International Business Machines Corporation | Automatic abstraction of software source |
JP2002288004A (ja) | 2001-03-27 | 2002-10-04 | Canon Inc | プログラムソース処理装置、プログラムソース処理方法、およびプログラムソース処理プログラム |
US7421680B2 (en) * | 2003-09-22 | 2008-09-02 | Microsoft Corporation | Persisted specifications of method pre-and post-conditions for static checking |
US20050223361A1 (en) * | 2004-04-01 | 2005-10-06 | Belbute John L | Software testing based on changes in execution paths |
GB0407657D0 (en) * | 2004-04-03 | 2004-05-05 | Ibm | Symbolic model checking of software |
-
2005
- 2005-08-29 WO PCT/JP2005/015625 patent/WO2006038394A1/ja active Application Filing
- 2005-08-29 JP JP2006539189A patent/JPWO2006038394A1/ja active Pending
- 2005-08-29 CN CNA200580033901XA patent/CN101036127A/zh active Pending
- 2005-08-29 US US11/575,824 patent/US8020153B2/en not_active Expired - Fee Related
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106980506A (zh) * | 2017-03-31 | 2017-07-25 | 山东超越数控电子有限公司 | 一种php源码保护方法 |
CN109271507A (zh) * | 2018-09-21 | 2019-01-25 | 长沙学院 | 处理子串信息的方法、计算机数据管理系统、舆情分析系统、社会网络分析系统 |
CN109271507B (zh) * | 2018-09-21 | 2022-02-08 | 长沙学院 | 处理子串信息的方法、计算机数据管理系统、舆情分析系统、社会网络分析系统 |
Also Published As
Publication number | Publication date |
---|---|
WO2006038394A1 (ja) | 2006-04-13 |
US8020153B2 (en) | 2011-09-13 |
US20080256518A1 (en) | 2008-10-16 |
JPWO2006038394A1 (ja) | 2008-05-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101036127A (zh) | 源码检查器、方法、程序以及存储介质 | |
US11797298B2 (en) | Automating identification of code snippets for library suggestion models | |
US11494181B2 (en) | Automating generation of library suggestion engine models | |
US11875148B2 (en) | Library model addition | |
Harman et al. | Search-based software engineering: Trends, techniques and applications | |
US20190079853A1 (en) | Automating Identification of Test Cases for Library Suggestion Models | |
US8464208B2 (en) | Capturing and utilizing specific module dependency information | |
CN109033843B (zh) | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 | |
CN1924908A (zh) | 规则遵守状况检测方法以及相关检测系统 | |
CN1928816A (zh) | 嵌入式系统软件的模型驱动与构件化开发方法 | |
CN1728094A (zh) | 智能ui记录和重放结构 | |
CN1752934A (zh) | 编译器、编译方法以及编译程序 | |
CN1313926C (zh) | 模板编译方法 | |
Popoola et al. | EMG: A domain-specific transformation language for synthetic model generation | |
CN1900910A (zh) | 二进制翻译中经由跳转表的多目标分支语句的识别方法 | |
CN1567223A (zh) | 程序生成装置、方法及程序 | |
JP2009169864A (ja) | コンパイル方法およびコンパイルプログラム | |
CN1928814A (zh) | 基于组织实体能力的软件过程建模方法和系统 | |
Condori-Fernandez et al. | Towards a functional requirements prioritization with early mutation testing | |
CN115098355A (zh) | 基于历史数据驱动的jvm测试程序生成方法 | |
Bhatia et al. | Unit test generation using generative ai: A comparative performance analysis of autogeneration tools | |
Correia et al. | Architecture migration driven by code categorization | |
US20240126543A1 (en) | Library Model Addition | |
Daka | Improving readability in automatic unit test generation | |
CN1690978A (zh) | 程序执行控制方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |