【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

评论

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

GraphicConverter 12 for Mac(图片浏览器)v12.1(6388)中文测试激活版

影影绰绰一往直前

测试管理|名企测试管理大咖解析沟通管理,多维度经验分享

霍格沃兹测试开发学社

ScaleFlux与UCloud携手,助力高性能文件存储,实现低成本和高性能的完美平衡

ScaleFlux

高性能 数据压缩 企业存储

Claris FileMaker Pro for mac(数据库软件)v20.3.1.31激活版

影影绰绰一往直前

CADintosh X for Mac(CAD制图软件)v8.8.6 (718)注册版

影影绰绰一往直前

名企测试管理大咖解析沟通管理,多维度经验分享

测试人

软件测试

面试官:说一下零拷贝技术的实现原理?

王磊

java面试

工厂生产管理MES系统,开源代码+维护

万界星空科技

开源 源码 mes 开源mes 万界星空科技

测试管理 | 京东科技控股股份有限公司岗位开放~

测吧(北京)科技有限公司

测试

FxFactory 8 Pro for Mac(视觉特效处理包)v8.0.12激活版

影影绰绰一往直前

CrossOver 24 for Mac(windows 虚拟机)v24.0 b1中文激活版

影影绰绰一往直前

复杂SQL治理实践 | 京东物流技术团队

京东科技开发者

软件测试|京东科技控股股份有限公司岗位开放~

霍格沃兹测试开发学社

名企测试管理大咖解析沟通管理,多维度经验分享

测吧(北京)科技有限公司

测试

Total Video Converter Pro for Mac(超级转霸)v5.1.0中文激活版

影影绰绰一往直前

异常检测、自动告警,业务问题分钟级识别

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟

iOS应用崩溃了,如何通过崩溃手机连接电脑查找日志方法

机械加工行业MES系统实施步骤

万界星空科技

mes 万界星空科技 机械 机械加工行业 机加工MES

「我在淘天做技术」2024年看AIGC是如何让1688主图焕发新春的

阿里技术

商品 大模型 1688 AIGC

✅快速构建Express服务

派大星

node.js Express

软件测试岗位内推丨京东科技控股股份有限公司岗位开放

测试人

软件测试

Apache Doris 2.0.4 版本正式发布

SelectDB

数据仓库 数据分析 OLAP 大数据 开源 数据库·

百川终入海 ,一站式海量数据迁移工具 X2Doris 正式发布

SelectDB

数据库 OLAP 数据库迁移 数据同步 大数据 开源

DBeaverEE for Mac(数据库管理)v23.3.3企业激活版

影影绰绰一往直前

API安全概览

FunTester

简单一招竟把nginx服务器性能提升50倍

京东科技开发者

教你一键搭建本地服务器,轻松4人以上联机畅玩幻兽帕鲁

华为云开发者联盟

云计算 服务器 华为云 华为云开发者联盟

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