frama-c的静态检查能力
在不使用wp的情况下,frama-c有什么样的静态检查能力?
在不使用WP(最弱前置条件)插件的情况下,Frama-C依然拥有强大的静态分析能力,这主要依赖于其他插件,尤其是Eva插件,它基于抽象解释技术进行分析。
以下是Frama-C在不使用WP的情况下,主要的静态检查能力:
- Eva插件:基于抽象解释的值分析
Eva(Environment Value Analysis)是Frama-C中最核心、最强大的静态分析插件之一,它通过抽象解释技术来自动推断程序中变量可能的值域,并检测出各种运行时错误。它的主要能力包括:
- 检测运行时错误(Runtime Errors):
- 整数溢出:包括上溢和下溢,例如一个有符号整数加法运算超出其最大值。
- 除以零:检查任何除法操作是否可能出现除数为零的情况。
- 无效内存访问:检测对未分配、已释放或越界的内存进行读写操作,这包括空指针解引用和数组越界。
- 未初始化内存读取:检查是否使用了未被初始化的变量或内存区域。
- 悬空指针:识别指向已释放内存的指针。
- 对齐问题:检查访问内存时是否存在对齐错误。
- 推断变量值域:Eva能够为程序中每个执行点上的每个变量计算其可能值的过近似集合(例如一个区间),这有助于理解程序行为。
- 死代码检测:通过分析程序的控制流,Eva可以识别出永远不会被执行的代码段。
- 别名分析(Alias Analysis):能够识别出可能指向同一块内存区域的指针,这对于理解程序中的内存交互至关重要。
- 支持ACSL:虽然Eva可以自动工作,但它也可以利用ACSL(ANSI/ISO C Specification Language)注解来检查用户指定的属性,或者辅助WP插件进行证明。
- RTE插件:运行时错误注解生成器
RTE(Runtime Error)插件是一个辅助工具,它的作用是在C代码中自动插入ACSL注解,用于标记所有潜在的运行时错误点(例如除以零、数组越界等)。然后,这些注解可以由Eva等其他插件进行分析和验证。
- Slicing插件:程序切片
Frama-C提供了程序切片功能,可以将一个程序缩减到只包含与某个特定变量或语句相关的部分。这对于理解大型复杂程序中特定行为的根本原因非常有帮助。
- 其他定制插件和能力
Frama-C是一个可扩展的平台,拥有丰富的插件生态系统。除了Eva和RTE之外,还有许多其他插件,可以提供更专门化的静态分析能力。
- 自定义插件:用户可以编写自己的插件来执行特定的代码检查,例如强制执行特定的编码标准或风格。
- 信息流分析:SecureFlow插件可以用于分析程序中的信息流,检查是否存在安全漏洞。
- 测试覆盖率:LTest插件可以用于评估不同测试覆盖标准下的代码覆盖率。
总结
简而言之,不使用WP插件时,Frama-C主要通过基于抽象解释的Eva插件,来自动、全面地检查C代码中的运行时错误和未定义行为。这是一种完备的静态分析方法,意味着它能够保证不会漏报任何它所关注的错误类型(尽管可能会产生一些误报)。WP插件则更侧重于模块化的、需要人工编写ACSL契约的功能正确性证明**,与Eva的自动运行时错误检测形成互补。

浙公网安备 33010602011771号