写点什么

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

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

    阅读完需:约 4 分钟

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

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

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

评论

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

抖音商品API接口:开启电商自动化和数据洞察之门

Noah

对话阿里云云原生产品负责人李国强:推进可观测产品与OpenTelemetry开源生态全面融合

阿里巴巴云原生

阿里云 云原生 可观测

百度王颖:百度文库开启创作新纪元,人人都是内容创作者

Geek_2d6073

AutoMQ 对象存储数据高效组织的秘密: Compaction

AutoMQ

Java 云计算 云原生

智研未来,直击 AI DevOps,阿里云用户交流日杭州站来啦!

阿里云云效

阿里云 云原生

智研未来,直击 AI DevOps,阿里云用户交流日杭州站来啦!

阿里巴巴云原生

阿里云 DevOps 云原生

AutoMQ 社区双周精选第十期

AutoMQ

Java 云计算 云原生

如何使用 NFTScan NFT API 在 Mint Blockchain 上开发 Web3 产品和协议

NFT Research

NFT NFTScan API 文档

前端菜鸡,对于35+程序员失业这个事有点麻了

伤感汤姆布利柏

基于Python的性能优化(线程、协程、进程)

我再BUG界嘎嘎乱杀

Python 性能优化

打破壁垒,实现多引擎3D内容轻量化交付|点量云流

点量实时云渲染

Unity 视频流 实时云渲染 ue 3D实时云渲染

大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手

嘉为蓝鲸

运维 大模型 运维管理

彻底搞懂JavaScript原型和原型链

快乐非自愿限量之名

JavaScript 原型

业务功能流程图是什么,怎么做?附带推荐8款流程图软件!

彭宏豪95

效率工具 职场 流程图 在线白板 流程图绘制工具

华为云发布ServiceStage:内置优秀业界实践「云应用管理和运维」模板

华为云PaaS服务小智

云计算 软件开发 华为云

【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit

HarmonyOS SDK

HarmonyOS

你还在用工单系统的思维建设ITSM吗?

嘉为蓝鲸

ITSM 运维管理 平台化

低代码如何赋能电信运营商行业数字化转型

EquatorCoco

低代码 运营商

学校选择云桌面厂家需要考虑哪些因素?

青椒云云电脑

云桌面 云桌面厂家 云桌面系统

Apache IoTDB 分布式架构三部曲(一)集群概念

Apache IoTDB

2024深圳国际数字能源展览会

AIOTE智博会

能源展 数字能源展 深圳能源展

反射API与AOP:打造可插拔的插件式架构

技术冰糖葫芦

API Explorer API 文档 API 性能测试

小而美:两步完成从源码到应用的极简交付

阿里巴巴云原生

阿里云 Serverless 云原生

心识宇宙 x TapData:如何加速落地实时数仓,助力 AI 企业智慧决策

tapdata

数据库 Clickhouse 数据集成 CDC

为什么AI大模型离不开GPU?

Finovy Cloud

AI gpu GPU算力

ITSM新用法揭秘:构建科技公司售后服务管理体系

嘉为蓝鲸

运维 ITSM 流程管理

一图解锁 | 运维管理到工具体系的建设逻辑

嘉为蓝鲸

运维管理 运维工具

飞天发布时刻|阿里云可观测全速演进

阿里巴巴云原生

阿里云 云原生 可观测

NumPy 正态分布与 Seaborn 可视化指南

EquatorCoco

正态分布 Numpy

我们小公司,哪像华为一样,用得上IPD(集成产品开发)?

快乐非自愿限量之名

产品开发

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