这篇博客开始介绍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的更多相关文章

  1. <VCC笔记> 溢出与unchecked

    在程序运算或者数据转换的时候,由于各种数据类型有各自的范围,运算的时候,其结果如果超出这个范围,就被称之为溢出.熟悉C#的同志们应该了解用来解决溢出(Overflow)问题的checked,unche ...

  2. <VCC笔记> Assumption

    接下来是第二种注释语句类型Assumption.语法_(Assume E), 这个表达式是让VCC在接下来的额推理中,无视表达式E, 直接认可表达式E. 例: int x, y; _(assume x ...

  3. <VCC笔记> 推断操作符,映射和量词

    推断操作符 在VCC中,==>符号意味着逻辑推理结果,即离散数学中的蕴涵关系.P==>Q等价于((!P)||(Q)).是非常常用的操作符. 量词(quantifier) 关于量词,这里指的 ...

  4. <VCC笔记>VCC简介与安装

    最近在学校跟着老师参与了一个代码验证的工作,需要使用Microsoft Research(微软学术)开发的VCC工具,是开源的,托管在Codeplex上.这东西英语资料极其少,中文资料基本没有.我只能 ...

  5. 读书笔记——Windows核心编程(2)禁止C运行时触发的所有Debug Assertion Failed对话框

    1 定义一个函数 void _invalid_parameter( const wchar_t * expression, const wchar_t * function, const wchar_ ...

  6. PHPUnit笔记

    PHPUnit是一个面向PHP程序员的测试框架,这是一个xUnit的体系结构的单元测试框架. 复杂的项目,通过单元测试能够快速排查bug,有效减少bug的产生.简单的项目,使用php自带的var_du ...

  7. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  8. Introducing Regular Expressions 学习笔记

    Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...

  9. 菜农群课笔记之ICP与ISP----20110412(整理版)

    耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html        成 ...

随机推荐

  1. Maven整合JaCoCo和Sonar,看看你的测试写够了没

    1 简介 单元测试是保证代码质量的重要一环,而如何衡量单元测试写得好不好呢?覆盖率(Coverage)是一个重要指标.而JaCoCo则是专门为Java提供的用于检测测试覆盖率的工具,英文全称为Java ...

  2. redis的参数解释

    include /path/to/local.conf 当有公用配置时,可以采用独立出公共配置文件然后引入的方式达到公共配置unixsocket /tmp/redis.sock 通过socket文件进 ...

  3. python3.x 基础五:模块

    1.定义 模块:本质是.py结尾的python文件,从逻辑上组织python代码,可以是变量,函数,类,逻辑,目的是实现一个功能,test.py 对应模块名:test 包:从逻辑上组织模块的,本质就是 ...

  4. 微软 Build 大会发布大量开发工具与服务!编码、协作、发布,如丝般顺滑

    Microsoft Build 2020开发者大会已经圆满落幕,在连续两天48小时的不间断直播中,来自全世界的开发者共赴盛宴,场面相当壮观.在这一年一度的大聚会里,微软也是诚意满满,带来了一连串的产品 ...

  5. Golang源码学习:调度逻辑(一)初始化

    本文所使用的Golang为1.14,dlv为1.4.0. 源代码 package main import "fmt" func main() { fmt.Println(" ...

  6. CentOS7搭建Java环境(JDK、MySQL和Tomcat)

    目录 安装jdk 准备 jdk环境配置流程 安装MySQL 5.6 准备 MySQL安装流程 安装Tomcat 7 准备 Tomcat安装流程 参考链接 安装jdk 准备 jdk的tar.gz包(本文 ...

  7. PHP 操作结果集对象方法

    <?php header('Content-type:text/html;charset=utf-8'); //建立 或者 关闭mysql服务器 @符号用于屏蔽错误信息 $link=@mysql ...

  8. Spring笔记 - 组件注册

    @Bean:类注入容器 xml方式: <bean id="person" class="com.hrh.bean.Person"> <prop ...

  9. 01.Django-基础

    基础 1. 简介 Django是一个由Python写成的开放源代码的重量级Web应用框架. Django的目的是使常见的Web开发任务,快速和容易 2. 特点 MVC开发模式 内置进行快速web开发所 ...

  10. [推荐]大量 Blazor 学习资源(二)

    继上一篇<[推荐]大量 Blazor 学习资源(一)>之后,社区反应不错,但因个人原因导致这篇文章姗姗来迟,不过最终还是来了!这篇文章主要收集一些常用组件.书籍和电子书. 资料来源:htt ...