写点什么

Rust 1.45 发布:修复了 Cast Unsoundness 并稳定了 Web 框架 Rocket 的支持

  • 2020-07-28
  • 本文字数:1238 字

    阅读完需:约 4 分钟

Rust 1.45发布:修复了Cast Unsoundness并稳定了Web框架Rocket的支持

Rust 1.45修复了一个长期存在的浮点数强制转换问题,该问题可能导致未定义行为(undefined behaviour )异常,并稳定了流行 Web框架Rocket所使用的特性。


将浮点数转换为整数时,Rest 会抛出一个 未定义行为(undefined behaviour)的已知异常。如果你对 Rust 的 value proposition有所了解的话,可能会对此感到惊讶。具体来说,下面的代码片段虽然编译时不会报错,但由于使用了 cast ( as ) 将浮点数 300 强制转换为 8 位无符号整数(仅表示值介于 0 到 255 之间的整数),在 Rust 1.44 中会抛出未定义行为的异常:


fn cast(x: f32) -> u8 {     x as u8 } fn main() {     let f = 300.0;     let x = cast(f);     println!("x: {}", x); } 
复制代码


在底层,这个问题与 LLVM 的 fptoui 指令有关,该指令在上述情况下使用会生成一个“有毒”的值。回想一下,Rust 提供了 unsafe 关键字来标记希望 挂起Rust安全保证的代码块。上面所示的代码片段虽然没有被标记为不安全,但它却包含了不安全的代码,这违背了 Rust 作为安全语言的承诺。


Rust 团队花了几年的时间来修复这个不健全的强制转换问题,主要是因为不清楚怎样才能正确地处理它。最终,他们决定让 as 执行“saturating”强制转换,这意味着将过大的浮点数强制转换为可表示的最大整数,将过小的浮点数和 NaN 强制转换为 0。此外,他们还引入了一种新的 unsafe 强制转换,如果你想要跳过 Rust 的安全行为可以使用如下代码:


let x: f32 = 1.0; let y: u8 = unsafe { x.to_int_unchecked() }; 
复制代码


虽然 saturating 强制转换提供了一种处理溢出的安全方法,但从数学角度来看,它仍然会产生错误的结果。 这就是为什么as 在Rust中不被视为值间转换的惯用方法,并且还被Rust的Clipply linter标记的原因。在 Rust 中,将浮点数转换为整数更惯用的方法是,使用 into 来进行不会出错的强制转换,而使用 try_into 来进行可能会出错的强制转换。


Rust 1.45 还在三个新地方增加了对调用过程宏的支持,即:作为表达式的一部分、在模式匹配中或作为语句。过程宏在 Rust 1.30 中进行了扩展,以支持类函数宏的定义(即看起来像函数的宏)。例如,下面的代码片段定义了一个 sql 宏,该宏可生成解析 SQL 语句所需的 Rust 语法树:


// 解析SQL语句 let sql = sql!(SELECT * FROM posts WHERE id=1); #[proc_macro] pub fn sql(input: TokenStream) -> TokenStream {    ... } 
复制代码


该变更版本的重要性还和 它在Rocket中的使用有关,Rocket 是一个流行的声明式 Web 框架,它使用了几个仅在 nightly Rust 中可用的实验特性。由于 Rocket 非常受欢迎,Rust 团队一直在努力稳定其中的一些特性,而 Rocket 则移除了其他的一些特性。作为这一努力的结果,尚未发布的 Rocket 0.5 将成为首个能够使用稳定的 Rust 进行编译的 Rocket 版本。


除了本文提到的内容之外,Rust 1.45 还包含了许多其他特性的稳定和修复。 请不要错过官方发布的详细说明。


原文链接:


Rust 1.45 Fixes Cast Unsoundness and Stabilizes Support for Web Framework Rocket


2020-07-28 09:002166

评论

发布
暂无评论
发现更多内容

【LeetCode】粉刷房子Java题解

Albert

LeetCode 7月月更

CSS 文本阴影 text-shadow 悬停效果

南城FE

前端 动画 HTML5, CSS3 7月月更 hover

小程序直播 + 电商,想做新零售电商就用它吧!

CRMEB

如何有效远程办公之我见 | 社区征文

踏雪痕

远程办公 居家办公 初夏征文

EventBridge 在 SaaS 企业集成领域的探索与实践

阿里巴巴云原生

阿里云 云原生 SaaS 事件总线

叮~您有一封Vue.js挑战邀请函,请查收

😶

JavaScript vue.js 前端 前端开发 开源项目

高中肄业,从月薪1000到几亿融资的创业者,是它拯救了我!

博文视点Broadview

自主工业软件的创新与发展

极客天地

国内酒店交易DDD应用与实践——代码篇

Qunar技术沙龙

架构

疫情来袭--远程办公之思考|社区征文

桑榆

初夏征文

如何远程办公更有效率 | 社区征文

宇宙之一粟

效率 居家办公 初夏征文

Spring Cloud Alibaba 2.2.8 版本发布与社区未来规划介绍

阿里巴巴云原生

阿里云 云原生 spring cloud alibaba

Spring Cloud源码分析之Eureka篇第一章:准备工作

程序员欣宸

Java spring SpringCloud 7月月更

ORACLE进阶(二)视图详解

No Silver Bullet

oracle 视图 7月月更

程序员转方向

沃德

程序员 7月月更

JDBC 进阶

武师叔

7月月更

SAP UI5 应用的主-从-从(Master-Detail-Detail)布局模式的实现步骤

汪子熙

前端开发 SAP UI5 ui5 web前端开发 7月月更

毕业设计项目

michael

架构实战营 #架构实战营 「架构实战营」

图解网络:什么是热备份路由器协议HSRP?

wljslmz

网络技术 路由协议 7月月更 热备份路由器协议 HSRP

到底什么才是DaaS数据即服务?别再被其他DaaS概念给误导了

雨果

DaaS数据即服务

Qt如何实现打包,实现EXE分享

小肉球

qt 7月月更

毕业总结

michael

架构实战营 #架构实战营 「架构实战营」

【Python技能树共建】Beautiful Soup

梦想橡皮擦

Python 7月月更

资深工程师的技术方案思考模型

刘绍

方法论 工程师 软件设计 技术方案 程序员进阶

程序员的焦虑

沃德

程序员 7月月更

Go 语言入门很简单:Go 实现凯撒密码

宇宙之一粟

密码学 Go 语言 7月月更

函数计算异步任务能力介绍 - 任务触发去重

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

免费商城系统源码——如何选择?

开源直播系统源码

二次开发 免费源码 商城源码 免费商城源码

Container killed by YARN for exceeding memory limits

怀瑾握瑜的嘉与嘉

spark 7月月更

从0到1建设智能灰度数据体系:以vivo游戏中心为例

vivo互联网技术

数据分析 根因分析 数据分析体系

关于对JavaScript变量提升的理解

是乃德也是Ned

JavaScript 前端 7月月更

Rust 1.45发布:修复了Cast Unsoundness并稳定了Web框架Rocket的支持_大前端_Sergio De Simone_InfoQ精选文章