CN103294596B - 一种基于程序不变量的合约式软件故障预警方法 - Google Patents
一种基于程序不变量的合约式软件故障预警方法 Download PDFInfo
- Publication number
- CN103294596B CN103294596B CN201310196434.9A CN201310196434A CN103294596B CN 103294596 B CN103294596 B CN 103294596B CN 201310196434 A CN201310196434 A CN 201310196434A CN 103294596 B CN103294596 B CN 103294596B
- Authority
- CN
- China
- Prior art keywords
- contract
- program
- invariant
- type
- early warning
- 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.)
- Active
Links
Landscapes
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种基于程序不变量的合约式软件故障预警方法,(1)使用Daikon工具为需要预警的程序生成程序不变量,根据测试用例集在Daikon工具上运行源程序产生不变量,输出程序不变量;(2)筛选不变量;(3)手动生成由布尔断言组成的数据合约;(4)将上述步骤2和3中两种方式得到的合约以规格化进行表示,并将规格化表示后的所述合约以注释的方式插桩到源程序的相应位置;(5)将步骤4中插桩到相应位置的注释转换为具有故障检测性质的代码,并插桩到源程序的相应目标位置;(6)运行经步骤1至5处理后的源程序,如果程序运行过程中违反了程序合约,则故障检测代码会自动把监测到的故障展示给用户。
Description
技术领域
本发明属于软件安全保障领域,具体涉及一种基于程序不变量的合约式软件故障预警方法。
背景技术
当今随着电子计算机技术的快速进步,计算机在工业、交通、金融、医疗、通信、航空航天等领域的日益广泛应用,采用故障检测来保证程序的正确性和可靠性已经变得非常关键。
不幸的是,随着软件规模变大,功能越来越强,故障检测也相当复杂。在大型的软件系统中,尽管经过认真的设计、开发和完备的测试,往往仍然存在许多故障。这些故障在正常运行的时候可能并没有发生错误或表现出错误的征兆,但在特定的条件下,会对系统产生破坏。如果不及时发现,随着时间的推移会发生严重的错误,甚至导致系统崩溃。
对于软件故障的检测分为静态预测和动态预警。传统的检测方法一般是前者,该方法不要求软件实际运行,而针对其编程风格是否规范,逻辑表达式是否正确,类型匹配保证一致等检查来发现错误,但是很多其他错误,用这种静态预测的方法很难检测到,因为它们包含程序的动态行为,动态测试通常用来发现这类错误,有些错误并不能在所在测试用例环境下表现出来,因此需要故障预警来在线检测,同时故障预警作为保障软件安全的重要分支,主要用于保障软件运行时的行为符合人们的预期,越来越受到研究者的关注。
现阶段,存在的软件故障预警技术有:通过检测读取未初始化内存错误、内存泄露和数组越界等来在线检测异常。对C程序增加在线检测功能,主要检测数组下标和指针越界等;对于java语言来说,由于java语言是类型安全语言以及具有垃圾回收机制,所以很多上述方法中的错误java程序可以自动避免,所以对于java语言来说现有的故障预警技术相对较少。
目前,代表性的软件故障预警技术有:
1.基于合约的程序验证方法
基于合约的程序验证是一种有效提高程序质量的技术,合约设计最早是由meyer针对程序设计语言Eiffel提出的,该技术是在程序执行的过程中动态检查是否违反程序合约,其中程序合约是具有特定形式的断言的格式,而这些断言是需要程序员去发现的,程序员在编写程序过程中发现程序遵循什么样的合约,并将其注释到java程序中,然后在java程序执行的过程中去验证是否符合这些断言规则,来发现程序异常。
该方法的优点在于给出了一种针对java程序的动态故障预警方法,把程序要符合的合约提前插入到程序中,在程序运行中是否符合这些合约作为判定程序是否存在故障的准则。缺点在于该方法中的合约需要程序员手动添加,不适合对大型系统进行验证,且没有提供系统化的合约来源。
2.基于程序不变量的验证方法
不变式的概念在许多领域中有着重要应用。程序理论中的不变式简单说,是指控制流每次到达程序的某个或某些特定位置时总成立的属性。程序不变式包括循环不变式、前置不变式、后置不变式和类不变式。程序不变量常用于程序设计、程序理解、故障定位以及程序验证等领域。
采用程序不变量进行验证时,首先基于一定的测试用例,对于程序修改前后的两个版本分别检测不变式;然后比较两个版本在相同程序点上的不变式,若所有的不变式均一致则认为对两个版本的程序验证成功。
该方法的优点在于将不变量用于程序验证,在程序版本发生变化后,验证是相对有效的;缺点在于该方法不适用于一般的无版本变更的系统。
3.动态不变量发现方法
动态不变量发现方法是通过程序实际的重复运行发现其属性的不变式性质,相对于静态不变量发现方法,动态不变量发现方法通常需要一个测试用例集,程序通过在测试用例集上反复运行来发现不变量,所以测试用例集的选取在一定程度上决定了不变量的准确性。
随着动态不变量技术的发展,出现一些不变量发现工具,其中Daikon工具具有很好的发现能力,Daikon是美国麻省理工学院计算机科学实验室的项目,利用程序执行来发现可能的不变式。它通过对源程序输入一组测试用例集,在测试用例集上运行程序,从而利用跟踪得来的结果来推导不变式。Daikon工具已被广泛应用于研究中,如在工具Eclate和Substra中都有使用。
该技术的优点在于已存在优秀的工具可以利用,该工具能产生比较好的不变式,可以在预警时作为程序合约使用,给合约式程序验证方法提供系统化合约来源;缺点在于生成的不变式并不完全适用于合约式程序验证,所以需要对通过工具产生的不变量进行筛选,以提高准确率。
发明内容
本发明的目的在于克服上述已有技术的不足,并结合已有技术的优点,提供一种基于程序不变量的合约式故障预警方法,把不变量有效应用于软件故障预警,对软件进行运行时监督,对故障在线预警,保障软件安全,降低软件失效率。
为了实现上述目的,本发明对基于合约的程序验证进行了改进,结合了动态不变量发现技术设计了软件故障预警流程,将程序不变量应用于故障预警中,最后将故障预警结果记录到预警日志中,该方法主要针对java程序进行预警,具体采用的技术方案如下:
一种基于程序不变量的合约式软件故障预警方法,其包括如下步骤:
(1)使用Daikon工具为需要预警的程序生成程序不变量,将需要预警的源程序和对应于源程序的测试用例集作为Daikon工具输入,根据测试用例集在Daikon工具上运行源程序产生不变量,输出程序不变量;
(2)筛选所述不变量,所述筛选方式包括自动筛选和用户手动筛选,并将筛选后的不变量作为合约的一种来源;
(3)手动生成由布尔断言组成的数据合约,所述数据合约是数据流的行为约束;
(4)将上述步骤2和3中两种方式得到的合约以规格化进行表示,并将规格化表示后的所述合约以注释的方式插桩到源程序的相应位置;
(5)将步骤4中插桩到相应位置的注释转换为具有故障检测性质的代码,并插桩到源程序的相应目标位置;
(6)上述步骤是对源程序进行预处理,经过预处理的程序同时包含程序本身源代码和添加的故障检测代码,对该程序进行编译运行,如果程序运行过程中违反了程序合约,则故障检测代码会自动把监测到的故障展示给用户,表示有故障产生,达到预警功能,最后将整个运行过程中预警到的故障记录到预警日志中。
在上述技术方案的基础上,所述步骤2中不变量的筛选过程包括手动筛选和自动筛选:
自动筛选方式:采用Daikon内置的不变式过滤工具进行过滤;
手动筛选方式:将程序中所有程序点的不变量显示给用户,用户可以手动选择是否采用该程序点的不变量。
在上述技术方案的基础上,所述规格化合约的类型包括方法前置条件和后置条件型合约、类不变量型合约、循环不变量型合约以及其他类型合约。
在上述技术方案的基础上,所述方法前置条件和后置条件型合约包括方法前置条件及方法后置条件,所述方法前置条件是在方法入口处具有的性质,即当程序发生错误时,违反前置条件,且所述前置条件在方法入口处插入源程序;
所述后置条件是在方法出口处具有的性质,当程序发生错误时,违反后置条件,且所述后置条件在方法出口处插入源程序。
在上述技术方案的基础上,所述类不变量型合约为在整个类中保持不变的性质,类中每个方法调用时都要对该性质进行检查是否违反该性质,且所述类不变量型合约在类体结束处插入源程序。
在上述技术方案的基础上,所述循环不变量型合约用于找出在循环中出现的错误,且所述循环不变量型合约插入循环头及循环体之间。
在上述技术方案的基础上,所述其他类型合约为不属于上述方法前置条件和后置条件型合约、类不变量型合约、循环不变量型合约的其他合约,所述其他类型合约通过用户手动选择其插入源程序的位置。
在上述技术方案的基础上,所述步骤5中将合约注释均转换为具有故障检测性质的代码,并插桩到源程序的相应目标位置,算法步骤如下:
1.遍历程序中每一处注释类型;
2.根据注释类型找出该合约类型以及估计的该注释类型的插桩位置;
3.使用源代码插桩技术,在不破坏源代码结构的基础上,找到确定的插桩位置,在该处插入具有故障检测性质的代码。
本发明的优点在于:将采用动态不变量生成技术生成的不变量以合约的方式作为在线预警方法的检测规则,提供了合约的来源,是解决合约制定困难的有效方法,设置合约的注释形式和插桩位置,提供基于源代码的插桩算法,同时还支持手动添加合约,自动化程度很高,能有效预警,使得系统在运行期间故障检测率较高。
附图说明
图1是基于程序不变量的合约式故障预警流程图;
图2是Daikon动态不变量发现过程。
具体实施方式
下面将结合附图对本发明作进一步的描述。
如图1所示,本发明为一种基于程序不变量的合约式故障预警方法,所述方法包括以下步骤:
(1)使用Daikon工具为需要预警的程序生成程序不变量,将需要预警的源程序和对应于源程序的测试用例集作为Daikon工具输入,根据测试用例集在Daikon工具上运行源程序产生不变量,输出程序不变量;其中需要输入的测试用例集是由用户提供的,生成的不变量是数据合约,主要包含三种类型:入口不变量、出口不变量和类不变量。
如图2所示为Daikon动态不变量发现过程图,Daikon工具接受需要分析的源程序,Daikon的java语言前件对待分析程序进行处理,生成一个类型声明文件和一个修改以后添加了观察点的源程序,然后编译生成一个添加了观察点的新类,通过用户设计的测试程序,对新类多次实例化,并把观察到的样本值写入到一个数据跟踪文件中。Daikon利用数据跟踪文件和相关数据的类型声明文件,推导出相应程序点域之间满足的不变式,并把这些不变式语句输入到一个单独的文件中。
(2)对生成不变量进行筛选,分为对不变量进行自动筛选和提供可选操作由用户手动进行筛选,将筛选的不变量作为合约的一种来源,由于步骤1产生的不变量并不是完全适用,为了使得到的不变量更加准确,采用两种方式进行筛选:
1.采用Daikon内置的不变式过滤工具进行过滤;
2.将程序中所有程序点的不变量显示给用户,用户可以手动选择是否采用该程序点的不变量;
(3)手动生成由布尔断言组成的数据合约,所述数据合约是数据流的行为约束;
(4)将上述步骤2和3中两种方式得到的合约以规格化进行表示,并将规格化表示后的所述合约以注释的方式插桩到源程序的相应位置,所述规格化合约的类型包括方法前置条件和后置条件型合约、类不变量型合约、循环不变量型合约以及其他类型合约。
1.方法前置条件和后置条件合约
方法前置条件是在方法入口处具有的性质,即当程序发生错误时,违反前置条件,且所述前置条件在方法入口处插入源程序。用注释形式/*@require+合约*/表示;
方法后置条件是在方法出口处具有的性质,当程序发生错误时,可能会违反后置条件,所以后置条件在方法return语句或方法的结束处。用注释形式/*@ensure+合约*/表示。
2.类不变量合约
类不变量是在整个程序或类中保持不变的性质,类中每个方法调用时都要对该性质进行检查是否违反该性质,类不变量型合约在类体结束处插入源程序。在类定义中,用注释形式/*@class+合约*/表示。
3.循环不变量合约
循环不变量是为了找出在循环中出现的典型错误,例如循环不结束问题,循环不变量放置于循环头后,循环体之前。用注释形式/*loop+合约*/表示。
4.其他类型合约
其他类型合约为不属于上述方法前置条件和后置条件型合约、类不变量型合约、循环不变量型合约的其他合约,用户手动选择其插入源程序的位置。用注释形式/*@normal+合约*/表示。
(5)将步骤4中插桩到相应位置的注释转换为具有故障检测性质的代码,并插桩到源程序的相应目标位置;算法步骤如下:
1.遍历程序中每一处注释类型;
2.根据注释类型找出该合约类型以及该注释类型的插桩位置;
3.使用源代码插桩技术,在不破坏源代码结构的基础上,找到确定的插桩位置,在该处插入具有故障检测性质的代码。
(6)上述步骤是对源程序进行预处理,经过预处理的程序同时包含程序本身源代码和添加的故障检测代码,对该程序进行编译运行,如果程序运行过程中违反了程序合约,则故障检测代码会自动把监测到的故障展示给用户,表示有故障产生,达到预警功能,最后将整个运行过程中预警到的故障记录到预警日志中。
对于本领域的技术人员来说,可根据以上描述的技术方案以及构思,做出其它各种相应的改变以及变形,而所有的这些改变以及变形都应该属于本发明权利要求的保护范围之内。
Claims (5)
1.一种基于程序不变量的合约式软件故障预警方法,其特征在于:其包括如下步骤:
(1)使用Daikon工具为需要预警的程序生成程序不变量,将需要预警的源程序和对应于源程序的测试用例集作为Daikon工具输入,根据测试用例集在Daikon工具上运行源程序产生不变量,输出程序不变量;
(2)筛选所述不变量,所述筛选方式包括自动筛选和用户手动筛选,并将筛选后的不变量作为合约的一种来源;
(3)手动生成由布尔断言组成的数据合约,所述数据合约是数据流的行为约束;
(4)将上述步骤(2)和(3)中两种方式得到的合约以规格化进行表示,并将规格化表示后的所述合约以注释的方式插桩到源程序的相应位置;
(5)将步骤(4)中插桩到相应位置的注释转换为具有故障检测性质的代码,并插桩到源程序的相应目标位置;
(6)运行经步骤(1)至(5)处理后的源程序,如果程序运行过程中违反了程序合约,则故障检测代码会自动把监测到的故障展示给用户,表示有故障产生,并将整个运行过程中预警到的故障记录到预警日志中;
所述规格化合约的类型包括方法前置条件和后置条件型合约、类不变量型合约、循环不变量型合约以及其他类型合约,所述循环不变量型合约用于找出在循环中出现的错误,且所述循环不变量型合约插入循环头及循环体之间,所述类不变量型合约为在整个类中保持不变的性质,类中每个方法调用时都要对该性质进行检查是否违反该性质,且所述类不变量型合约在类体结束处插入源程序。
2.如权利要求1所述的基于程序不变量的合约式软件故障预警方法,其特征在于:所述步骤(2)中不变量的筛选过程包括手动筛选和自动筛选:
自动筛选方式:采用Daikon内置的不变式过滤工具进行过滤;
手动筛选方式:将程序中所有程序点的不变量显示给用户,用户可以手动选择是否采用该程序点的不变量。
3.如权利要求2所述的基于程序不变量的合约式软件故障预警方法,其特征在于:所述方法前置条件和后置条件型合约包括方法前置条件及方法后置条件,所述方法前置条件是在方法入口处具有的性质,即当程序发生错误时,违反前置条件,且所述前置条件在方法入口处插入源程序;
所述后置条件是在方法出口处具有的性质,当程序发生错误时,违反后置条件,且所述后置条件在方法出口处插入源程序。
4.如权利要求1所述的基于程序不变量的合约式软件故障预警方法,其特征在于:所述其他类型合约为不属于上述方法前置条件和后置条件型合约、类不变量型合约、循环不变量型合约的其他合约,所述其他类型合约通过用户手动选择其插入源程序的位置。
5.如权利要求1所述的基于程序不变量的合约式软件故障预警方法,其特征在于:所述步骤(5)中将合约注释均转换为具有故障检测性质的代码,并插桩到源程序的相应目标位置,算法步骤如下:
1.遍历程序中每一处注释类型;
2.根据注释类型找出该合约的类型以及估计的该注释类型的插桩位置;
3.使用源代码插桩技术,在不破坏源代码结构的基础上,找到确定的插桩位置,在该位置插入具有故障检测性质的代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310196434.9A CN103294596B (zh) | 2013-05-23 | 2013-05-23 | 一种基于程序不变量的合约式软件故障预警方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310196434.9A CN103294596B (zh) | 2013-05-23 | 2013-05-23 | 一种基于程序不变量的合约式软件故障预警方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103294596A CN103294596A (zh) | 2013-09-11 |
CN103294596B true CN103294596B (zh) | 2016-11-16 |
Family
ID=49095514
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310196434.9A Active CN103294596B (zh) | 2013-05-23 | 2013-05-23 | 一种基于程序不变量的合约式软件故障预警方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103294596B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103678095A (zh) * | 2012-09-03 | 2014-03-26 | 鼎桥通信技术有限公司 | 一种告警检测方法 |
CN103605777B (zh) * | 2013-11-28 | 2017-04-12 | 北京国双科技有限公司 | 数据库索引处理方法和装置 |
US20170109525A1 (en) * | 2014-03-31 | 2017-04-20 | Irdeto B.V. | Protecting an item of software |
CN106201892B (zh) * | 2016-07-20 | 2019-02-01 | 中国航空工业集团公司航空动力控制系统研究所 | 用于嵌入式软件的异常中断源定位检测方法 |
CN107656861B (zh) * | 2016-07-26 | 2020-06-02 | 龙芯中科技术有限公司 | 硬件抽象层调试方法和装置 |
CN108304330B (zh) * | 2018-02-26 | 2021-09-21 | 腾讯科技(深圳)有限公司 | 内容提取方法、装置和计算机设备 |
CN112581140B (zh) * | 2020-12-24 | 2022-07-29 | 西安深信科创信息技术有限公司 | 一种智能合约验证方法、计算机存储介质 |
CN113542062A (zh) * | 2021-07-12 | 2021-10-22 | 广东电网有限责任公司 | 一种配电物联网故障检测方法、装置、设备及存储介质 |
CN113900665B (zh) * | 2021-12-09 | 2022-03-15 | 众连智能科技有限公司 | 一种智能合约的安全检测方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7013460B2 (en) * | 2001-05-15 | 2006-03-14 | Hewlett-Packard Development Company, L.P. | Specifying an invariant property (range of addresses) in the annotation in source code of the computer program |
CN101794224B (zh) * | 2010-02-26 | 2013-11-13 | 中国人民解放军国防科学技术大学 | 一种基于性质规约模式的软件运行时性质监测方法 |
CN102521130B (zh) * | 2011-12-13 | 2014-12-24 | 南京大学 | 一种基于聚类不变式分析的错误定位方法 |
-
2013
- 2013-05-23 CN CN201310196434.9A patent/CN103294596B/zh active Active
Non-Patent Citations (4)
Title |
---|
基于不变式的软件故检测与恢复技术研究;王燕妮;《中国优秀硕士学位论文全文数据库信息科技辑》;20120215(第02期);第I138-1289页 * |
基于契约和代码植入的协议测试技术研究;刘美芹;《中国优秀硕士学位论文全文数据库信息科技辑》;20070515(第05期);I139-22页 * |
嵌入式白盒测试中插桩技术的研究与应用;路翠;《中国优秀硕士学位论文全文数据库信息科技辑》;20101015(第10期);第I138-172页 * |
软件故障预防方法与探讨;翟志华等;《第五届中国测试学术会议论文集》;20080531;第453-457页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103294596A (zh) | 2013-09-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103294596B (zh) | 一种基于程序不变量的合约式软件故障预警方法 | |
Schäfer et al. | An empirical evaluation of using large language models for automated unit test generation | |
CN105787367B (zh) | 一种软件更新的补丁安全性检测方法及系统 | |
Nguyen et al. | Detection of embedded code smells in dynamic web applications | |
CN102567200A (zh) | 基于函数调用图的并行化安全漏洞检测方法 | |
Sarhan et al. | A survey of challenges in spectrum-based software fault localization | |
CN103530228A (zh) | 一种基于模型的软件测试方法 | |
Buinevich et al. | The life cycle of vulnerabilities in the representations of software for telecommunication devices | |
Trautsch et al. | Are unit and integration test definitions still valid for modern Java projects? An empirical study on open-source projects | |
Polo et al. | Integrating techniques and tools for testing automation | |
Soares et al. | Identifying overly strong conditions in refactoring implementations | |
Ma'ayan | The quality of junit tests: an empirical study report | |
DeOrio et al. | Bridging pre-and post-silicon debugging with BiPeD | |
US20150242541A1 (en) | Assertion extraction from design and its signal traces | |
Kicsi et al. | Testroutes: A manually curated method level dataset for test-to-code traceability | |
Xu et al. | Testing aspect‐oriented programs with finite state machines | |
Rocha et al. | Hunting Memory Bugs in C Programs with Map2Check: (Competition Contribution) | |
Madeja et al. | Tracing naming semantics in unit tests of popular GitHub Android projects | |
Zhang et al. | Context-sensitive data race detection for concurrent programs | |
DeOrio et al. | Inferno: Streamlining verification with inferred semantics | |
Fluri | Assessing changeability by investigating the propagation of change types | |
von Detten | Towards systematic, comprehensive trace generation for behavioral pattern detection through symbolic execution | |
Bo et al. | Performance Evaluation of Data Race Detection Based on Thread Sharing Analysis With Different Granularities: An Empirical Study | |
CN106339288B (zh) | 一种软件故障上下文定位的方法及装置 | |
Wasylkowski | Mining object usage models |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |