news 2026/9/7 17:19:28

Rust 编译器错误码 E0092 解析:声明未定义原子操作 intrinsic 的历史报错与现行 atomic intrinsic 对照

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rust 编译器错误码 E0092 解析:声明未定义原子操作 intrinsic 的历史报错与现行 atomic intrinsic 对照

Rust 编译器错误码 E0092 解析:声明未定义原子操作 intrinsic 的历史报错与现行 atomic intrinsic 对照

【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust

本文聚焦 Rust 编译器错误码手册中的 E0092(位于 E0092.md),讲解这个"声明了未定义的原子操作函数"报错的来龙去脉、它为何在现行编译器中不再触发,以及如何对照 library/core/src/intrinsics/mod.rs 中当前生效的原子 intrinsic 声明来排查同类问题。读完后可掌握 Rust 错误码归档机制(退役错误码如何保留文档)以及原子操作 intrinsic 的正确命名与签名形态。

1. E0092 是什么:声明了不存在的原子操作函数

E0092 对应一个非常具体的历史编译错误:当你在开启#![feature(intrinsics)]后,用#[rustc_intrinsic]声明一个原子操作 intrinsic,但函数名不在编译器识别的"原子操作函数"白名单中时,编译器会报出类似unrecognized atomic operation function的错误。

原文档给出的错误示例如下(注意其已被标记为不再编译):

#![feature(intrinsics)] #![allow(internal_features)] #[rustc_intrinsic] unsafe fn atomic_foo(); // error: unrecognized atomic operation // function

文档给出的排查建议只有一句话,但很关键:检查函数名是否拼写错误,所有 intrinsic 函数定义在 Rust 源码的library/core/src/intrinsics。这句话把排查路径从"猜编译器规则"收敛到了"对着标准库声明清单核对",这也是处理一切 intrinsic 命名问题的通用方法。

2. 为什么文档标注"this error code is no longer emitted"

E0092.md 的第一行就写着:

Note: this error code is no longer emitted by the compiler.

这不是文档疏漏,而是 rustc 错误码体系的一条明确维护规则。在 compiler/rustc_error_codes/src/lib.rs 的注释中可以看到这条规范:

Donotremove entries from this list. Instead, just add a note to the corresponding markdown file saying that this error is not emitted by the compiler any more (see E0001.md for an example), and remove all code examples that do not build any more by marking them withignore (no longer emitted).

也就是说:错误码编号一旦分配就永不回收,代码示例不再可编译时改用ignore (no longer emitted)标记,文档本身保留作为历史档案。E0092 正是按这个流程处理的——0092仍出现在 error_codes 宏列表中,文档保留但标注退役。

从源码结构看,该错误不再触发与 atomic intrinsic 的声明方式演进有关:早期用户需要手写#[rustc_intrinsic]声明并逐名匹配编译器内置的原子操作清单,名字对不上就报 E0092;而当前仓库中,原子操作 intrinsic 已经以完整的泛型签名形式预定义在标准库 core 中(见下文),用户不再通过"声明一个新名字的原子函数"来使用原子操作,因此这条历史检查路径随之退役。

3. 当前有效的原子 intrinsic 清单(对照排查用)

E0092 文档指引的library/core/src/intrinsics在仓库中对应 library/core/src/intrinsics/mod.rs,其中每个原子操作都带有#[rustc_intrinsic]#[rustc_nounwind]属性,并且给出了完整的类型参数与文档说明。以下是该文件中当前生效的原子操作 intrinsic 全集(摘自源码,行号供定位):

intrinsic 名称签名要点对应的稳定 API(文档中的说明)
atomic_cxchg<T, const ORD_SUCC, const ORD_FAIL>(dst, old, src) -> (T, bool)compare_exchange系列方法
atomic_cxchgweak同上,但"比较可能虚假失败"compare_exchange_weak系列方法
atomic_load<T, const ORD, const VOLATILE>(src) -> T各 atomic 类型的load
atomic_store<T, const ORD, const VOLATILE>(dst, val)各 atomic 类型的store
atomic_xchg<T, const ORD>(dst, src) -> Tswap系列方法
atomic_xadd/atomic_xsub<T, U, const ORD>(dst, src) -> Tfetch_add/fetch_sub
atomic_and/atomic_nand/atomic_or/atomic_xor<T, U, const ORD>(dst, src) -> Tfetch_and/fetch_nand/fetch_or/fetch_xor
atomic_max/atomic_min要求有符号整数类型fetch_max/fetch_min
atomic_umin/atomic_umax要求无符号整数类型无符号类型的fetch_min/fetch_max
atomic_fence<const ORD>()atomic::fence
atomic_singlethreadfence<const ORD>()atomic::compiler_fence

例如 atomic_load 的声明:

#[rustc_intrinsic] #[rustc_nounwind] pub const unsafe fn atomic_load<T: Copy, const ORD: AtomicOrdering, const VOLATILE: bool>( src: *const T, ) -> T;

可以观察到两个与旧 E0092 场景直接相关的演进点:

  1. 原子 intrinsic 不再依赖裸函数名白名单,而是依赖带类型与序(AtomicOrdering常量参数)的完整签名T限定为CopyUT的约束(整数类型相同、指针类型用usize)也写进了每个函数的文档注释,拼写之外的签名错误会在类型检查阶段被直接发现。
  2. 每个 atomic intrinsic 的文档注释都显式指向其稳定版本,如 "The stabilized version of this intrinsic is available on the [atomic] types via theloadmethod"。这印证了文档中"检查函数名"建议的现实意义:绝大多数代码应直接使用std::sync::atomic中的稳定 API,而非自行声明 intrinsic。

4. 实操要点:遇到类似 intrinsic 声明错误如何排查

综合 E0092 的原始指引与当前仓库结构,给出可操作的排查步骤:

  1. 确认你在做什么:如果你只是想在应用代码里做原子操作,直接使用std::sync::atomic(如AtomicUsize::loadfetch_addcompare_exchange等),不需要任何#![feature(intrinsics)]
  2. 核对函数名与签名:如果你确实在维护/试验 intrinsic 声明(编译器或系统级开发),到 library/core/src/intrinsics/ 目录下逐一对照:
    • 函数名是否与上表完全一致(区分atomic_cxchgatomic_cxchgweak这类前缀相近的项);
    • 泛型参数与常量参数(ORDVOLATILE等)是否与当前声明形态一致;
    • 是否遗漏#[rustc_intrinsic]/#[rustc_nounwind]属性。
  3. 理解错误码文档的时效性:若你在旧版编译器报错信息或历史 issue 中看到 E0092,但当前工具链中再也无法复现,不必困惑——这正是 lib.rs 所描述的"退役错误码保留文档"机制在起作用,错误码编号永久保留以便旧资料仍可检索。

5. 小结

  • E0092 的历史含义:#[rustc_intrinsic]声明了一个编译器不识别的原子操作函数名,报unrecognized atomic operation function;排查方法是核对 library/core/src/intrinsics/ 中的声明清单。
  • 该错误码现已退役,文档按 compiler/rustc_error_codes/src/lib.rs 中"只标注、不删除"的规范保留为历史档案,示例代码标记为ignore (no longer emitted)
  • 当前仓库中全部 16 个原子 intrinsic(atomic_cxchgatomic_loadatomic_storeatomic_xadd等)以带AtomicOrdering常量参数的完整签名预定义于 library/core/src/intrinsics/mod.rs,且每个都注明了对应的稳定 API——这既是理解 E0092 为何消失的钥匙,也是日常开发中直接使用稳定原子操作的依据。

【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 17:18:57

Chrome/Edge缓存清理指南:释放C盘空间,破解浏览器卡顿

前言没写错&#xff0c;这篇就是来帮你“抢”回几个G的浏览器越用越卡、磁盘空间越用越少&#xff0c;这几乎是每台Windows电脑都会遇到的问题。尤其对经常用 Chrome 和 Edge 双开干活的人来说&#xff0c;不知不觉 C 盘就会多出来几个G的“隐形垃圾”&#xff0c;而这些垃圾里…

作者头像 李华
网站建设 2026/9/7 17:18:54

软考系统架构师必备:计算机网络核心考点全解析

这篇接着上篇写。上一篇把OSI七层模型、IP地址编址、子网划分和路由协议这些地基打完了&#xff0c;这篇重点往上走一层&#xff0c;把传输层、应用层的核心协议&#xff0c;以及系统架构师考试里更爱考的网络架构设计、网络安全、新技术趋势一起过一遍。备考软考系统架构师的同…

作者头像 李华
网站建设 2026/9/7 17:18:40

微秒级性能优化实战:从DNS解析到内存分配的延迟拆解与压测验证

前阵子帮一个团队排查接口&#xff0c;P95 一直在 80ms 上下波动&#xff0c;代码里该做的缓存做了&#xff0c;连接池也配了&#xff0c;一群人折腾两天没有结果。最后发现根子不在业务代码&#xff0c;而在每次请求都会重新走一次 DNS 解析&#xff0c;而且解析结果完全没有缓…

作者头像 李华
网站建设 2026/9/7 17:18:08

当AI创作音乐:从《古都开封》看AI音乐生成工具如何改变创作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 17:17:48

AI读代码前先清洗源文件:大规模代码库预处理实战指南

我们仓库里当时一共躺了九千多个源文件。任务听着也简单&#xff1a;让 AI 帮我把这几万个文件的模块关系梳理清楚&#xff0c;顺带给出重构建议。一开始我的想法很粗暴&#xff0c;把整个目录拖进上下文&#xff0c;让模型自己看。结果连试三轮都翻车&#xff0c;不是文件解析…

作者头像 李华
网站建设 2026/9/7 17:14:45

GLM-5.3-Flash免费接入Cline实测:Pareto最优下的AI编程新选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华