在开发安全、可靠和合规的软件时,完备静态分析是一种有益的实践。本篇文章中,我们将讨论完备分析与静态分析的不同之处,为什么它很重要,以及完备静态代码分析的工作原理。
什么是完备静态分析?
完备静态分析是指分析结果的完整性或"健全性"。对于提供可靠性分析结果的静态分析工具,这意味着如果软件中存在特定的错误,缺陷或漏洞,那么该工具将出具相关的报告。
如果出现存在争议的问题,那么工具将以某种形式提出警告*,这样一来任何问题都会的得到诊断。
(*备注:这些在Helix QAC中被归类为可能的问题,如果不需要完备分析,则可以禁用。)
完备静态分析不同于其他静态分析的地方在于,后者的结果可能基于在一定时间或资源内可能发生的事情。
鉴于对程序的运行时行为进行建模需要某些近似值(例如,缺乏对程序输入或操作系统状态的知识),完备分析需要过度近似。
过度近似可以保证没有假阴性(对于给定的漏洞类型),而低近似值通常优先考虑没有误报。
其他形式的静态分析没有表现出这种严格性,并且可能包含低近似和过近似的混合。
也许完备和不完备的分析工具所得出的结果可能都会为程序的特定部分提供一份清晰的运行状态证明,但是完备分析引擎提供了额外的保证,即印证这一结论的所有可能性和所有路径都已得到验证。
完备静态分析的工作原理
在提到完备分析时,我们通常会考虑更复杂的程序间和程序内控制和数据流分析形式,正如当今最先进的静态分析工具所采用的那样。
与更简单的代码语法和语义分析不同,控制流和数据流静态分析通常与检测更复杂的问题相关联,例如:
- 空指针取消引用
- 阵列或缓冲区下溢和溢出
- 未初始化对象的使用
- 内存分配和取消分配异常
- 数字溢出、下溢和环绕
- 除以零
- 死代码
- 数据争用、死锁和其他并发冲突
控制和数据流分析是一项高计算负载的任务,因为必须考虑系统的所有可能输入以及通过系统所有可能的控制流路径。事实上,由于控制流和数据流分析的暴力穷举算法会导致分析时间指数暴涨,因此很少采用该方案。符号执行和抽象解释算法将是一个更优雅的选择。
根据Roberto Amadini、Graeme Gange、Peter Schachte、Harald Søndergaard和Peter J.Stuckey的抽象解释、符号执行和约束,“抽象解释是一个静态分析框架,用于完备的过度近似程序的所有可能运行时状态。”。
而“符号执行是一个可访问性分析框架,它试图探索程序的所有可能的执行路径”。抽象解释和符号执行在执行期间以不变性或路径条件的形式维持约束,该路径条件确定可以执行哪些路径,并且可以在各种数据源中保持哪些值。
然而,需要注意的是,虽然抽象解释是完备的,但符号执行却不是。
为什么完备静态分析很重要?
健全性是安全关键软件系统中的一个重要因素,特别是因为它保证软件不包含任何正在检查的编码缺陷。也就是说,完备分析可用于显示软件中没有错误。
因此,在汽车系统的ISO 26262功能安全(FuSa)标准中,抽象解释分析被明确引用为软件单元验证方法(表7,方法1i)。
如何使用Helix QAC 执行完备静态分析
由于能够提供深入和高度准确的分析结果,Helix QAC在30多年来一直是一个值得信赖的静态代码分析工具。Helix QAC能够进行良好的静态分析,是需要满足严格合规要求的严格监管和安全关键行业的首选工具。
但是,为了在Helix QAC项目中启用完备分析,需要执行某些步骤:
数据流深度需要设置为最大值(5),这将添加多个 -prodoption,如上面的屏幕截图所示。(请参阅 QAC 或 QAC++ 组件手册中的"分析超时"部分,了解为什么这些"超时"设置对于声音分析是必需的。
此外,“df::inter=5”和“inter-TU Analysis”虽然不是完备分析所必需的,但可以以额外的计算成本启用,以减少需要报告的可能问题的数量。这些设置的效果是启用程序间和程序内分析。
选择Helix QAC进行完备静态分析
亲身体验Helix QAC完备静态分析对代码质量和健全性的影响,立即联系北汇信息以免费试用。
-
代码
+关注
关注
30文章
4786浏览量
68552
发布评论请先 登录
相关推荐
评论