这篇博客开始介绍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. EMAIL、用户名测试点

    EMAIL xxxaa@xxx.xxx 1.没有@情况,如:aa.net 2.没有.符号,如:aa@qqcom 3..后面没有字符:如 xxxaa@xxx. 4..不在@后面, 如:xxxaa.@xx ...

  2. Java——java.lang.NumberFormatException: For input string: ""

    java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.f ...

  3. MySQL性能分析(Explain)

    更多知识,请移步我的小破站:http://hellofriend.top 1. 概述 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查 ...

  4. 解决 appium 当中 uiautomator2 无法启动的问题

    在启动 appium 程序中,有时候会出现 uiautomator2 服务无法启动的错误,appium 的日志截图如下: image.png 错误信息: ActivityManager: Unable ...

  5. 问答题:你下班后是选择关电脑?Or,只关闭显示器?

    首百问答的答案:jingmentudou 因为你永远不知道什么时间会被叫醒.开个远程就能避免半夜去公司了. 月尧jade 干这一行的,电脑自按下开机键开始,除了驱动会自动启动外,你需要重新检查各大运行 ...

  6. 通道(Channel)的原理与获取

    通道(Channel):由 java.nio.channels 包定义 的.Channel 表示 IO 源与目标打开的连接. Channel 类似于传统的“流”.只不过 Channel 本身不能直接访 ...

  7. Java的四种权限修饰符

    private:仅对本类可见 缺省(不需修饰符):对本包可见 protected:对本包及所有子类可见 public:对所有类可见 修饰符: * 权限修饰符:private,默认的,protected ...

  8. 深入浅出Spring MVC

    摘要 本文旨在详细分析SpringMVC工作原理以及作为开发者如何基于SpringMVC做扩展.因为SpringMVC分析的文章比较多,所以本文重点讲解如何利用SpringMVC的扩展点实现我们的需求 ...

  9. Rocket - tilelink - AsyncCrossing

    https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg   介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyMo ...

  10. Chisel3 - bind - Op, ReadOnly, 左值

    https://mp.weixin.qq.com/s/F_08jKFMoX9Gf_J_YpsDpg   两个数据变量进行某个操作(op),产生一个输出,这个输出存在一个匿名变量中.这个匿名变量就是以O ...