你好,ict误报怎么oracle 误修改数据程序才能过!

为什么用易语言写的程序容易被杀毒软件误报,
我自己写的易语言总是被杀毒软件误报,怎么弄啊,我自己写的有没有毒我还不知到么
来源:网络
关键字: 易语言 误报
更新时间:
延伸:本文除了聚合《为什么用易语言写的程序容易被杀毒软件误报,》,免费提供的有关易语言 误报和我自己写的易语言总是被杀毒软件误报,怎么弄啊,我自己写的有没有毒我还不知到么的内容之一,已有不少的网友认为此答案对自己有帮助!
网友1的回答
关闭杀毒软件呗网友2的回答
你好,由于易语言的特殊编译方式。杀毒软件会产生误报。这个目前还没有什么方法能彻底解决。 推荐一个可行网友3的回答
您好: 因为很多木马病毒都是通过易语言来编写的,所以很容易被误报为病毒 建议您可以到腾讯电脑管家官网网友4的回答
哦,这是杀毒软件搞的鬼,先关闭杀毒软件,然后运行【估计是你的杀毒软件版本过低,易语言程序统统报毒】网友5的回答
易语言官方说明:“病毒误报”,让我们来一起消灭它! 1、落后陈腐的特征码查毒技术 目前杀毒软件基本上网友6的回答
是因为它的行为有点像病毒:弹出窗口,修改注册表,写出文件,隐藏窗口等等,所以国内许多知名的杀毒软件都网友7的回答
愿我的答案 能够解决您的烦忧 第一,这是最近很流行的病毒。 第二,建议您现在立刻下载腾讯电脑管家“4网友8的回答
易语言编译生成的EXE在运行时,绝大多数情况下CPU指令运行在支持库领空(仅少数在EXE领空,这与其网友9的回答
网友7的回答
猜你感兴趣
相关关键词 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
下载积分:2500
内容提示:过程控制2
文档格式:DOC|
浏览次数:3|
上传日期: 16:36:21|
文档星级:
该用户还上传了这些文档
官方公共微信捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&处理先进技术板:将X光与ICT结合
为大型、高密度的印刷电路板装配(PCBA, printed
board assembly)发展一个稳健的测试策略是重要的,以保证与设计的符合与功能。除了这些复杂装配的建立与测试之外,单单投入在零件中的金钱可能是很高的 - 当一个单元到最后测试时可能达到25,000美元。由于这样的高成本,查找与修理装配的问题现在比其过去甚至是更为重要的步骤。今天更复杂的装配大约18平方英寸,18层;在顶面和底面有2900多个元件;含有6000个电路节点;有超过20000个焊接点需要测试。  在朗讯加速的制造工厂(N. Andover, MA),制造和测试艺术级的PCBA和完整的传送系统。超过5000节点数的装配对我们是一个关注,因为它们已经接近我们现有的在线测试(ICT, in circuit )设备的资源极限(图一)。我们现在制造大约800种不同的PCBA或“节点”。在这800种节点中,大约20种在个节点范围。可是,这个数迅速增长。   新的开发项目要求更加复杂、更大的PCBA和更紧密的包装。这些要求挑战我们建造和测试这些单元的能力。更进一步,具有更小元件和更高节点数的更大电路板可能将会继续。例如,现在正在画电路板图的一个设计,有大约116000个节点、超过5100个元件和超过37800个要求测试或确认的焊接点。这个单元还有BGA在顶面与底面,BGA是紧接着的。使用传统的针床测试这个尺寸和复杂性的板,ICT一种方法是不可能的。  在制造工艺,特别是在测试中,不断增加的PCBA复杂性和密度不是一个新的问题。意识到的增加ICT测试夹具内的测试针数量不是要走的方向,我们开始观察可代替的电路确认方法。看到每百万不接触的数量,我们发现在5000个节点时,许多发现的错误(少于31)可能是由于探针接触问题而不是实际制造的缺陷(表一)。因此,我们着手将测试针的数量减少,而不是上升。尽管如此,我们制造工艺的品质还是评估到整个PCBA。我们决定使用传统的ICT与X射线分层法相结合是一个可行的解决方案。 表一、达到可接受的假阴率(false-negative )要求探针的接触质量,当夹具有几千个针时是不可能维持的5.55.65.75.85.96&=针数31.720.68.55.43.4&=PPM00000005001.6%1.0%0.7%0.4%0.3%0.2%10003.2%2.1%1.3%0.9%0.5%0.3%15004.8%3.1%2.0%1.3%0.8%0.5%20006.3%4.1%2.7%1.7%1.1%0.7%25007.9%5.2%3.3%2.1%1.4%.0.9%30009.5%6.2%4.0%2.6%1.6%1.0%350011.1%7.2%4.7%3.0%1.9%1.2%400012.7%8.2%5.3%3.4%2.2%1.4%450014.3%9.3%6.0%3.8%2.4%1.5%500015.9%10.3%6.7%4.3%2.7%1.7%550017.4%11.3%7.3%4.7%3.0%1.9%600019.0%12.4%8.0%5.1%3.2%2.0%650020.6%13.4%8.6%5.5%3.5%2.2%700022.2%14.4%9.3%6.0%3.8%2.4%公式:(100 块板 x PPM率 x 针数)/(1M *100) = 100板产生一个误报的%测试策略  我们整体测试策略大部分依靠边界扫描,它提供一个部分解决方案。许多元件在ICT不能确认,许多复杂的ASIC有许多必须确认的电源和接地引脚。这些引脚的开路可能造成长期可靠性的问题。我们采用的测试策略是使用自动X射线分层检查系统确认整个板上每个焊接点的可接受性。在这个策略中,生产PCBA都经过X光系统。有缺陷的板经过修理站进行改正行动和重检查。通过检查的PCBA进入在线电路板测试系统作进一步测试。这个策略在对现在生产中的先进技术装配实施的最后阶段。设计的模型或开发/原型阶段的PCBA只通过焊接点完整性的X光检查,因为在线测试机的测试夹具和/或测试程序通常这时还没有。  使用生产X光检查进行模型评估,允许诊断技术员排除焊点有关的问题,如开路、短路、元件丢失、少锡和一些极性方向问题。这个新工艺已经节省时间与金钱。现在,为模型开发进行的制造测试趋向于大约与生产运行相同的规模。模型运行可能在150个单元的范围,高端PCBA的生产运行在200个单元范围。  我们的PCBA使用自动贴片机器完成,手工连接器贴装和手工面板装配。使用X光和ICT技术测试完成的装配,来确认我们的工艺。测试程序保证正确的零件已经以正确的位置和方向放在板上,X光决定所有的焊接点已经形成。这时功能还没有确认。接收板的经营单位选择是否做整板的功能测试。这个决定是在单个板的基础上作出的。其次,PCBA安装到架子内,架子放入框内,框与框连接。最后,整个系统功能测试,所有装配在最后系统测试期间接受功能测试。在适当的测试之后,系统发送到最终用户。X光/ICT相互作用  超过5200个ICT机器节点限制的PCBA是不可能使用传统的针床夹具ICT测试的。而且,我们没有装配可在在线测试机上完全测试。通常,10~15%的板的核心电路不能测试。例如,旁路和ASIC元件的电源与接地引脚对DC级的测量是不可见的。因为这些节点不能用一般的ICT测试,我们使用了X射线分层工艺。在使用X光之前,大板上的覆盖率在60~70%之间。在测试测量中包括X光提供99%的测试覆盖。对于通过X光系统确认的焊点完整性的元件,我们假设遵循了前面的工序保证板上贴装正确的元件。  另外,我们必须确认板是结构上连接的 - 所有焊接点正确连接并且没有内部短路或开路存在。这是由X射线检查来完成的。  对于ASIC的ICT,相当广泛地使用边界扫描,它允许我们的测试机快速地读入ASIC的ID寄存器。如果成功,边界扫描显示ASIC在位置上并方向正确。前面确认的焊点结构完整性减少针床夹具需要接触的节点数量。ICT将不需要切换每一个ASIC引脚来确定其是否开路。  通过使用专门的X射线分层检查系统,我们已经能够平均减少40%所要求的节点数量。ICT节点数减少,降低夹具的复杂性和成本,也得到更少的误报,这使得板更快速地通过我们的返修和制造工序。使用X射线也将ICT处的第一次通过合格率增加20%。使用X射线/ICT结合的测量已经降低整体成本,改善可靠性和输出产品的品质。允许产品更快的出货。X射线/ICT测量的未来  现在,在我们生产线上只有一少部分的板超过5200个节点的ICT限制。我们预计在不久的将来该比例会稳定增长。  还有,随着我们取得经验和增加X射线的能力,我们可能将我们新的测量应用到节点数低至2500个节点的PCBA。因为现在存在于个节点范围的板的合格率问题,这些问题是由于探针接触问题而不是实际装配问题,我们预计使用X射线/ICT相结合的测量可以看到一个改善。  早在九十年代,我们决定标准化ICT系统的选择,我们的测试工程师可作三种配制,而不是一种开口测量。我们分1900个节点、3900个节点和5200个节点的配制。现在,我们已经升级几乎每一个测试达到个节点的设备,倾向于5200个节点的系统。  X射线分层法与ICT技术相结合的进一步使用是理想的,因为每一个技术都补偿另一技术的缺点。X射线主要集中在焊点的质量。它也可确认元件是否存在,但不能确认元件是否正确,方向和数值是否正确。另一方面,ICT可决定元件的方向和数值但不能决定焊接点是否可接受,特别是在大的表面贴装元件包装下面。  在不久将来,我们希望在看到电路原理图时马上可以决定对新的电路设计的测试测量。这时,对高节点数的原理图,我们可决定哪些节点应该用ICT,哪一些节点应该用X射线。现在,我们直到一个设计在开发过程中相对清楚时才可作出决定。  理想地,软件可产生X光和在线测试技术,ICT测试程序应该相当地小。测试测量信息可以放在计算机辅助设计(CAD)布局系统,包括较少数量的要求测试焊盘特性的节点。测试焊盘减少的一个附加优点是板面资源节省,使得布局任务更加容易。针床夹具也应该随着接触探针的减少而简化;同样减少测试针与其目标接触不良的可能性。简而言之,用复杂性更低的程序与夹具可达到更好的缺陷覆盖率。 在线测试怎样工作  在线测试(ICT)是通过探测分布于板的表面的测试点来确认一个电路子装配的电气完整性的过程。对于自动测试,探针是安装于一块厚的苯酚板上的弹簧加力的“针”,分别连线到一个开关矩阵。开关矩阵是继电器的排列,将适当的针连接到测试程序中每一步所要求的电流源和电压测量仪器。  带有成百上千弹簧针的苯酚板构成一个针床,测试工程师采用了“针床夹具”名词来叫这个板。每个针都有定位,使得当板放在夹具上,由真空装置拉下时,针都接触其目标测试点,而不短路到相邻的电流结构。   ICT可以确认导电路线的存在,排除短路的可能性,测量单个和电感器,检查二极管、三极管和的存在与方向。ICT通常不能决定极性电容的极性或确认丢失的旁路电容。可是,它可发现短路的电容和开路的电感器。  基本的ICT近年来随着克服先进技术局限的技术而改善。例如,当集成电路变得太大以至于不可能为相当的电路覆盖率提供探测目标时,ASIC工程师开发了边界扫描技术。边界扫描(boundary scan)提供一个工业标准方法来确认在不允许探针的地方的元件连接。额外的电路设计到IC内面,允许元件以简单的方式与周围的元件通信,以一个容易检查的格式显示测试结果。  另一个无矢量技术(vectorless technique)将交流(AC)信号通过针床施加到测试中的元件。一个传感器板靠住测试中的元件表面压住,与元件引脚框形成一个电容,将信号偶合到传感器板。没有偶合信号表示焊点开路。  用于大型复杂板的测试程序的人工是很大的。幸好,自动测试程序产生(ATPG, automated test program generation)软件可基于PCBA的CAD数据和装配于板上的元件规格库,自动地设计所要求的夹具和测试程序。虽然这些技术帮助简单程序生成时间,但高节点数测试程序的论证还是一个费时和技术挑战性的努力。 X射线分层法怎样工作  PCBA制造基本上是将预制的元件焊接到预制的印刷电路板上。理论上,只要正确的元件以正确的方向放在正确的位置,并以良好的焊点电气连接,PCBA将按设计一样运行。因此,对于一个PCBA制造商的测试问题归结为保证焊接点的质量 - 一个结构性检查。  当焊接点隐藏于大的集成电路(IC)包装下面,检查就要求X光。X光可渗透IC包装但被密度大得多的铅基焊锡所吸收,留下影子一样的图象。可是,一个简单的X光影象会被分布在IC内部结构中的和多层电路板层中的金属导体所混淆。当PCBA在两面有电路时情况变得更差。  X射线分层法,或3维X光,是一个用于隔离PCBA内水平面的技术,使得它们可以分别检查。和阴影图一样,该技术从X射线的平行和图象排列开始。不象阴影图技术(shadowgraph),分层的X光束以一个角度穿过板。感应器直接在板的结构底下在视觉范围内,但偏移来截至以一角度来的X射线束。  在成像的过程中,感应器和光源两者都绕一轴转动,穿过视觉区(FOV, field of view)。图像模糊引起在图象面的结构显得静止,而图像面上或下的物体在圆周运动中快速移动,看上去不聚焦,迅速从视野消失。这个现象类似于“穿过”飞机旋转的螺旋桨来看。  基于得到图象的细节,计算机运算法则可决定焊点圆角的确切形状,超出焊点内的空洞。它也可计算焊锡量。这些测量都可显示焊接点的品质。该技术也可用来查找可能引起短路的锡桥。
技术资料出处:fanxin_bme
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
12345678910
12345678910
MEMS加速度计原理
技术成熟的MEMS加速度计分为三种:压电式、容感式、热感式。压电式MEMS加速度计运用的是压电效应,在其内部有一个刚体支撑的质量块,有运动的情况[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科你好啊,我找到的程序是虹膜识别的源代码,网上这种比较多,但是很多地方不知道怎么修改,木法出图,求帮忙_百度知道&&&&2014, Vol. 25 Issue (3): 472-488
衷璐洁, 霍玮, 李龙, 李丰, 冯晓兵, 张兆庆. 一种场景敏感的高效错误检测方法[J].软件学报,): 472-488.http://www./19.html &&
ZHONG Lu-Jie, HUO Wei, LI Long, LI Feng, FENG Xiao-Bing, ZHANG Zhao-Qing. Efficient Scene-Sensitive Fault Detection Approach[J]. Ruan Jian Xue Bao/ Journal of Software, ): 472-488.http://www./19.html &&
一种场景敏感的高效错误检测方法
衷璐洁1,2,3, 霍玮4, 李龙1, 李丰1, 冯晓兵1, 张兆庆1&&&&
1 中国科学院 计算技术研究所 计算机体系结构国家重点实验室, 北京 100190;2 首都师范大学 信息工程学院, 北京 100089;3 中国科学院大学, 北京 100049;4 中国科学院 信息工程研究所 第五研究室, 北京 100093
基金项目:国家自然科学基金(303053);国家高技术研究发展计划(863)();国家自然科学基金创新研究群体科学基金()
作者简介:霍玮(1981-),男,博士,助理研究员,CCF
会员, 主要研究领域为程序分析, 错误
E-mail: huowei@李龙(1988-),男,工程师,主要研究领域为
程序分析,错误检测.
E-mail: lilong@李丰(1985-),女,博士,CCF 会员,主要研
究领域为程序分析,错误调试.
E-mail: lifeng2005@冯晓兵(1969-),男,博士,研究员,博士生
导师, CCF 高级会员,主要研究领域为先
进编译技术及相关工具环境.
E-mail: fxb@张兆庆(1938-),女,研究员,博士生导师,
CCF 高级会员,主要研究领域为编译技术
及相关工具.
E-mail: zqzhang@
通讯作者:衷璐洁(1979-),女,江西南昌人,博士生,
讲师, 主要研究领域为程序分析, 错误
E-mail: zhonglujie@
摘要:定值-引用类错误是一类非常重要且常见的错误.当前,对这类错误的检测很难同时达到高精度和高可扩展性.通过合理组合敏感和不敏感的检测方法并控制两类方法的实施范围,可以同时达到高检测精度和高可扩展性.提出一种新颖的场景敏感的检测方法,该方法根据触发状态对潜在错误语句分类,识别不同类别语句的触发场景并实施不同开销的检测,在不降低精度的同时最小化检测开销.设计了一个多项式时间复杂度的流敏感、域敏感和上下文敏感的场景分析以进行分类,并基于程序依赖信息识别触发场景,仅对必要的触发场景实施路径敏感的检测.为上述方法实现了一种原型系统——Minerva.通过使用空指针引用错误检测为实例研究以及总代码规模超过290万行,最大单个应用超过200万行的应用验证,用例实验结果表明,Minerva的平均检测时间比当前先进水平的路径敏感检测工具Clang-sa和Saturn分别快3倍和46倍.而Minerva的误报率仅为24%,是Clang-sa和Saturn误报率的1/3左右,并且Minerva未发现漏报已知错误.上述数据表明,所提出的场景敏感的错误检测方法可同时获得高可扩展性和高检测精度.
定值-引用错误&&&&
路径敏感错误检测&&&&
错误目标触发场景&&&&
场景敏感&&&&
程序分析&&&&
Efficient Scene-Sensitive Fault Detection Approach
ZHONG Lu-Jie1,2,3, HUO Wei4, LI Long1, LI Feng1, FENG Xiao-Bing1, ZHANG Zhao-Qing1&&&&
1 State Key Laboratory of Computer Architecture, Institute of Computing Technology, The Chinese Academy of Sciences, Beijing 100190, C2 Information Engineering College, Capital Normal University, Beijing 100089, C3 University of Chinese Academy of Sciences, Beijing 100049, C4 No.5 Research Laboratory, Institute of Information Engineering, Chinese Academy of Sciences, Beijing 100049, China
Corresponding author: ZHONG Lu-Jie, E-mail: zhonglujie@
Abstract: Def-Use faults are a very important and common type of faults. The state-of-the-art detection schemes for such faults still hardly achieve both preciseness and scalability. This paper applies the idea of combining the sensitive and insensitive detection approaches and deploying the effective range of the two approaches to achieve both high detection scalability and high precision. The study results in a new scene- sensitive detection strategy based on a classification scheme on statements that contain potential faults. The key idea is to classify these statements into different categories based on how a potential fault in these statements might be triggered. It uses polynomial flow-, field- and context-sensitive summary based scene analysis to do the classification and identifies triggering scenes based on program dependence information. Different detection schemes with different amount of overheads are then applied to different categories and thus reducing the overall overhead and achieving a higher scalability. The path-sensitive detection schemes are only performed on the necessary triggering scenes. The proposed approach is implemented in a prototype system, called Minerva. Using null pointer dereference fault detection as an example and verifying the approach through applications whose total code size exceed 2.9 million lines (one application exceeds 2 million lines), the experimental results show that the average detection time of Minerva is 3× and 46× faster than the two state-of-the-art path-sensitive detection tools, Clang-sa and Saturn, respectively. The false positive rate of Minerva is 24%, which is also a third of that of Clang-sa and Saturn's. There is no false negative on the known faults. The results show that the proposed scene-sensitive fault detection approach can achieve both high scalability and high accuracy.
Key words:
def-use fault&&&&
fault detection&&&&
sink triggering scene&&&&
scene-sensitive&&&&
program analysis&&&&
定值-引用类错误通常很容易发生但较难精确地检测.代表性的定值-引用类错误包括空指针引用、未赋值引用、除零错、缓冲区溢出等.这类错误难以精确检测,是因为这些错误中由错误源到达错误目标的路径往往很长且涉及的路径数众多.不仅规模大的应用程序包含大量的执行路径,即便是小规模的程序,仍有可能具有大量的路径数.例如SPEC CPU2000中的164.gzip,其程序代码规模仅为8 000行,但涉及的路径数却超过了3.49E+11[].
一直以来,高可扩展性和高检测精度都是静态错误检测所追求的目标.为了获得高检测精度,有很多方法采用了路径敏感的检测策略,但这些方法在可扩展性上的不足严重影响了它们的实用性.为了提高可扩展性,一些路径敏感的检测方法引入了需求驱动的策略,但仍然存在这样一些问题:1) 检测的可扩展性提高了,但检测精度却有所降低.例如在Clang-sa[]中,为了减少开销,它限制了所能处理的路径条件表达式的类型,因此导致了检测精度上的损失;2) 路径敏感的开销仍然很大.如文献[3-7]实施路径敏感检测的范围是整个程序中所有的潜在错误语句,但对于定值-引用类错误而言,潜在错误语句涉及的引用点数量众多,错误触发的场景也更为复杂,对于这样的情形,通常以切片为主要技术的需求驱动策略往往不够有效.
我们对OpenSSH[]和Wireshark[]等实用程序进行分析后发现:1) 有些错误在每条潜在执行路径上都会被触发; 2) 有些错误在任何潜在执行路径上都不会被触发;3) 有些错误可能在一些但不是全部的执行路径上才会被触发.基于上述发现,我们认为为了保证检测精度,有必要采用路径敏感的检测方法,但是没有必要对所有的潜在错误语句都采用路径敏感的检测方法.
如图 1所示片段为例,该片段提取自Wireshark[],一个实际的网络协议分析应用,其代码超过了200万行.从错误源(可能引起错误的变量定值点)到错误目标(可能触发错误的变量引用点)的路径较长(第4行~第36行涉及大量代码,图中…代表省略的代码段).但图中第34行的宏DISSECTOR_ASSERT会阻止潜在的不安全值流向错误目标.这样,第36行在对ie_item变量进行解引用时不安全的值将不会到达.可是对于这样的情形,传统的路径敏感检测方法需要对图中标识为灰色的代码区域中各条潜在执行路径逐一进行路径敏感的分析,产生较长的路径条件约束并进行求解,但事实上,对于该例中的这种情形,如果能够识别宏DISSECTOR_ASSERT中的特殊控制流,即可判别第36行的危险值解引用不会到达,这样可以避免大量冗余的检测开销.同时值得一提的是,类似这样的在值引用之前进行检查的现象,在实际应用程序中并不少见.
基于以上分析,我们认为错误检测可以通过组合低开销的路径不敏感方法和高精度的路径敏感方法来同时获得高可扩展性和检测精度.在本文中,我们提出了一个可扩展的、高精度的错误检测框架,它基于潜在错误语句分类进行错误检测.考虑错误是否会被触发的场景,我们将程序中所有的潜在错误语句分为一定触发(must-trigger)、一定不触发(must-not-trigger)和可能触发(trigger-unknown)这3类,同时设计一个多项式时间的流敏感、域敏感和上下文敏感的传播引擎去实施分类.在分类后,对位于潜在错误语句中的不同类别的错误目标应用合适的、高效的检测算法进行处理.对于一定触发和一定不触发的潜在错误语句,通过低开销的路径不敏感方法完成检测;而对于可能触发的潜在错误语句,采用路径敏感的检测方法.通过这样的方式,我们可以实现路径敏感与路径不敏感检测的合理组合.由于在一个程序中路径不敏感和路径敏感的检测方法的应用范围是互补的,上述的组合方式在拓展路径不敏感检测有效范围的同时,缩小了路径敏感检测的范围,可以实现总开销的合理调控.
图1Fig. 1Fig. 1 A motivating example (from Wireshark)图 1 研究动机示例(选自Wireshark)
本文贡献如下:
1) 提出利用组合路径敏感和不敏感检测的策略,以同时达到错误检测高可扩展性和高检测精度的目标.通过拓广一个程序中路径不敏感检测方法的有效范围,缩小需要进行路径敏感检测的范围.并基于上述想法提出一种场景敏感的检测方法,该方法基于按不同触发场景对程序中潜在错误语句进行分类的思想,将潜在错误语句分为:一定触发、一定不触发和可能触发这3类.通过路径不敏感的方法完成场景分类以及一定触发和一定不触发的潜在错误语句的处理,仅对可能触发的潜在错误语句利用路径敏感的方法进行检测;
2) 在开放源码编译器Open64[]中实现了上述方法的原型系统Minerva,并在应用广泛、超过290万行规模的代码上对Minerva进行了验证.通过将空指针引用错误检测作为实例研究,验证了场景敏感检测方法的有效性.结果表明,对于本文的实验用例,Minerva的平均检测时间分别比当前先进水平的路径敏感检测工具Clang-sa和Saturn快了约3倍和46倍.平均误报率仅为24%,是Clang-sa和Saturn平均误报率的1/3左右,且没有漏报已知错误.
第1节介绍术语.第2节阐述场景敏感检测方法的全貌及Minerva框架,并讨论如何对潜在错误语句进行分类,以及如何基于这样的分类进行相应的检测算法设计.第3节给出场景敏感检测效益模型.第4节是原型系统的实现.第5节给出实验结果,包括实验环境和实验用例.第6节是相关工作.最后对全文进行总结.
有一类重要的错误,它们通常表现为在变量的定值点分配给变量一个不安全(unsafe)的值,并且这个不安全的值会沿着至少一条执行路径流向该变量的引用点,从而触发一个错误.对这样一类错误,本文称为定值-引用类错误.定值-引用类错误中的引用点被称为错误目标(sink),相应定值点被称为错误源(source).
定义1(触发场景). 给定变量v的一个引用点(记作USE(v)),所有沿着控制流路径可以到达该引用点的定值点集合(记作DEFs(v))与给定引用点以及它们之间的路径所构成的控制流子图是一个触发场景.我们用触发场景图(triggering-scene graph,简称TSG)对触发场景进行描述.将变量v的一个引用点USE(v)的TSG记为TSGUSE(v)=áV,E&,其中,V&IVCFG,DEFs(v)&IV,USE(v)&IV,E&IECFG,VCFG和ECFG分别表示控制流图CFG的顶点集和边集.
定义2(触发状态). 划分3种触发状态:一定触发、一定不触发和可能触发,定义如下:
· 一定触发(must-trigger)状态:在TSGv上,如果&s&IDEFs(v),定值s都是不安全的,那么称USE(v)处于一定触发状态;
· 一定不触发(must-not-trigger)状态:在TSGv上,如果&s&IDEFs(v):
(1) 定值s是安全的,或者
(2) 定值s是不安全的,但从s到USE(v)的值流路径不可行,
那么称USE(v)处于一定不触发状态;
· 可能触发(trigger-unknown)状态:在TSGv上,如果$s&IDEFs(v),定值s是安全的并且$s&&IDEFs(v),定值s&是不安全的且s和s&到USE(v)的值流路径可能可行,称USE(v)处于可能触发状态.
一般地,若USE(v)有不安全值到达,称USE(v)所在的语句为潜在错误语句.
文中场景敏感的错误检测方法是指在执行错误检测时会区分不同的错误目标触发状态,即对每一种错误目标触发状态,场景敏感的错误检测方法会选择最合适开销的方法进行检测;相反地,一个场景不敏感的错误检测方法并不会在检测时区分不同的错误目标触发状态.
定值-引用类错误的检测问题本质上是一个广义的定值-引用流分析问题.受数据流分析框架[]的启发,我们用格值模型描述定值-引用类错误的属性.该模型将定值-引用类错误的检测问题域组织成一个格,称为错误属性格.基于错误属性格的定义,我们将定值-引用类错误的检测问题变换为错误属性格值的计算与传播问题,并将负责错误属性格值计算与传播的部分称为传播引擎(propagation engine,简称PE).
定义3(错误属性格). 错误属性格(fault attribute lattice,简称FAL)是一个代数系统,定义为FAL=(VFAL, Fintersection,Funion),其中,
· 集合VFAL中的元素是具体错误类型的错误属性格值;
· VFAL中的底元素^表示初始的错误属性值,顶元素ú表示检测到的将要报告的错误属性值;
· 函数Fintersection:VFALxVFAL&VFAL和Funion:VFALxVFAL&VFAL分别是FAL中的最大下界和最小上界函数,它们实现将错误属性值计算映射为FAL上的格值操作;
· FAL上的偏序关系对应错误属性格值的计算规则;
· FAL值具有3种属性:安全、一定不安全和可能不安全.其中,安全的FAL值对应一定不触发的状态;一定不安全的FAL值对应一定触发状态;可能不安全的FAL值则需要进一步判断:若值流路径无法到达引用点,则对应一定不触发状态;否则,对应可能触发状态.
2 场景敏感的错误检测策略
2.1 错误触发场景
一般地,错误触发场景通常表现为如图 2所示的3种典型形式:
(1) 对于如图 2(a)所示的一定触发场景,无论程序执行哪条从定值点到引用点的路径,都存在源自错误源的不安全值到达错误目标;
(2) 对于如图 2(b)所示的一定不触发场景,因为在错误目标与错误源之间存在对值进行引用前检查的检查语句,即图中是否不安全?判定框,所以对于错误目标而言值流将不可达.这是一种常见的程序员安全编程习惯:在使用一个值,特别是指针值之前,先去检查该值是否是不安全的,若是不安全的,就会引导程序执行绕过引用点以避免错误的发生.这样的处理方式通常会改变正常的程序控制流,称为特殊控制流(special control flow,简称SCF);
(3) 对于如图 2(c)所示的可能触发场景,错误源到错误目标的值流是否可行取决于条件(1),而这需要利用路径敏感的分析来判定.
图2Fig. 2Fig. 2 Typical sink-triggering scenes图 2 典型的错误触发场景
我们统计了实验中所有程序内一定触发、一定不触发和可能触发的错误目标的数量,发现只有6%的错误目标是可能触发的,其余均为一定触发或一定不触发的,并且一定不触发的错误目标比例高达73%.这意味着高效的分类算法以及仅对可能触发的错误目标进行路径敏感的检测对达到在不降低精度的情况下提高检测效率的目标而言是有实际应用基础的.
2.2Minerva检测框架
图 3给出了Minerva检测框架的示意图.首先,针对具体的定值-引用类错误创建一种错误属性格(FAL)模型,将错误属性定义为格值,通过这种方式,传播引擎(PE)将错误检测问题变换为FAL值的计算与传播问题.随后, PE以一种静态的、路径不敏感但上下文敏感的方式计算程序中的FAL值,对错误目标进行分类,并根据这些错误目标的FAL值属性进行如下处理:
1) 对于那些具有一定不安全属性的错误目标,即无论执行程序中的哪条路径它们都一定会被触发.对于这些错误目标,PE会将它们归类为一定触发,并直接给出错误报告;
2) 对于那些具有可能不安全属性的错误目标,PE会进一步判定这些错误目标是否是一定不触发的错误目标:如果是,意味着相应错误目标无论在哪条路径下都不会被触发,PE将过滤它们;否则,相应的错误目标可能在某些路径上被触发,那么PE会将它们归类为可能触发的,然后把它们放到一个切片标准工作集中(该工作集在第2.4节进行介绍);
3) 最后,切片标准工作集中的每个元素都会被Minerva选择作为切片种子进行程序切片,然后在切片后的结果程序上实施路径敏感的检测.
通过潜在错误语句分类和仅在必要的程序切片结果上实施路径敏感的检测,我们可以避免因为采用统一的路径敏感检测方法处理所有错误目标而产生的不必要开销.
图3Fig. 3Fig. 3 Minerva detection framework图 3 Minerva检测框架
2.3FAL值计算及场景分类
Minerva利用PE在错误属性格值计算与传播的过程中找出所有的错误目标.FAL值计算由两部分组成:过程间基于摘要的上下文敏感的FAL值计算和过程内的流敏感和域敏感的FAL值计算.
过程间FAL值计算是一个两遍的、基于摘要的上下文敏感的计算过程.给定一个函数,为了使过程间FAL值的计算更加准确,我们将函数的输入和输出参数分别建模为引用输入(Use_In)和定值输出(Def_Out).其中,引用输入用于建模函数的输入参数,通常包括形式参数和全局量.定值输出用于建模函数的输出参数,通常包括返回值和函数的副作用.过程间上下文敏感的FAL值计算由3部分组成:将调用点处上下文错误属性格值传入给引用输入(Map(ActualIn_VAL(cs),Use_In(cs)))、函数体内的格值计算(Intra_Compute(fcs_callee))以及将定值输出的错误属性格值传出给主调函数中调用点处(Map(DefOut_VAL(cs),Actual_Out(cs))).其中,ActualIn_ VAL(cs)是在调用点cs处传入函数fcs_callee的错误属性格值,Use_In(cs)是fcs_callee的引用输入,DefOut_VAL(cs)是在调用点cs由函数fcs_callee传出的错误属性格值,Actual_Out(cs)是在调用点cs处被函数fcs_callee返回值修改的变量或在函数fcs_callee中修改的全局量.Map(VAL,V)表示将错误属性格值集合VAL中的元素映射到变量集合V中对应变量.过程内FAL值计算Intra_Compute(f)是流敏感和域敏感的,计算过程基于SSA(静态单赋值)形式对函数中的语句逐条进行遍历.
错误目标触发场景分类算法
错误目标的场景分类在FAL值的计算与传播过程中完成.如果一个引用点被发现具有不安全的FAL值, PE将会进一步判定其是否为一定不安全或可能不安全的FAL值.如果它是一定不安全的FAL值,Minerva将会标识其为一定触发的错误目标,然后报告错误.否则,PE会继续判断它是否是一定不触发的,这种判定在USTSG上完成.PE会进行一定不触发的模式识别.图 2(b)描述了常见的一定不触发模式,它们通常由一条检查语句和一个SCF构成.
图 4相应给出了图 2(b)中GoSpecialProcess()可能出现的一些情形:根据改变控制流的方式,分为直接改变控制流和间接改变控制流两类,前者常常直接执行return或exit,而后者通常将控制流改变语句包含在一个包装(wrapper)函数或宏中.图 5给出了实际程序中为避免空指针引用或缓冲区溢出错误程序员编写的一些检查语句和SCF代码片段,其中,图 5(a)、图 5(b)是针对空指针引用而写的代码,图 5(a)在指针变量b为空指针时,会启用宏YY_FATAL_ERROR进行正常控制流改变;而图 5(b)在ap_server_root_relative函数的返回值为空时,直接return以改变正常的程序控制流.图 5(c)则是为了防止缓冲区溢出所编写的一些处理代码,其中,程序员通过条件t==tag+tagbuf_len来判断是否到达了缓冲区边界,如果到达就提前终止控制流以避免其后可能发生的缓冲区溢出错误.
图4Fig. 4 Fig. 4 Typical form of GoSpecialProcess()图 4 GoSpecialProcess()的常见形式
图5Fig. 5Fig. 5 SCF code segments example 图 5 实际SCF代码片段示例
为了更进一步验证危险值判断现象存在的普遍性,我们调研和分析了大量的实际应用程序源码(超过18000KLOC),包括OpenSSH,Wireshark,Linux-kernel等.结果发现,在我们的统计用例中,约每1 000行就有8行的空指针引用检查语句和6行的缓冲区溢出下标范围检查语句.具体的统计数据参见表 1.
表 1(Table 1)
Table 1 The number of unsafe value checking statements 表 1 危险值检查语句数统计
规模(KLOC)
危险值检查语句数
缓冲区溢出
Linux-Kernal
Table 1 The number of unsafe value checking statements 表 1 危险值检查语句数统计
在此值得一提的是,许多研究者在他们的研究中加入了对程序特征的考虑,例如在Ngo等人[]的研究中,他们通过识别具有不同特征的4种模式来识别不可行的路径.在本文中,我们将对特殊的程序特征的考虑加入到了错误检测的工作中.
算法1给出了进行场景分类的算法,该算法在分类的同时检测一定触发的错误目标并识别一定不触发的错误目标.该算法通过区分不安全的FAL值的属性来完成场景分类.一般地,一定不触发的错误目标的识别方法是在USTSG中检查一个给定错误目标相对于错误源的所有控制节点(第7行~第11行),且只关注与错误相关的条件,例如寻找是否存在如图 2(b)所示的检查语句.如果存在,则继续查找是否存在SCF.如果SCF也被找到了,那么当前的错误目标将会排除,因为它是一个一定不触发的错误目标(第8行~第10行).否则,检查下一个控制节点以继续寻找检查语句和SCF.如果在所有的控制节点中都没有发现检查语句和SCF,那么就将当前错误目标标识为可能触发的.在算法1中,我们将可能触发的错误目标及其错误源一并放入切片标准工作集中(第12行~第14行).
算法1. 错误目标的检测与排除.
1.& Procedure Detection_and_Exclusion(f)
2.&&& For each s in f
3.&&&&& If (s中的一个引用点具有不安全的FAL值) Then
4.&&&&&&& If (FAL值具有一定不安全属性) Then
5.&&&&&&&&& 报告该错误;
6.&&&&&&& Else
7.&&&&&&&&& For
each s的控制节点
8.&&&&&&&&&&& If (检查语句和SCF成功匹配) Then
9.&&&&&&&&&&&&& 过滤当前引用点;
10.&&&&&&&&&& End
11.&&&&&&&& End
12.&&&&&&&& If (在所有控制节点中均没有成功匹配) Then
13.&&&&&&&&&& 将当前引用点及其定值点加入到一个切片标准工作集中;
14. &&&&&&&&End
15.&&&&&& End
16.&&&& End
2.4 可能触发错误的检测
对于算法1所生成的包含所有可能触发的错误目标的工作集,需要使用路径敏感的信息进行判定.为了有效降低路径敏感的检测开销,在实施路径敏感检测前,先进行以可能触发的错误目标为切片种子的程序切片以获得最小的路径敏感检测输入集.可能触发的错误目标程序切片由两个阶段组成:一个是准备阶段,在该阶段,PE收集所有可能触发的错误目标,为路径敏感检测阶段做准备;另一个是路径敏感检测阶段,为了缩小检测范围,我们仅对错误目标工作集中的可能触发的错误目标而不是程序中所有的潜在错误语句进行路径敏感的检测.并且对于切片标准工作集中的每一个错误目标,我们也不是在全程序范围内进行检查,而是仅检查那些与该错误目标及相应错误源相关的语句.上述两种做法可以极大地减小路径敏感检测的输入集.
需要指出的是,对于可能触发的错误检测,我们依据控制流图(CFG)和SSA上的值流信息就可以进行切片,没有必要再去构造程序依赖图(PDG),这样可以进一步减少开销.
可能触发错误目标切片(trigger-unknown sink slicing,简称TUSS)
为了提取那些可能影响错误源、被错误源影响以及影响错误目标的语句,在算法2中,我们首先对错误目标实施后向切片获得语句集合SBT,随后对错误源实施前向切片得到语句集合SFS,之后求这两个集合的交集STS.然后对错误源实施后向切片,最后将其结果与STS求并集,所得结果即为所求.该算法中,DoBackSlicing(x,y)表示以y为切片标准对x实施后向切片,DoForwardSlicing(x,y)表示以y为标准对x实施前向切片.
集合Spath-sensitive-detection是TUSS算法的输出,该集合是针对错误检测而言处于可能触发状态的潜在错误语句最相关的语句集合,在后面的工作中我们将对它们实施路径敏感的检测,换言之,该集合是Minerva中路径敏感检测部分的输入.
算法2. 可能触发错误目标制导切片.
1.& Procedure TUSS(P,WorksetSlicingCriteria)
each (Ssource,Ssink) in WorksetSlicingCriteria
3.&&&&& SBT?DoBackSlicing(P,Ssink)
4.&&&&& SFS?DoForwardSlicing(P,Ssource)
5.&&&&& STS?SBT?SFS
6.&&&&& SBS?DoBackSlicing(P,Ssource)
7.&&&&& STB?STS?SBS
8.&&&&& Spath-sensitive-detection?STB
9.&&& End for
2.5 达到高可扩展性的原因
1) 区分不同的错误目标触发场景,并基于潜在错误语句分类.
我们的检测策略采用不同开销的路径不敏感和路径敏感的检测方法组合,对于一定触发或一定不触发的错误目标,我们使用低开销的路径不敏感的方法进行检测和识别.仅对可能触发的错误目标,才采用路径敏感的检测方法,并通过TUSS有效控制开销.
2) 使用多项式时间的FAL值计算和传播算法实现对一定触发的错误目标的检测和一定不触发的错误目标的识别.
一方面,过程内算法迭代地计算FAL相关语句的格值,且算法必定在有限格高度内终止;另一方面,过程间算法基于精确的引用输入和定值输出函数副作用建模,实现了高效的过程间多项式时间、上下文敏感的FAL值计算.
3) 仅对可能触发的错误目标进行路径敏感的检测.
选择此类错误目标而不是传统的所有潜在错误语句作为切片种子,然后运用可能触发的错误目标的程序切片(TUSS)提取最小的路径敏感输入语句集合.
3 场景敏感检测效益分析
本文提出的场景敏感错误检测方法通过组合路径不敏感和路径敏感的检测方法达到错误检测高检测精度和高可扩展性的目标.对于静态检测而言,路径敏感的方法通常检测精度高,但可扩展性不理想;而路径不敏感的方法往往可扩展性好,但对于其有效范围外的情形检测精度不理想.我们认为,要想达到高效高精度的检测目的,不仅应考虑路径敏感部分的改进,还应考虑极大化实施路径不敏感检测的程序部分的比例,即:为了获得高检测精度,需要利用路径敏感的检测方法;而为了获得高可扩展性,则应同时考虑充分挖掘路径不敏感检测的有效范围,以相应缩小路径敏感的检测范围.
3.1 不同路径敏感检测方法的复杂度比较
设程序中最长静态路径与程序规模成正比或近正比关系,路径敏感算法分析程序x中一条路径的平均分析复杂度记为O(h(LxV)).其中,L为程序x的规模,V为该路径敏感分析中变量的抽象值域.在下面的讨论中,由于我们所关注的路径敏感分析的抽象值域均为变量的原值域,因此可将该复杂度简记为O(g(L)).
(1) 令Loriginal为原始程序规模,Lsliced为危险语句切片后程序规模,Lpe为可能触发错误目标切片后的程序规模,那么O(g(Loriginal))表示危险语句切片前对于一条程序路径的平均分析复杂度,O(g(Lsliced))表示危险语句切片后对于一条路径的平均分析复杂度.
(2) 令Noriginal_branch为原始程序的分支数,其中,传播引擎处理的路径不敏感分析有效范围内的分支数表示为N1,传播引擎分析的可能触发错误目标有关的分支数表示为N2.P表示原始程序,P1表示传播引擎处理的路径不敏感分析的有效范围,P2表示传播引擎不能有效处理的部分,有P2=P-P1.所以N2=Noriginal_branch-N1.
Nsliced_branch表示危险语句切片后的分支数,有N2≤Nsliced_branch.记原始程序的路径数为,危险语句切片后的路径数为,可能触发错误目标切片后的路径数为O(2N2).
基于上述表示,对于传统的全程序实施路径敏感分析的方法,其复杂度为;对于实施危险语句切片后再实施路径敏感分析的方法[, ],其复杂度为;本文提出的针对可能触发错误实施路径敏感分析的方法,其复杂度为O(g(Lsliced)x2N2).因为Loriginal≥Lsliced,Noriginal_branch≥Nsliced_branch,并且Lsliced≥Lpe,Nsliced_branch≥N2,因此有:
因为N2=Noriginal_branch-N1,则N1越大,N2就越小.这说明路径不敏感分析的有效范围越大,路径敏感分析的复杂度就越小.因此,在不能降低路径敏感分析算法指数级复杂度的情况下,减少需要分析的路径数是一种使算法实用化的有效途径.
3.2 检测效益分析
由于静态检测方法存在检测精度和可扩展性两方面的要求,为了进一步刻画两者之间的关系并进一步研究静态检测方法的效益,我们基于F-衡量[]给出采用路径敏感分析的检测方法的检测效益模型.F-衡量用于对两个参数求加权调和平均.在本文中,F-衡量的两个参数定义如下:
假设理想的路径敏感检测精度为Aideal,复杂度为Cideal.一个实际的路径敏感检测方法精度为A,复杂度为C.用RA表示实际的路径敏感检测方法的检测精度与理想的路径敏感检测精度的接近情况,令RA=A/Aideal,有RA≤1.一般情况下,RA值越大越好.用RC表示实际的路径敏感检测方法的复杂度与理想的路径敏感检测方法复杂度的接近情况,令RC=1-C/Cideal,RC≤1.一般地,在小于理想路径敏感检测方法复杂度的情况下,差距越大越好.
定义检测效益模型FBenefit如下:
其中,,a&I[0,1],a表示RA和RC被重视的权重.假设a=1/2,那么b=1,即RA和RC同等重要,此时,
在检测精度相当的情况下,如果方法1与理想路径敏感检测方法的复杂度差距比方法2与理想路径敏感检测方法的复杂度的差距大的话,那么方法1将获得比方法2更大的效益.
3.3 有效性分析
在本文提出的协调路径不敏感与路径敏感分析的检测方案中,路径不敏感检测算法的部分是保守的,可以确定一定存在问题的部分.在理论上,全程序路径敏感的检测方法也会发现这部分.而对于路径不敏感方法不能确定的部分,会由路径敏感的检测方法处理.对于这部分,在理论上与全程序路径敏感检测方法的结果相同,因此,本文方法的检测精度与全程序路径敏感方法的检测精度在理论上是相当的.
一般地,考虑两种实际的路径敏感检测方法A和B,计算,若结果大于1,则表明方法A相比方法B能够获得更大的效益.以本文方法与传统的全程序实施路径敏感分析的方法为例,假设本文方法的检测精度为Ape,复杂度为Cpe,那么RApe=Ape/Aideal,RCpe=1-Cpe/Cideal;传统的全程序实施路径敏感分析方法的检测精度为Aoriginal,复杂度为Coriginal,那么RAoriginal=Aoriginal/Aideal,RCoriginal=1-Coriginal/Cideal,有:
将RApe,RCpe,RAoriginal及RCoriginal代入公式(1),当Ape&Aoriginal时,公式(1)变为
其中,X=(CidealxCideal-CidealxCoriginal-CpexCideal+CpexCoriginal)xAideal.
由于Cpe≤Coriginal,所以(Cideal-Cpe)≥(Cideal-Coriginal),而AoriginalxCideal&ApexCideal,因此有,即FBenefit_pe≥FBenefit_original.该分析结果表明,本文方法与传统的全程序实施路径敏感分析的方法相比,在检测精度相当的情况下能够获得更大的效益.
4.1 传播引擎(PE)
结合定值-引用类错误的特征进行考虑,我们使用错误属性格建模错误属性为FAL值.图 6(a)给出了空指针引用错误检测的FAL的哈斯图[],其中,FAL值UNNULL是安全的错误属性值,NULL和MAYNULL是不安全的错误属性值.且FAL值NULL具有一定不安全属性,MAYNULL具有可能不安全属性.这样的FAL值分类可以帮助我们在实施错误检测的过程中有效区分一定触发和非一定触发的错误目标,其中,后者进一步划分为一定不触发和可能触发两种.
除空指针引用错误外,传播引擎还可支持其他多种具体的定值-引用类错误的检测,包括未赋值引用错误、非法指针引用错误等.对于这些错误,PE只需根据不同的定值情形进行不同的错误属性格值设置即可.以未赋值引用错误为例,其哈斯图如图 6(b)所示,可在检测前将所有变量的错误属性格值设为表示未赋值状态的格值,如UNDEFINED.对于存在定值的变量,其错误属性格值设为表示已定值的格值,那么当引用一个变量时,PE将检查该变量的错误属性格值,若为表示未赋值状态的格值,即报告错误.此外,对于内存泄漏、内存两次释放、文件打开关闭等具有时序特征的错误也可有效进行错误属性格建模并实施检测.以内存泄漏和内存两次释放为例,我们在图 6(c)中给出它们的错误属性格值模型的哈斯图.在程序出口处,若变量的FAL值为MALLOC,则表明存在内存泄漏;而在变量引用点,若变量的FAL值为DOUBLEFREE,则表明存在内存两次释放.基于该错误属性格值模型及相应的错误属性格值计算规则,可以完成内存泄漏及内存两次释放错误的检测.
图6Fig. 6Fig. 6 FAL Hasse diagrams of typical faults图 6 几种典型错误的FAL哈斯图
4.2 面向高检测精度的编译基础设施支持
为了获得高检测精度,我们在Open64中进行了如下扩展:
1) 基于全稀疏的SSA[]和域模型[]对保守的程序分析进行了流敏感、域敏感和上下文敏感的扩展;
2) 通过构造精确的引用输入和定值输出函数副作用模型实现了准确的过程间副作用分析;
3) 内置精确、高可扩展的指针分析LevPA[],将流敏感、域敏感和上下文敏感的指针分析与SSA形式的构造相结合.LevPA会在指针分析过程中为每个变量构造扩展的SSA表示,从而获得更准确和简洁的SSA形式,消除虚假的引用-定值点,提高定值-引用分析的精度和效率;
4) 提供流敏感、域敏感和上下文敏感的静态程序切片支持.
5.1 实验环境与测试程序
我们的实验平台为AMD Opteron六核CPU服务器,主频2.11GHz,内存48GB.所有实验以单进程方式进行.同时,还选择Saturn和Clang-sa作为比较工具,因为它们都是有代表性的先进水平的路径敏感检测工具.同时,目前在路径敏感检测部分,我们使用Saturn去判定一个可能触发的错误目标是否是一个真实的错误.即:如果Saturn报告该可能触发的错误目标为错误,即认为它是一个真实的错误;否则,认为是Minerva的一个误报.在空指针检测实验中,我们直接使用Saturn 1.2版本提供的null.clp检测文件收集Saturn报告的空指针错误.
我们选择了9个SPEC CPU2000的C程序以及3个中大型规模的开源应用:OpenSSH[],Apache[]和Wireshark[]作为实验用例程序.这些程序应用范围广泛,包括网络应用、数据压缩算法、ICCAD设计、游戏、字处理以及网络协议分析等.总代码规模超过了290万行,其中最大的单个应用超过了200万行.
5.2 检测结果与分析
不同触发场景的分类比例
Minerva的主要创新性在于对潜在错误语句进行分类,然后对不同类别的错误目标使用不同开销的错误检测方法.因此,Minerva的有效性在很大程度上受到所检测程序中不同类别潜在错误语句比例的影响.
对此,基于Minerva,Clang-sa和Saturn所产生的错误报告情况我们对每个实验程序中不同类别的错误目标数量进行了统计,结果如图 7所示.统计数据来自8个程序,之所以没有选择全部实验程序,是因为对于另外4个实验程序,所有检测工具均没有找到空指针引用错误.在所观察的8个程序中我们发现,在255.vortex,OpenSSH和Wireshark中,一定触发和一定不触发错误目标所占比例的和超过了90%,如此高的非可能触发错误目标比例可以使Minerva路径不敏感检测部分发挥很大的作用.
图7Fig. 7Fig. 7 Different sink-triggering categories composition of 8 benchmarks图 7 8个测试用例中不同触发种类错误目标的组成
图8Fig. 8Fig. 8 Percentages of sink-triggering categories across 8 benchmarks图 8 8个测试用例中各种错误目标的比例
我们还计算了全部8个实验程序中一定触发、一定不触发和可能触发的错误目标的总比例,并在图 8中进行了显示.
对数据进行观察后不难发现,在这8个程序中,只有6%的错误目标是可能触发的,其余错误目标或者是一定触发的或者是一定不触发的.一方面,这表明Minerva具备高可扩展性的潜质:PE可以快速地处理那些非可能触发的错误目标;另一方面,通过识别大量的一定不触发的错误目标,PE可以消除数量可观的误报,而这可以保证高检测精度.
Minerva的检测时间由两部分组成:一是PE的处理时间,包括检测一定触发和识别一定不触发的错误目标的时间,以及收集可能触发的错误目标的时间;二是对可能触发的错误目标进行路径敏感检测的时间,这部分时间由TUSS时间和路径敏感工具的检测时间组成.
表 2中列举了相关实验数据,其中:P.S列表示路径敏感的检测时间,包含TUSS的时间;Total列表示Minerva所用的总时间.通过将Total和P.S列中的时间值相减,我们可以得到PE的工作时间.
表 2(Table 2)
Table 2 Null pointer dereference detection time comparison
表 2 空指针引用错误检测时间比较
ammp (188)
bzip2 (256)
crafty (186)
equake (183)
gzip (164)
parser (197)
votex (255)
openssh-4.3p2
apache-2.2.4
wireshark-1.2.2
Table 2 Null pointer dereference detection time comparison
表 2 空指针引用错误检测时间比较
Saturn的检测时间通常较长,这主要是因为它需要对程序中的各条路径进行路径敏感的分析.Clang-sa则需要探索路径可行状态,在他们的方法中,路径可行状态用于引导Clang-sa在实施检测时探索可行路径.为了加快检测速度,Clang-sa仅处理一些简单的分支条件,例如,它会忽略超过一个变量的条件表达式.但即便如此,对于大规模的应用程序检测而言,Clang-sa需要探索的空间仍会比较可观.
相对地,Minerva的工作速度通常很快,因为大部分程序中需要进行路径敏感检测的错误目标较少;与此同时,PE实施分类的时间也很短.举例来说,对OpenSSH进行空指针引用错误检测时,由于没有错误目标需要进行路径敏感的检测,所以Minerva仅花费了57s便完成了检测.
此外,我们还将Saturn,Clang-sa和Minerva检测全部12个程序的时间进行了比较,包括那些没有报告错误的程序.图 9给出了比较结果.需要说明的是,在该图中,为了更好地显示时间差异很大的3种工具的检测时间,我们将标注时间的Y轴的最大值设为3 000s;同时,对那些Saturn不能完成分析的情形,我们也将其检测时间标为3 000s.
在检测时间的基础上,我们进一步计算了3种工具的检测速度,其中,Clang-sa的平均检测速度约为每秒338行,Saturn的平均检测速度约为每秒25行,Minerva的平均检测速度约为每秒1 169行.Minerva的平均检测速度比Saturn和Clang-sa分别快了约46倍和3倍.Minerva在高检测速度主要得益于大比例的一定触发和一定不触发的错误目标(超过了90%).对这些目标,Minerva仅应用低开销的路径不敏感检测方法即完成了检测.而相对地,只有不超过10%的可能触发的错误目标采用了路径敏感的检测方法.
为了更好地进行比较,我们以空指针引用错误检测为例,将3种工具的检测结果在表 3中进行了呈现.对于Clang-sa,其检测精度上的损失原因主要是:一方面是它没有区分不同的错误触发场景,尤其是没能识别一定不触发的错误目标,产生了大量的误报;另一方面,是因为它仅对有限形式的分支条件进行处理,所以可能将不可行路径视为可行路径.Saturn由于没有处理复杂的错误目标触发场景,同样存在与Clang-sa类似的误报原因;另一方面,因为没有区分复杂的场景导致需要分析的程序部分多且复杂,它也常常不能完成检测.上述两个原因使得Saturn的检测精度低于Minerva.
图9Fig. 9Fig. 9 Detection time of Saturn, Clang-sa and Minerva图 9 Saturn,Clang-sa和Minerva的检测时间
表 3(Table 3)
Table 3 Null pointer dereference detection results comparison 表 3 空指针引用错误检测结果比较
ammp (188)
bzip2 (256)
crafty (186)
equake (183)
gzip (164)
parser (197)
votex (255)
openssh-4.3p2
apache-2.2.4
wireshark-1.2.2
Table 3 Null pointer dereference detection results comparison 表 3 空指针引用错误检测结果比较
此外,我们还计算了所有工具的平均误报率和相对漏报率,结果参见表 4.其中,相对漏报主要是指相对于其他两个工具统计一个工具的漏报数.对于本文所用的实验用例,Saturn和Clang-sa的误报率都表现较高,特别是Clang-sa,其误报率高达84%,这主要是因为实验用例中存在大量的SCF而Clang-sa不能识别.
表 4(Table 4)
Table 4 Average false positive and relative false negative rate
表 4 平均误报率和相对漏报率
Saturn (%)
Clang-sa (%)
Minerva (%)
相对漏报率
Table 4 Average false positive and relative false negative rate
表 4 平均误报率和相对漏报率
Saturn和Clang-sa的相对漏报率也不理想,这主要表现为它们的过程间分析尚不完善,如未能识别全局量的相关错误,并且它们也未能识别特殊库函数的不安全返回值,如内存分配、字符串处理等可能返回NULL的函数,从而导致了漏报.比如在186.crafty中,Saturn和Clang-sa的漏报主要就是因为这个原因.
综上,对于本文所用的实验用例,Minerva的平均误报率为24%,约为Saturn和Clang-sa的1/3,且没有漏报已知错误.这样的表现主要与下列因素相关:1) 通过识别一定不触发的错误目标,消除了大量潜在的误报;2) 精确的程序分析基础设施支持;3) 精确的过程间副作用建模.
6 相关工作
(1) 路径敏感的错误检测
近年来,出现了不少路径敏感的错误检测研究工作.Xie等人[]提出了ARCHER,它是一个符号的、路径敏感的检测内存错误的工具.ARCHER对每个内存访问点的访问约束进行分析,因此需要对每条可能的执行路径进行穷尽分析.Aiken等人[, ]将一个程序基于可满足性求解框架进行建模,然后实施检测.他们的模型是精确的,但遭遇大规模程序时,条件的表示和约束求解会变得非常复杂.Das等人[]在程序中对分支的属性相关行为进行建模,以避免完全路径敏感分析潜在的指数级开销.他们在控制流汇合点处对相同的属性状态进行合并,这意味着若属性状态不同,他们仍需对每条路径进行路径敏感的分析.Kremenek等人[]利用编译器框架去寻找典型的程序错误,并在不同的执行路径上探索可行符号执行状态.所有上述这些方法,因为使用了路径敏感,在精度上都有一定的保证,然而可扩展性并不理想.与他们不同的是,Minerva从扩大路径不敏感检测有效范围的角度出发,通过对不同的代码区域使用不同开销的检测方法,避免了统一路径敏感方法存在的大量冗余开销,不仅获得了高可扩展性,还保证了高检测精度.
(2) 需求驱动的错误检测
为了处理路径敏感分析的大开销问题,需求驱动的策略常被采用.Nanda等人[]执行后向需求驱动分析去识别有不安全值流向错误引用点的路径,以避免穷尽的程序空间探索.但是,由于需要在每条解引用语句上去执行后向的分析,他们的方法需要分析的路径数仍然很大.Parfait[]是Sun开发的一个静态的、分层的程序分析检测框架,他们利用一组不同的程序分析实施错误检测.为了控制开销,Parfait选择低开销的简单的程序分析解析那些容易检测的错误,而对那些复杂错误才应用开销较大的程序分析.以缓冲区溢出错误检测为例,他们分别应用常量传播与折叠、部分计算以及关联约束的符号分析去完成检测.Le等人[]提出了一种借助需求驱动的路径敏感分析提炼缓冲区溢出错误检测的方法和框架——Marple[],其中,需求被建模为一组对兴趣语句的查询,错误的检测基于提出、传播、更新以及求解查询完成.上述方法都使用了需求驱动的路径敏感方法去减少总开销,但他们仅排除了与错误无关的路径,仍留有大量与错误有关的路径需要分析.而Minerva通过不同错误触发类别的划分,首先排除错误相关路径中一定不触发的路径,然后仅对可能触发的错误目标实施路径敏感的检测,并在检测前采用可能触发错误目标制导的切片策略,进一步缩小路径敏感检测部分的输入.例如,对于我们的实验用例,传统的以潜在错误语句为种子的切片方法去除了约82%的路径数,而基于可能触发错误制导的切片方法则去除了约98%的路径数.
(3) 基于值流分析的检测
有一些方法使用值流分析去检测错误.Cherem等人[]提出了Fastcheck,一个基于值流分析的错误检测工具.它为整个程序构造一个值流图,并在该图上执行部分路径敏感的检测.Sui等人[]基于全稀疏值流分析实现了一个内存泄漏检查器SABER.他们为程序构造稀疏的值流图(SVFG),然后,基于该图去执行内存泄漏检查.与上述方法不同的是,Minerva是沿着定值-引用链去追踪FAL值以寻找危险的错误目标.
将静态分析应用于错误检测,是程序语言和编译技术以及软件工程领域的一个重要研究方向[].围绕静态检测精度与效率的目标,张阳等人[]在传统源代码安全属性验证工具基础上加入指针逻辑,利用指针逻辑对源码的分析结果,对源代码中的指针进行替换,加强了静态代码属性验证工具的指针处理功能.陈意云等人[]改进并扩展了为验证指针程序提出的指针逻辑,提出合法访问路径集合的概念,使指针逻辑能够更方便地应用于函数调用.肖庆等人[]采用抽象取值范围表示变量的取值信息,计算每个程序位置上状态机的可能属性状态集合,用变量抽象取值范围为空表示不可达路径.赵云山等人[]利用基于缺陷的程序切片方法去除缺陷无关节点,减少路径敏感分析方法的误报,同时提高缺陷检测效率.崔展齐等人[]提出一种结合静态分析和混合执行测试技术的目标制导的混合执行测试方法,将静态分析检测与测试技术相结合,发现程序中的缺陷.此外,形式化方法作为计算机系统及软件验证的重要途径之一,也为高可信软件提供了重要支持[].
7 结论与展望
本文提出一种高效的场景敏感的定值-引用类错误检测方法,该方法基于对潜在错误语句的分类进行检测.本文方法充分考虑不同的错误目标触发场景,然后基于不同的错误目标触发情形,组合具有合适精度和开销的不同检测方法,达到高可扩展性和高精度的检测目标.本文为上述方法实现了一个原型系统Minerva,并将其运用到广泛应用的、总代码规模超过290万行的实际程序中.通过以空指针引用错误检测为实例研究,本文的实验用例结果表明,Minerva的检测时间比已有的先进水平的检测工具Clang-sa和Saturn平均快了约3倍和46倍,且误报率仅为24%,约为Clang-sa和Saturn误报率的1/3,并且没有发现漏报已知错误.所有这些数据表明, Minerva的场景敏感的检测方法是一种高效、准确、实用的错误检测方法.
Larson E. A plethora of paths. In: Proc. of the 17th IEEE Int’l Conf. on Program Comprehension. IEEE Press, .
Kremenek T. Finding software bugs with the clang static anayzer. Apple Inc., 2008. .
Nanda MG, Sinha S. Accurate interprocedural null-dereference analysis for Java. In: Proc. of the 31st Int’l Conf. on Software Engineering. ACM Press, 3.
Das M, Lerner S, Seigle M. ESP: Path-Sensitive program verification in poly-nomial time. In: Proc. of the ACM SIGPLAN Conf. on Programming Language Design and Implementation. .
Cifuentes C, Scholz B. Parfait: Designing a scalable bug checker. In: Proc. of the 2008 Workshop on Static Analysis. .
Le W, Soffa ML. Refining buffer overflow detection via demand-driven path-sensitive analysis. In: Proc. of the 7th ACM SIGPLAN-SIGSOFT Workshop on Program Analysis for Software Tools and Engineering. .
Le W, Soffa ML. Marple: A demand-driven path-sensitive buffer overflow detector. In: Proc. of the 16th ACM SIGSOFT Int’l Symp. on Foundations of Software Engineering..
Wireshark.
Aho AV, Lam MS, Sethi R, Ullman JD. Compilers: Principles, Techniques and Tools. 2nd ed., Amazon Press, 0.
Ngo MN, Tan HBK. Detecting large number of infeasible paths through recognizing their patterns. In: Proc. of the 15th ACM SIGSOFT Int’l Symp. on Foundations of Software Engineering. .
Manning CD, Raghavan P, Schutze H. Introduction to Information Retrieval. Cambridge University Press, 0.
Pemmaraju S, Skiena S. Computational Discrete Mathematics: Combinatorics and Graph Theory with Mathematica. Cambridge University Press, 2.
Sui YL, Ye D, Xue JL. Static memory leak detection using full-sparse value-flow analysis. In: Proc. of the Int’l Symp. on Software Testing and Analysis. .
Yu HT, Zhang ZQ. An aggressively field-sensitive unification-based pointer analysis. Chinese Journal of Computers, ):
(in Chinese with English abstract).
Yu HT, Xue JL, Huo W, Feng XB, Zhang ZQ,. Level by level: Making flow- and context-sensitive pointer analysis scalable for millions of lines of code. In: Proc. of the 8th Annual IEEE/ACM Int’l Symp. on Code Generation and Optimization. .
Xie YC, Chou A, Engler D. ARCHER: Using symbolic, path-sensitive analysis to detect memory access errors. In: Proc. of the 11th ACM SIGSOFT Int’l Symp. on Foundations of Software Engineering. .
Aiken A, Bugrara S, Dillig I, Dillig T, Hackett B, Hawkins P. An overview of the Saturn project. In: Proc. of the 7th ACM SIGPLAN-SIGSOFT Workshop on Program Analysis for Software Tools and Engineering. .
Dillig I, Dilig T, Aiken A. Sound, complete and scalable path-sensitive analysis. In: Proc. of ACM SIGPLAN Conf. on Programming Language Design and Implementation. .
Cherem S, Princehouse L, Rugina R. Practical memory leak detection using guarded value-flow analysis. In: Proc. of the ACM SIGPLAN Conf. on Programming Language Design and Implementation. .
Zhang J. Sharp static analysis of programs. Chinese Journal of Computers, ): (in Chinese with English abstract).
Zhang Y, Cheng L. A new property verification method for code security based on pointer logic..
Chen YY, Li ZP, Wang ZF, Hua BJ. Pointer logic for verification of pointer programs. Ruan Jian Xue Bao/Journal of Software, ):415-426 (in Chinese with English abstract).
Xiao Q, Gong YZ, Yang ZH, Jin DH, Wang YW. Path sensitive static defect detecting method. Ruan Jian Xue Bao/Journal of Software, ):209-217 (in Chinese with English abstract).
Zhao YS, Gong YZ, Li L, Xiao Q, Yang ZH. Improving the efficiency and accuracy of path-sensitive defect detecting..
Cui ZQ, Wang LZ, Li XD. Target-directed concolic testing..
Wang J, Li XD. Preface to special issue on formal methods and tools. Ruan Jian Xue Bao/Journal of Software, ): (in Chinese with English abstract).
于洪涛,张兆庆.激进域敏感基于合并的指针分析.计算机学报,):.
张健.精确的程序静态分析.计算机学报,):.
张阳,程亮.一种基于指针逻辑的代码安全属性分析方法..
陈意云,李兆鹏,王志芳,华保健.一种用于指针程序验证的指针逻辑.软件学报,):415-426.
肖庆,宫云战,杨朝红,金大海,王雅文.一种路径敏感的静态缺陷检测方法.软件学报,):209-217.
赵云山,宫云战,刘莉,肖庆,杨朝红.提高路径敏感缺陷检测方法的效率及精度研究..
崔展齐,王林章,李宣东.一种目标制导的混合执行测试方法..
王戟,李宣东.形式化方法与工具专刊前言.软件学报,):.

我要回帖

更多关于 oracle 误修改数据 的文章

 

随机推荐