写点什么

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:002172

评论

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

海量数据 x 宝兰德 x openGauss Meetup成功举办,广州用户组正式成立!

W3C发布小程序技术标准白皮书

Onegun

小程序 微信小程序

MobPush for HarmonyOS

MobTech袤博科技

工信部领导莅临2022南京软博会诚迈科技展区参观指导

科技热闻

从多个角度分析顺序表和链表区别和特点

C++后台开发

数据结构 算法 链表 linux开发 C++开发

openGauss的SQL引擎在3.1.0版本中做了哪些优化?

openGauss内核荣获中国首个国际CC EAL4+级别认证

Java最常见的230道面试题,临阵磨枪,不快也光!涨薪指日可待

钟奕礼

Java 程序员 java面试 java编程

面霸是怎样练成的?“2023”带你过关斩将,手撕面试官

钟奕礼

Java 程序员 java面试 java编程

2022年中国新能源汽车出海市场发展洞察

易观分析

新能源汽车 出海

C语言学生管理系统

我是一个茶壶

C语言 学生成绩管理系统 11月月更

《Python编程:从入门到实践》有奖书评活动来啦!

图灵社区

openGauss 3.1.0的新型选择率模型大解密

openGauss —— 智能优化器之基数估计

小程序插件和小程序组件,有区别?

FinFish

小程序 移动开发 跨端开发 小程序插件 小程序组件

应用 Serverless 化,让业务开发心无旁骛

Serverless Devs

极客时间架构训练营模块八作业

李晨

架构

元年智答|数据洞察功能介绍

元年技术洞察

人工智能 数字化转型 智能

火山引擎VeDI推出这款产品 助力企业实现以“人”为中心的数据洞察

字节跳动数据平台

大数据 数据分析 火山引擎

瓴羊Quick BI企业数据分析工具,公司运营实时掌控

巷子

多云时代,如何构建配置管理数据库?

BoCloud博云

欢迎航天宏图加入社区

java程序员京东T3岗面试回顾:多线程+数据库+中间件+JVM+spring

钟奕礼

Java 程序员 java面试 java编程

国密浏览器是什么?有哪些?有什么特点?

行云管家

国密 国密浏览器

租便宜的云服务器能干啥?有什么好处?怎么选择?

行云管家

云计算 服务器 云服务器

偶数层PCB板为何在PCB多层板中“独领风骚”?

华秋PCB

工艺 PCB PCB设计

Go1.20 新版覆盖率方案解读

大卡尔

Go 测试覆盖率 11月月更

2023跳槽一定不能错过的java面试集——前百度资深架构师整理

钟奕礼

Java 程序员 java面试 java编程

多场景下 3-11 倍性能提升,Apache Doris 1.2 新版本性能揭秘!

SelectDB

数据库 数据分析 Clickhouse Doris 数仓

大咖说·图书分享|深入浅出Node.js

大咖说

node.js

精彩回顾 | 苏州农商银行新一代云原生信息科技架构体系实践

BoCloud博云

云原生

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