写点什么

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

评论

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

自动化测试的 8 个最佳实践

FunTester

网上纪念馆(源码+文档+讲解+演示)

深圳亥时科技

《Operating System Concepts》阅读笔记:p354-p358

codists

操作系统

LED显示屏租赁:点亮活动的“灵活之光”

Dylan

发布会 LED LED display LED显示屏 虚拟演唱会

Java 单例模式与线程安全

知识浅谈

Java 单例模式

性价比很高的国产ITSM软件工具推荐:轻帆云,让IT服务管理既高效又省钱!

云智慧AIOps社区

ITSM ITSM软件 工单管理 工单系统 智能工单

智能制造:流程管理简析

积木链小链

数字化转型 流程管理 智能制造

WebGL开发VR软件的优化

北京木奇移动技术有限公司

VR开发 软件外包公司 webgl开发

“企业级敏捷教练课程” 6月7-8日 · CSP-SM认证周末班【报名即赠敏捷漂流记】

ShineScrum

敏捷 CSP-SM

什么是CNAME记录?设置CNAME记录需要注意哪些事项?

防火墙后吃泡面

WebGL开发VR软件框架

北京木奇移动技术有限公司

VR开发 软件外包公司 webgl开发

道路养护设计系统(源码+文档+讲解+演示)

深圳亥时科技

新书上线 |《零门槛AIGC应用实战——Serverless+AI 轻松玩转高频AIGC场景》免费下载

阿里巴巴云原生

阿里云 云原生

售票系统(源码+文档+讲解+演示)

深圳亥时科技

“领导企业转型必修课” 6月21-22日敏捷领导者(CAL1)认证周末班

ShineScrum

敏捷 CAL

安装CST的Linux版本教程

思茂信息

cst电磁仿真 CST软件 CST Studio Suite

智慧园区,智慧工地,智慧物业等建设方案(PPT))

金陵老街

智慧园区

河南科技学院领导一行莅临和鲸科技考察交流,AI 引领培育兴农英才

ModelWhale

人工智能 大数据 AI 农业 大语言模型

如何从工作中获得成就感

老张

职场成长 认知

币圈不设防第三期回顾:中东资本入场,加密市场格局将如何重塑

TechubNews

FlowGram 简介:开源前端流程搭建引擎

字节跳动开源

低代码平台 可视化开发 分层扩展 IOC依赖注入 AI工作流

从湖仓分离到湖仓一体,四川航空基于 SelectDB 的多源数据联邦分析实践

SelectDB

数据库 hadoop 湖仓一体 湖仓融合 航空运输

销售增长新解法:DeepSeek企业知识库驱动效率革命

人称T客

淘宝商品数据API接口实战指南|手把手教你获取商品详情和全店数据(避坑版)

代码忍者

淘宝API接口

“全球金牌敏捷课程” · 4月19-20日CSM认证课程 · Jim老师引导讨论AI & Agility话题

ShineScrum

敏捷 项目开发 CSM认证 CSM认证培训

夜莺监控 v8.0 新版通知规则 | 对接飞书告警

巴辉特

夜莺监控 夜莺告警 飞书告警 通知规则 夜莺通知

1688批发数据API接口深度解析|从商品详情采集到供应商对接全攻略(避坑+实战)

代码忍者

1688API接口

访问受限、账号封禁、匿名性不足?动态住宅代理解决这些难题

kookeey代理严选

Python 动态代理 爬虫技术 海外直播 全球广告投放

2025大型企业财务数智化峰会·上海站成功举办!

用友智能财务

AI 财经 财务 会计

AI驱动零信任:从人机信任到智能信任的跨越

权说安全

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