【小测试】rust中的无符号整数溢出
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
1.在编译阶段就可以识别出来的溢出
fn main(){
let a : usize = 1;
println!("{}",a-2);
}
执行rustc报以下错误:
rustc usize_test.rs
error: this arithmetic operation will overflow
--> usize_test.rs:4:19
|
4 | println!("{}",a-2);
| ^^^ attempt to compute `1_usize - 2_usize`, which would overflow
|
= note: `#[deny(arithmetic_overflow)]` on by default
error: aborting due to previous error
2.运行期溢出
use std::time::{SystemTime, UNIX_EPOCH};
fn main() {
let start = SystemTime::now();
let since_the_epoch = start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
let ts = since_the_epoch.as_secs() as usize;
//
let a:usize = 1;
let b :usize= ts % 10 + 2;
println!("a={:?}, b={:?}", a,b);
//
println!("{:?}", a-b);
}
当溢出发生的时候,程序panic了:
thread 'main' panicked at 'attempt to subtract with overflow', usize_test_3.rs:16:22
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
由此也说明,rust不是真正的零成本抽象。为了防止无符号整形的溢出,必然需要在减法之前编译进去一个范围判断。
3.如何才能做溢出不panic的减法
use std::time::{SystemTime, UNIX_EPOCH};
fn main() {
let start = SystemTime::now();
let since_the_epoch = start
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
let ts = since_the_epoch.as_secs() as usize;
//
let a:usize = 1;
let b :usize= ts % 10 + 2;
println!("a={:?}, b={:?}", a,b);
//
println!("{:?}", a.wrapping_sub(b));
}
使用wrapping_sub()这个方法。
rust是如此的严谨,情愿使用的时候很啰嗦,也不要在运行时挖坑。
4. 通过release版本跳过溢出检查
在新的目录,执行:cargo new usize_test
在上面的代码写在:usize_test/src/main.rs 中
在usize_test目录执行:cargo build --release
然后执行 usize_test/target/release/usize_test,发现usize类型的溢出已经不会panic了,其结果与执行 wrapping_sub() 一样。
(感谢zhihu网友 @QDelta 提醒。)
不过我又陷入了迷惑:
- 既然release版本就不检查usize溢出了,还要wrapping_sub()这样的方法干啥?
- 对于溢出这样的情况,应该有程序员通过不同的写法来决定如何处理。如果编译个release版本就能跳过,rust又和C/C++有啥区别?
【小测试】rust中的无符号整数溢出的更多相关文章
- PHP中使用PDO操作事务的一些小测试
关于事务的问题,我们就不多解释了,以后在学习 MySQL 的相关内容时再深入的了解.今天我们主要是对 PDO 中操作事务的一些小测试,或许能发现一些比较好玩的内容. 在 MyISAM 上使用事务会怎么 ...
- Solidity合约中的整数溢出漏洞事件
事件 2018年4月23日 BEC 一夜被偷64亿 2018年4月25日 SMT 再爆类似漏洞,火币Pro和OKEx相继暂停了SMT交易 2018年4月25日 BEC.SMT现重大漏洞,这8个智能合约 ...
- FinClip小程序+Rust(三):一个加密钱包
一个加密货币钱包,主要依赖加密算法构建.这部分逻辑无关iOS还是Android,特别适合用Rust去实现.我们看看如何实现一个生成一个模拟钱包,准备供小程序开发采用 前言 在之前的内容我们介绍了整 ...
- 微信小程序开发教程 #043 - 在小程序开发中使用 npm
本文介绍了如何在微信小程序开发中使用 npm 中包的功能,大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频版更新. 微信小程序在发布之初没有对 npm 的支持功能,这也是目前很多前端开发 ...
- 总结微信小程序开发中遇到的坑
总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~ 1,页面跳转和参数传递实例 首先说一下我遇到的需求有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是 ...
- 测试开发中Django和Flask框架
Python测试开发中Django和Flask框架 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用.系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后 ...
- Java架构师中的内存溢出和内存泄露是什么?实际操作案例!
JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1.内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共有 102 ...
- 【译】理解Rust中的Futures(二)
原文标题:Understanding Futures in Rust -- Part 2 原文链接:https://www.viget.com/articles/understanding-futur ...
- Rust中的迭代器的使用:map转换、filter过滤、fold聚合、chain链接
什么是迭代器 Rust中的迭代器是一种强大的工具,它提供了一种灵活.通用的方法来遍历序列.迭代器是实现了Iterator trait的类型,并需要至少实现一个next函数,用于让迭代器指向下一个迭代对 ...
- selenium 测试框架中使用grid
之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecr ...
随机推荐
- 网站web服务器个人博客站开通那些端口合适?
一般网站服务器,只需要开通80 443,(ssh端口默认22,,建议修改) ping命令没有端口,因为ICMP 协议没有到tcp层,仅走ip层,由于IP层协议是一种点对点的协议,而非端对端的协议,它提 ...
- 实用指南:手把手搭建坚若磐石的DevSecOps框架
长期以来,安全问题一直被当作软件开发流程中的最后一步.开发者贡献可以实现软件特性的代码,但只在开发生命周期的测试和部署阶段考虑安全问题.随着盗版.恶意软件及网络犯罪事件飙升,开发流程需要做出改变. 开 ...
- PPT 动画-旋转唱片
插入图片.同心圆 按Shift 先点击背景图片,再点击 同心圆 合并形状,选择相交 设置动画,选择 陀螺旋,持续时间为 8秒, 打开计时窗口,重复为:直到幻灯片末尾
- Linux 创建新用户
添加用户组[root@VipSoft ~]#groupadd admin 添加用户[root@VipSoft ~]#useradd jimmy -m -d /home/jimmy -g admin 修 ...
- Mybatis 模块拆份带来的 Mapper 扫描问题
项目中,两个模块中都放了 Mapper,如下所示 @MapperScan(basePackages ={"com.vipsoft.his.mapper","com.vip ...
- 【计算机网络】身份认证Oauth2
身份认证Oauth2 https://www.bilibili.com/video/BV1FL411h7es/?spm_id_from=333.999.0.0&vd_source=d11276 ...
- 【每日一题】1. tokitsukaze and Soldier (优先队列 + 排序)
题目链接:Here 思路:这道题很容易看出来是考察 优先队列(priority_queue) 和 sort . 对于容忍人数越高的人来说,团队人数低也更能做到: for i = 0 to n - 1: ...
- 体验函数计算 FC 3.0,写测评赢取索尼头戴式耳机
11月1日云栖大会,函数计算3.0全新升级,相对函数计算2.0,3.0版本突出易用性.高弹性,并且可以和更多阿里云服务无缝集成.业内首发神龙 Serverless GPU 架构,冷启动大幅优化,全链路 ...
- kafka搭建二、集群搭建
系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...
- C++初始化列表时,形参和实参名可以一样,编译器可以识别
在这里初始化列表直接用age(age)即可,用this->age(age)反而会出错,C++不允许在成员初始化列表中使用this关键字来初始化类成员 class Person { public: ...
