程序静态分析的分析技术及实践

作者&投稿:芝齐 (若有异议请与网页底部的电邮联系)
程序静态分析的介绍~

程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。目前静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。目前的静态分析工具,无论从科研角度还是实用性角度还有很大的提高余地,国际最好分析工具误报率在5-10%之间,能够报出的缺陷种类也仅有几百种。我国较好静态分析工具较少,一些高校正在致力于在此方面的研究和开发(成果较突出的如北京大学等)目前来看与国外还有差距。

Meta-Compilation(Coverity)由Stanford大学的Dawson Engler副教授等研究开发,该静态分析工具允许用户使用一种称作metal的状态机语言编写自定义的时序规则,从而实现了静态分析工具的可扩展性。MC的实际效果非常优秀,号称在Linux内核中找出来数百个安全漏洞。MC目前已经商业化,属于Coverity Inc.2014年被Synopsys收购。目前学术领域比较认可的静态分析工具,其技术处于领先地位。mygcc 由一个法国人N. Volanschi开发,其思想来源于MC,试图将自定义的错误检测集成到编译时。Klocwork国内用的最为广泛的静态分析工具,由加拿大北电于1996年研发,是中国最早的能够检测语义缺陷的静态分析工具。截止到2015年其版本号为V10,也就是大家常说的K10LDRA Testbed英国的编码规则类检测工具,前身为Liverpool大学开发,能够支持C/C++数千种条目的规则检测,包括MISRA C/C++, GJB5369等,是最早进入中国市场的静态分析工具,在军队、军工广泛使用,但其技术仅支持风格类检测,无法进行语义缺陷分析,导致一些常用的运行时缺陷无法发现或者较高误漏报,由此市场占有率逐步下降。截止到2015年其版本号为9.5HP Fortify美国HP公司的支持安全漏洞类的检测工具,能够检测C/C++/Java/PHP/ASP/JavaScript等多种语言,数千种检测项,是国内使用最为广泛的静态分析工具。但该工具整体的误报漏报率较高,虽然支持很多种安全漏洞,但需要用户做很多的二次开发工作。Cobot(库博)北京大学软件工程中心研发的静态分析工具,能够支持编码规则,语义缺陷的程序分析,能够支持C/C++数千条规则和缺陷的检测,是我国唯一可以称的上是静态分析产品的商业化工具。由于其自主知识产权,对国内的操作系统,编码标准支持的较好,检测精度也基本与上述工具持平,所以也得到了很多用户的认可。Parasoft C++Test美国Parasoft公司研发的支持C、C++静态分析的工具,该工具除了可以检测编码规则外,还能检测少量的语义缺陷,此外能够进行测试用例生成。

程序静态分析(Program Static Analysis)可以帮助软件开发人员、质量保证人员查找代码中存在的结构性错误、安全漏洞等问题,从而保证软件的整体质量。还可以用于帮助软件开发人员快速理解文档残缺的大规模软件系统以及系统业务逻辑抽取等系统文档化等领域。 如开发20年以上的金融核心COBOL系统,动辄上千万行代码的系统规模。对于理解这样规模的系统,基于程序静态分析的辅助理解工具就能发挥积极作用。
本文首先对程序静态分析的特点、常用静态分析技术、静态分析实现方式进行描述,然后通过一个实例讲解了程序静态分析的执行过程。 程序静态分析是与程序动态分析相对应的代码分析技术,它通过对代码的自动扫描发现隐含的程序问题,主要具有以下特点:
(1)不实际执行程序。动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码只是通过对代码的静态扫描对程序进行分析。
(2)执行速度快、效率高。目前成熟的代码静态分析工具每秒可扫描上万行代码,相对于动态分析,具有检测速度快、效率高的特点。
(3)误报率较高。代码静态分析是通过对程序扫描找到匹配某种规则模式的代码从而发现代码中存在的问题,例如可以定位strcpy()这样可能存在漏洞的函数,这样有时会造成将一些正确代码定位为缺陷的问题,因此静态分析有时存在误报率较高的缺陷,可结合动态分析方法进行修正。 (1)词法分析:从左至右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token) 流,生成相关符号列表,Lex为常用词法分析工具。
(2)语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树, Yacc为常用工具。
(3)抽象语法树分析:将程序组织成树形结构,树中相关节点代表了程序中的相关代码,目前已有javacc/ Antlra等抽象语法树生成工具。
(4)语义分析:对结构上正确的源程序进行上下文有关性质的审查。
(5)控制流分析:生成有向控制流图,用节点表示基本代码块,节点间的有向边代表控制流路径,反向边表示可能存在的循环;还可生成函数调用关系图,表示函数间的嵌套关系。
(6)数据流分析:对控制流图进行遍历,记录变量的初始化点和引用点,保存切片相关数据信息。
(7)污点分析:基于数据流图判断源代码中哪些变量可能受到攻击,是验证程序输入、识别代码表达缺陷的关键。
(8)无效代码分析,根据控制流图可分析孤立的节点部分为无效代码。
程序静态分析是在不执行程序的情况下对其进行分析的技术,简称为静态分析。而程序动态分析则是另外一种程序分析策略,需要实际执行程序。大多数情况下,静态分析的输入都是源程序代码,只有极少数情况会使用目标代码。静态分析这一术语一般用来形容自动化工具的分析,而人工分析则往往叫做程序理解。
静态分析越来越多地被应用到程序优化、软件错误检测和系统理解领域。Coverity Inc.的软件质量检测产品就是利用静态分析技术进行错误检测的成功代表。国内某软件公司的闪蝶(BlueMropho)代码分析平台,是利用程序静态分析技术专注于大型机遗留系统的代码理解领域,尤其擅长分析千万行代码规模级的COBOL系统。




