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

溢出是有规律的,有时候代码原本的设计就是要利用溢出这一特性。但是VCC(以及C#)不愿意默认程序在利用溢出,所以发生溢出的时候会报错。因此有unchecked。

#include <vcc.h> 

unsigned hash(unsigned char∗s, unsigned len)
_(requires \thread_local_array(s, len))
{
unsigned i, res;
for (res = , i = ; i < len; ++i)
res = (res + s[i])∗;
return res;
}

结果会是:

Verification of hash failed.

testcase(9,11) : error VC8004: (res + s[i]) ∗ 13 might overflow.

VCC敏锐地察觉到(res + s[i]) ∗ 13这里的运算可能溢出。但是这个代码是想要利用溢出的,这时候需要使用_(unchecked)。

改成” res = _(unchecked)((res + s[i])∗13); “,上面的代码就不会报错了。

例子:

int a, b; 

// ... 

a = b + ;

_(assert a < b)

这样子,VCC要么报overflow,要么验证成功,这取决于之前的代码产生的推断。

int a, b; 

// ... 

a =  _(unchecked)(b + );

_(assert a < b)

像这样子,他不会报错说overflow。如果他不能推断出b+1不会溢出,他会报错assertion不能保证。

以下是VCC的对于_(unchecked)E的理解:

• if the value of E lies within the range of its type, then E == _(unchecked)E;

• if x and y are unsigned, then _(unchecked)(x+y)== (x+y <= UINT_MAX ? x+y : x + y−UINT_MAX), and similarly for other types;

• if x and y are unsigned, then_(unchecked)(x−y)== (x >= y ? x− y : UINT_MAX−y + x + 1), and similarly for other types.

以上。

<VCC笔记> 溢出与unchecked的更多相关文章

  1. 2019.04.17 读书笔记 checked与unchecked

    在普通的编程中,我们是很容易去分析数据的大小,然后给出合理的类型,但是在很多数据库的累计中,缺存在很多隐患,特别是研发时,数据量小,求和也不会溢出,当程序运行几年后,再来一次大求和,隐形的BUG就出来 ...

  2. <VCC笔记> Assumption

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

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

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

  4. <VCC笔记> 关于Assertion

    这篇博客开始介绍VCC的用法,先用简单的例子介绍VCC的基本语法,当然面对更复杂的程序时,VCC也是将他简化然后分析的. 1.Assertion #include <vcc.h> int ...

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

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

  6. C# 溢出检查

    checked: byte b = 255; checked { b++; } Console.WriteLine(b.ToString()); 执行出错:算术运算导致溢出. unchecked: b ...

  7. [CLR via C#]5.1 基元类型

    原文:[CLR via C#]5.1 基元类型 某些数据类在开发中非常常用,以至于许多编译器允许代码已简化的语法来操作它们.例如可以使用以下语法来分配一个整数: System.Int32 a = ne ...

  8. C#基础操作符详解(上)

    本节内容: 1.操作符概览: 2.操作符的本质: 3.操作符与运算顺序 4.操作符详解. 1.操作符概览: 操作符(Operator)也译为”运算符” 操作符是用来操作数据的,被操作符操作的数据称为操 ...

  9. CSS学习笔记:溢出文本省略(text-overflow)

    原文:CSS学习笔记:溢出文本省略(text-overflow) 在CSS3中,text-overflow属性的基本语法如下: clip:表示不显示省略文本,简单的裁切. ellipsis:表示对象文 ...

随机推荐

  1. xtrabackup手册笔记

    http://www.cnblogs.com/Amaranthus/archive/2014/08/19/3922570.html#_Toc396231219

  2. Java基础以及变量和运算符、包机制、javadoc生成

    目录 注释.标识符.关键字 注释 标识符 关键字 标识符注意点 数据类型 强类型语言 弱类型语言 Java的数据类型 基本类型(primitive type) 数值类型 boolean类型 什么是字节 ...

  3. rfind()的使用

    今天学了一个新函数 rfind 使用: str=123/456 str.rfind('/',1,6) 返回的是从1到6找最后一个/的位置

  4. 重学 Java 设计模式:实战建造者模式

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 乱码七糟 [luàn qī bā zāo],我时常怀疑这个成语 ...

  5. [Python基础]001.Python准备

    Python准备 Python简介 使用版本 环境安装 编写第一个Python文件 编辑器选择 Python简介 Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,能简单而有效 ...

  6. css 盒模型、box-sizing 学习笔记

    默认情况下,给元素设置的高度和宽度是元素内容区的宽度和高度,给元素加padding 和 border ,元素的实际宽度和高度的计算方式是下面的两个公式: 元素的宽度= 元素的内容区宽度 + 内边距宽度 ...

  7. PowerPC-MPC56xx Flash模式代码启动过程

    https://mp.weixin.qq.com/s/iruM5VwKgnH_7nmIQxO0-g   参考第5章   In order for the e200z4d core to be able ...

  8. jchdl - RTL

    https://mp.weixin.qq.com/s/gNN2eiJnr9N02xdZVQceDQ   ​​   相较于GSL层对物理连接的建模,RTL层提高了一个抽象层次: 把物理的触发器提取为抽象 ...

  9. jchdl - GSL实例 - ComplementTwo(二的补码)

    https://mp.weixin.qq.com/s/Gh2xJJvfg1SlyuayK4LRyQ   二的补码指对二进制数的所有位数整体求补.二进制运算下0,1互为补数,n位二进制数a的补数为2^n ...

  10. Chisel3 - Tutorial - Adder

    https://mp.weixin.qq.com/s/SEcVjGRL1YloGlEPSoHr3A   位数为参数的加法器.通过FullAdder级联实现.   参考链接: https://githu ...