<VCC笔记> 关于Assertion
这篇博客开始介绍VCC的用法,先用简单的例子介绍VCC的基本语法,当然面对更复杂的程序时,VCC也是将他简化然后分析的。
1.Assertion
#include <vcc.h>
int main() {
int x,y,z;
if (x <= y) z = x;
else z = y;
_(assert z <= x)
return ;
}
上面的代码使z成为x和y之中的最小值。其中被_( )包围的注释就是VCC所需要的注释,而且C语言编译器会无视这些注释。因为include的<vcc.h>中定义了#define _(...) /∗nothing∗/
一个类似_(assert E)的注释就是一个Assertion,他要求VCC证明注释中的表达式E是成立(hold)。所以_(assert z <= x)要求当代码执行到这一行时,z应该小于等于x。需要注意的是,如果VCC验证通过了这一条Assertion,这表示VCC证明不管什么时候,不管执行多少次,这条Assertion都会成立。
C语言自身也有类似的东西 assert(E)。微软的文档中这样介绍两者的区别。
It is instructive to compare_(assert E)with the macro assert(E) (defined in <assert.h>), which evaluates E at runtime and aborts execution if E doesn’t hold. First, assert(E) requires runtime overhead (at least in builds where the check is made), whereas_(assert E)doesnot.Second,assert(E)will catch failure of the assertion only when it actually fails in an execution, whereas _(assert E) is guaranteed to catch the failure if it is possible in any execution. Third, because _(assert E) is not actually executed, E can include unimplementable mathematical operations, such as quantification over infinite domains.
如果要在cmd命令行中用VCC验证这个函数,你可以把代码保存为minimum.c,在命令行中使用VCC大致如下,**表示代码文件目录。
C:\**> vcc.exe minimum.c
Verification of main succeeded.
如果装了VCC的Visual Studio插件,用VS打开文件之后,空白处右击,在菜单中选择Verify minimum.c就可以验证这个文件,验证结果会在VS底部给出。如果在函数内点击也可以只验证这个函数。
2.VCC的原理部分
要理解VCC的工作原理,可以去了解每一步执行中VCC掌握了什么信息。在上面的例子中VCC一开始什么都不知道,然后知道了if的第一个条件x<=y, 然后是z==x, 所以VCC知道z<=x。在else分支中,类似的,VCC知道y<x, z==y, 所以VCC知道z<=x。if的每个分支VCC都发现Assertion成立,最后他就会验证通过这个Assertion。
我们说VCC知道什么,指的是VCC知道代码提供的信息,并且可以通过当前已知的信息可以直接推断出新的信息。在这种理想状态下,当你新增一个正确的Assertion,肯定不会影响他后面的Assertion的正确性。但是,VCC只完成了对基本公式的继续推断,包括相等,不等,加减乘除等简单的运算,而没有完成对所有运算公式的自动推断,是有其局限性的。不然的话,他自己全部都能推断完,我们的工作量就很小了。
所以,在现实情况中,有时候,即使VCC“知道”了足够的信息,也没法证明一条Assertion。当你新增一个正确的Assertion,有可能会影响他后面的Assertion的正确性。当然,这个概率是比较低的,而且往往是涉及非线性算法的代码会出问题。
所以,VCC验证顺序代码或者条件语句时一般不会丢失信息,但是VCC验证循环语句的时候,容易丢失信息。这里的丢失是指他没有继续推断出更多信息,提供注释有助于减少这种情况。如果VCC没有通过你认为肯定能通过验证的代码,那就有可能是VCC不知道或者忽视了你以为它肯定知道的东西。这时候一个Assertion也是一个提醒,VCC验证他的时候可能就会恍然大悟,这个条件也是要成立的啊!
<VCC笔记> 关于Assertion的更多相关文章
- <VCC笔记> 溢出与unchecked
在程序运算或者数据转换的时候,由于各种数据类型有各自的范围,运算的时候,其结果如果超出这个范围,就被称之为溢出.熟悉C#的同志们应该了解用来解决溢出(Overflow)问题的checked,unche ...
- <VCC笔记> Assumption
接下来是第二种注释语句类型Assumption.语法_(Assume E), 这个表达式是让VCC在接下来的额推理中,无视表达式E, 直接认可表达式E. 例: int x, y; _(assume x ...
- <VCC笔记> 推断操作符,映射和量词
推断操作符 在VCC中,==>符号意味着逻辑推理结果,即离散数学中的蕴涵关系.P==>Q等价于((!P)||(Q)).是非常常用的操作符. 量词(quantifier) 关于量词,这里指的 ...
- <VCC笔记>VCC简介与安装
最近在学校跟着老师参与了一个代码验证的工作,需要使用Microsoft Research(微软学术)开发的VCC工具,是开源的,托管在Codeplex上.这东西英语资料极其少,中文资料基本没有.我只能 ...
- 读书笔记——Windows核心编程(2)禁止C运行时触发的所有Debug Assertion Failed对话框
1 定义一个函数 void _invalid_parameter( const wchar_t * expression, const wchar_t * function, const wchar_ ...
- PHPUnit笔记
PHPUnit是一个面向PHP程序员的测试框架,这是一个xUnit的体系结构的单元测试框架. 复杂的项目,通过单元测试能够快速排查bug,有效减少bug的产生.简单的项目,使用php自带的var_du ...
- 瘋耔java语言笔记
一◐ java概述 1.1 ...
- Introducing Regular Expressions 学习笔记
Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...
- 菜农群课笔记之ICP与ISP----20110412(整理版)
耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html 成 ...
随机推荐
- Kali Linux 2020.1安装以及安装后要做的事
Kali Linux是基于Debian的Linux发行版,预装了许多渗透测试软件,让大家从各种繁琐的软件安装中解脱出来,专注于测试本身. 本文章介绍了如何安装目前最新的2020.1版本,以及安装好后补 ...
- java 精确加减
/** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public double add(double v1, dou ...
- System.Web.mail ----虚拟发件人发送邮件
转载别人的 使用SMTP发送邮件 说到邮件发送,先提一下SMTP. SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议.它是一组用于从源地址到目的 ...
- POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)
#include <stdio.h> #define MAX 27 void dfs(int i, int j); int dx[8] = {-1, 1, -2, 2, -2, 2, -1 ...
- 【MySQL】覆盖索引和回表
先来了解一下两大类索引 聚簇索引(也称聚集索引,主键索引等) 普通索引(也成非聚簇索引,二级索引等) 聚簇索引 如果表设置了主键,则主键就是聚簇索引 如果表没有主键,则会默认第一个NOT NULL,且 ...
- Python对象组合
一个类的对象作为另一个类的对象的属性,称为类的组合. 即 class1.instance1.property = class2.instance 组合也是代码重用的重要方式之一. 先定义三个类:人.汽 ...
- Android_四大组件之Service
一.概述 Service是四大组件之一.它主要用于在后台执行耗时的逻辑,即使用户切换到其他应用甚至退出应用,它也能继续在后台运行. 下面主要介绍了service的两种形式启动和绑定 ,并通过简单例子说 ...
- [工具推荐]001.FlipPDF使用教程
FlipPDF是一个什么样的软件呢,他有什么实际用途呢?顾名思义,这是一个跟PDF有关的软件,没错它是一款把PDF转换成酷炫书籍的软件,他还支持PDF中的目录,也就是转换成的书籍,目录一样可以跳转的. ...
- [注]一将功成万骨枯!App的七种死法
一将功成万骨枯,这种事在有泡沫的行业总是会发生的.移动互联网尤甚.从<愤怒的小鸟>到<植物大战僵尸>.<捕鱼达人>.<唱吧>.<陌陌>……一 ...
- HttpServletRequestWrapper 类&过滤指定文字
HttpServletWrapper 和 HttpServletResponseWrapper 1). Servlet API 中提供了一个 HttpServletRequestWrapper 类来包 ...