程序静态分析的著名的静态分析工具
由于其自主知识产权,对国内的操作系统,编码标准支持的较好,检测精度也基本与上述工具持平,所以也得到了很多用户的认可。Parasoft C++Test美国Parasoft公司研发的支持C、C++静态分析的工具,该工具除了可以检测编码规则外,还能检测少量的语义缺陷,此外能够进行测试用例生成。

技术分享 | 浅谈程序分析
静态与动态的交织 程序分析分为静态和动态两大领域,它们关注的都是确保代码的通用正确性。自动定理证明是理论上的圣杯,如Coq和Isabelle等工具能自动验证逻辑证明。然而,将程序正确性转化为逻辑定理需要清晰的表达,这在实际操作中可能需要人工引导,比如提供循环不变量等。抽象解释作为一种强大的分析工具,...

软件工程 静态测试的主要方法有哪些
(1)人工检测:是指不依靠计算机而是靠人工审查程序或评审软件,包括代码检查、静态结构分析和代码质量度量等;(2)计算机辅助静态分析:利用静态分析工具对被测试程序进行特性分析,从程序中提取一些信息,以便检查程序逻辑的各种缺陷和可疑的程序构造。静态测试包括代码检查、静态结构分析、代码质量度量等。它...

什么是程序分析
程序分析 程序分析,是指以整个生产过程为研究对象,研究分析完整的工艺程序,从第一个工作地到最后一个工作地,是否存在多余、重复、不合理的作业,作业顺序是否合理,搬运是否太多,等待是否太长等现象,并制定改进方案的一种分析技术。[1]对计算机程序行为进行自动分析的过程,主要包括静态分析和动态分...

静态测试和动态测试的方法有哪些
2、测试方式不同 静态测试,通过评审文档、阅读代码等方式测试软件称为静态测试,通过运行程序测试软件称为动态测试。3、测试方法不同 静态测试是指不用执行程序的测试,它主要采取方案—代码走查、技术评审、代码审查的方法对软件产品进行测试。动态测试主要通过构造测试实例、执行程序、分析程序的输出结果这...

安全编程代码静态分析目录
第三部分着重讲解了静态分析在Web应用程序、XML与Web服务以及隐私和秘密管理中的独特作用,以及处理具有特权程序的安全策略。这些内容为构建安全的网络应用提供了关键视角。在实践部分,作者提供了针对Java和C语言源代码的分析练习,为读者提供了动手操作和学习的机会。通过实际操作,读者可以更好地理解和掌握...

Fuzz 测试的思路和测试工具有哪些?
在探索软件安全的无尽边界时,Fuzz 测试作为一种强大的静态分析技术,其核心思路是通过随机生成和输入数据来测试系统的边界条件和异常处理能力。今天,我们来深入了解一下Fuzz测试的基本概念,以及其中一款备受推崇的工具——Shazzer(Shared Fuzzer)。Shazzer:在线浏览器解析Fuzzer的魅力<\/Shazzer,以其独特的...

