什么是完全的静态分析?

创提信息
2022/08/30

分享到

在开发安全、可靠和兼容的软件时,完全的静态分析是一个大有裨益的实践方法。在这里,我们将讨论:从静态分析的角度来看,什么使完全的静态分析与众不同?为什么完全的静态分析很重要?完全的静态代码分析是如何运行的?


本文将包含如下几个部分:
 
     • 什么是完全的静态分析?
 
     • 完全的静态分析是如何运行的?
 
     • 为什么完全的静态分析很重要?
 
     • 如何使用Helix QAC进行完全的静态分析?


什么是完全的静态分析?
 
完全的静态分析,或称完全的分析,是指分析结果的完整性或“全面性”。对于一款静态分析工具来说,如果声称提供了完全的分析结果,则意味着:如果一个特定的错误、缺陷或漏洞存在于一款软件中,那么该工具将会发出报告。
 
如果存在或不存在是有争议的,那么将提供某种形式的警告*,这样就不会“漏掉”任何问题。(*注:这些在Helix QAC中被归类为可能存在的问题,如果不需要完全的分析,可以禁用。)
 
完全的静态分析不同于其他形式的静态分析,其他形式的静态分析结果可能是基于在一定的时间或资源范围内可能发生的状况。
 
考虑到对程序运行时行为建模需要某些近似值(例如,缺乏对程序输入或操作系统状态的了解),那么完全的静态分析则需要充分甚至冗余地覆盖到这些近似条件(over-approximation)。
 
近似冗余(over-approximation)确保没有漏报(对于某种特定的漏洞),近似不足(under-approximation)通常优先考虑不存在误报。
 

什么是完全的静态分析-1.jpg


其他形式的静态分析没有这么严格,可能同时包含近似冗余和近似不足的情况。
 
来自完全和不完全的静态分析工具的结果都有可能为程序的特定部分提供良好的健康状况报告,但是完全的静态分析引擎能提供额外的保证,即在得出这个结论时,所有的可能性和所有的路径都是经过验证的。


完全的静态分析是如何运行的?
 
当提到完全的静态分析时,我们通常考虑形式更复杂的程序间和程序内的控制流和数据流分析,就像在当今最先进的静态分析工具中发现的那样。
 
控制流和数据流静态分析,不是更简单的代码语法和语义分析,而是通常与检测更复杂的问题有关,例如:
 
    • 空指针解除引用
 
    • 数组或缓冲区下溢与溢出
 
    • 使用未初始化的对象
 
    • 内存分配和解除分配异常
 
    • 数值溢出、下溢和环绕
 
    • 除零
 
    • 死代码
 
    • 数据争用、死锁和其他并发冲突
 
控制流和数据流分析是一项计算密集型任务,因为必须考虑系统的所有可能输入和通过系统的所有可能控制流路径。事实上,用于控制流和数据流分析的暴力详尽算法会导致分析时间呈指数级别,因此很少适用。然而,符号执行(Symbolic Execution)和抽象解释(Abstract Interpretation)算法是更优雅的选择。
 
根据 Roberto Amadini, Graeme Gange, Peter Schachte, Harald Søndergaard以及Peter J. Stuckey撰写的Abstract Interpretation, Symbolic Execution and Constraints所述,“抽象解释是一个静态分析框架,用于对程序所有可能的运行时状态进行全面的冗余近似(over-approximation)。”
 
而“符号执行是一个可达性分析框架,试图探索一个程序的所有可能的执行路径。”抽象解释和符号执行在执行期间都以不变量或路径条件的形式维护约束条件,它们决定在不同的数据源条件下哪些路径可能被执行,哪些值可能会出现。
 
然而,至关重要的是,抽象解释是全面的,但符号执行却不是。


为什么完全的静态分析很重要?
 
全面性是安全关键型软件系统中的一个重要因素,特别是因为它能保证软件不包含任何要检查的编码缺陷。也就是说,如果一款软件中没有错误,完全的静态分析可以用来证明错误的不存在。
 
因此,在适用于汽车系统的ISO 26262功能安全(FuSa)标准中,抽象解释分析被明确引用为软件单元验证的方法(表7,方法1i)。


如何使用Helix QAC进行完全的静态分析?
 
由于能够提供深入和高度准确的分析结果,Helix QAC作为一款值得信赖的静态代码分析工具已经超过30年。Helix QAC能够进行完全的静态分析,一直是需要满足严苛合规要求的监管严格和安全关键行业的首选工具。
 
然而,为了在您的Helix QAC项目中进行完全的静态分析,还需要做一些设置:


什么是完全的静态分析-2.jpg

 

数据流深度(Dataflow Depth)需要设置为最高值(5),这将添加几个-prodoptions,如上面的截图所示。(请参阅QAC或QAC++组件手册中的“分析超时(Analysis Timeout)”部分的讨论:为什么这些“超时(timeout)”设置对于完全的静态分析而言是强制的。)
 
此外,即使不需要进行完全的静态分析,也可以启用‘df::inter=5’和‘Inter TU Analysis’, 以花费额外的计算成本来减少需要报告的可能存在的问题数量。这些设置的目的是能够支持程序间和程序内分析。


为什么选择Helix QAC进行完全的静态分析
 
如果您想亲自体验Helix QAC完全的静态分析对代码质量和全面性的影响,立刻注册申请免费试用吧。