ACSL 及Frama-C验证工具简介(一)

ACSL 及相关工具简介

在软件系统的开发过程中,如何检查功能模块是否符合设计预期并保证这些模块能够正确的组合在一起实现更复杂的功能,是一个核心问题。测试(testing)的方法在一定程度上能够帮助我们发现一些问题;但要获得更可靠的保证,往往需要借助程序验证(verification)的方法:亦即使用某种形式化的语言(通常包括了对谓词逻辑的支持)对程序行为作出规范,然后使用逻辑规则证明相关代码符合给出的规范。

由法国原子能和替代能源委员会下属实验室(CEA-LIST)和法国国家信息与自动化研究所(INRIA)主导的“ANSI/ISO C 规范语言”(the ANSI/ISO C Specification Language,简称 ACSL)就是这样一种适用于 C 语言的行为接口规范语言(Behavioral Interface Specification Language,BISL)。它以特殊注释的格式穿插在 C 代码之中,精确严谨地刻画相关代码片段、乃至整个函数的行为和性质。一些自动化验证工具,例如 frama-c,能够解析经 ACSL 标注的 C 代码,用静态分析的方法自动验证其是否严格遵守了规范的约束。

ACSL 的实用性不仅仅体现在它拥有 frama-c 这样的自动证明工具,也体现在它允许灵活的模块化的规范书写。例如,每个功能模块/函数可以对应一组规范,亦即函数合约;只要可以证明某模块满足其合约,它的调用者就可以直接信赖合约中约定的性质,进而(结合其它子功能模块)实现更复杂的功能,而无需了解各个子模块的具体实现。

下文中我们将先简单介绍 ACSL 及其使用场景,然后从应用的角度出发,结合实例演示其自动证明工具(frama-c with WP plugin)的使用方法及原理,最后再补充介绍未能涵盖的 ACSL 其它特性。

ACSL 简介及其使用场景

作为一种行为接口规范语言,ACSL 被用来描述我们期望程序表现出的行为。然后一些自动化的工具可以被用来检查程序是否真的将如这些规范所描述地一般表现。本节我们将给出 ACSL 最核心功能的介绍,并在此基础上分析 ACSL 的使用场景。

ACSL 简介

ACSL 可以描述我们期望程序表现出的行为,即程序的规范。它以特殊注释的形式穿插在代码中(由 @ 符号引导)。最简单的 ACSL 规范可以只是一条插在代码中的断言(assertion),用来对程序执行到此处时的状态进行约束。例如:

...

int x = -10;

x = x < 0 ? -x : x;

//@ assert about_x: x >= 0;

...
 

上面名为 about_x 的断言要求程序执行到相应位置时,x 的值必须非负。不难看出,此处这条简单的性质是成立的,因为它前面的语句其实是对初值为 -10 的 x 进行了取绝对值的操作。将这段代码在自动证明工具 frama-c 中加载,可自动证明这条断言成立;藉此我们便可得知断言之前的相关代码(相对于此断言)是合格的代码。这个验证流程可以用下图表示:

图:使用断言验证相关代码片段的正确性

注:规范的名字只是

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值