程序静态分析的检查表
- 为每个工具建立自己的目录和classpath变量。由于这些工具大多都使用了相同的开源软件,很容易会因为使用相同软件包的不同版本而相互干扰。这种问题非常隐蔽,在这种问题上花费时间和精力是非常不值得的。通过建立不同的目录和classpath,然后在对应的ant task中引用各自的classpath,可以有效的避免它。- 将...

动态分析包括哪些扫描工具
图形处理软件,显卡扫描软件。程序静态分析是与程序动态分析相对应的代码分析技术,它通过对代码的自动扫描发现隐含的程序问题,主要具有以下特点:(1)不实际执行程序。动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码...

会计中的分析法
②定量分析:是指运用统计技术,考察事物的规定性,从而把握事物性质的一种分析方法。常用的定量分析方法有:比较分析法,时间序列分析法和因果分析法等。③静态分析:它是对已发生的经济活动成果,进行综合性的对比分析的一种分析方法,常用的静态分析法有:相对数分析法、平均数分析法、比较分析法、结构...

抚远县15528737713: 白盒测试有几种方法 -
荆哀益中: 一般可分为:静态分析和动态分析两种方法. 白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试.白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面...

抚远县15528737713: 软件工程 静态测试的主要方法有哪些 -
荆哀益中: 静态分析时,不执行程序,可对需求分析说明书、软件设计说明书、源程序做结构检查、流图分析、符号执行来分析软件可能导致的异常情况,找出软件错误.从测试过程来分:静态分析法、动态测试法;

抚远县15528737713: 几种漏洞发现技术简介 -
荆哀益中: 其中二进制比较技术主要用于漏洞补丁分析,对于未知漏洞作用不大,在 1.1 手工测试 Web应用程序、浏览器及其他需要用户交互的程序. 1.2 静态分析 .静态分析重点检查函数调用及返回状态,特别是未进行边界检查或边界检查不正确的函...

抚远县15528737713: 什么是软件测试的静态分析 -
荆哀益中: 静态分析,是相对动态说的,即不运行程序. 使用的工具主要是你的眼睛,常用在文档测试、白盒测试(代码审查/走查)、UI界面测试

抚远县15528737713: 如何做好app的测试工作 -
荆哀益中: 对于app安全测试,我感觉是工欲善其事,必先利其器了..跟据爱内测介绍,主要有以下三个方式:一、静态分析静态分析主要是利用apktool、dex2jar、jd-gui、smali2dex等静态分析工具对应用进行反编译,并对反编译后的java文件、xml文件...

抚远县15528737713: 如何用静态分析工具分析java script 代码 -
荆哀益中: 所有的这些新的工具使得确保代码质量比以前简单得多,不过您还需要知道如何使用它们. 代码度量 “监视圈复杂度”展示如何使用简单的代码度量工具和基于 Java 的工具来监视代码复杂度. “软件架构的代码质量”解释了如何持续地监视...

抚远县15528737713: 软件测试走查中的静态分析技术中的数据流分析问题 -
荆哀益中: 代码如下: void f1(int *p1, int p2, int p3) { *p1 = p3 - p2; } main() { int a,x,y; printf ("Type in a value for a"); scanf ("%d",&a); printf ("\n"); y = 0; if (x != 0) { f1 (&y,a,x); } printf ("A is %d\n",a); } 对上面代码进行数据流分析,结果如下:变量 x:...

抚远县15528737713: 分析程序软件您觉得通过哪些方式有几种办法可以实现? -
荆哀益中: 方法通过静态分析方式和动态分析方式相结合,实现应用程序行为分析检测.静态分析通过Android的静态反汇编和反编译获取应用程序的源代码和资源配置文件,然后通过检测源代码中是否包含敏感行为特征,实现静态行为分析检测.动态分...

抚远县15528737713: 软件测试工程师考试要考哪些内容 -
荆哀益中: 软件测试工程师考试 分几项考试 都考什么内容的 基本要求: 1.熟悉软件质量、软件测试及软件质量保证的基础知识; 2.掌握代码检查、走查与评审的基本方法和技术; 3.掌握白盒测试和黑盒测试的测试用例的设计原则和方法; 4.掌握单元测试...

抚远县15528737713: Java 编程所使用的测试工具都有哪些?一般采用哪些测试方法? -
荆哀益中: 软件的测试方法很多,不同的出发点得到不同的测试方法.有:?从测试过程来分:静态分析法、动态测试法;?从观察结构的透明性方式来分:白盒法、黑盒法、灰盒法;?从获得测试数据形式上分:穷尽法;等价类划分法;边界值分析法;...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网