ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

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 emittedE0092.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_cxchgT, const ORD_SUCC, const ORD_FAIL(dst, old, src) - (T, bool)compare_exchange系列方法atomic_cxchgweak同上但比较可能虚假失败compare_exchange_weak系列方法atomic_loadT, const ORD, const VOLATILE(src) - T各 atomic 类型的loadatomic_storeT, const ORD, const VOLATILE(dst, val)各 atomic 类型的storeatomic_xchgT, const ORD(dst, src) - Tswap系列方法atomic_xadd/atomic_xsubT, U, const ORD(dst, src) - Tfetch_add/fetch_subatomic_and/atomic_nand/atomic_or/atomic_xorT, U, const ORD(dst, src) - Tfetch_and/fetch_nand/fetch_or/fetch_xoratomic_max/atomic_min要求有符号整数类型fetch_max/fetch_minatomic_umin/atomic_umax要求无符号整数类型无符号类型的fetch_min/fetch_maxatomic_fenceconst ORD()atomic::fenceatomic_singlethreadfenceconst ORD()atomic::compiler_fence例如 atomic_load 的声明#[rustc_intrinsic] #[rustc_nounwind] pub const unsafe fn atomic_loadT: Copy, const ORD: AtomicOrdering, const VOLATILE: bool( src: *const T, ) - T;可以观察到两个与旧 E0092 场景直接相关的演进点原子 intrinsic 不再依赖裸函数名白名单而是依赖带类型与序AtomicOrdering常量参数的完整签名。T限定为CopyU与T的约束整数类型相同、指针类型用usize也写进了每个函数的文档注释拼写之外的签名错误会在类型检查阶段被直接发现。每个 atomic intrinsic 的文档注释都显式指向其稳定版本如 The stabilized version of this intrinsic is available on the [atomic] types via theloadmethod。这印证了文档中检查函数名建议的现实意义绝大多数代码应直接使用std::sync::atomic中的稳定 API而非自行声明 intrinsic。4. 实操要点遇到类似 intrinsic 声明错误如何排查综合 E0092 的原始指引与当前仓库结构给出可操作的排查步骤确认你在做什么如果你只是想在应用代码里做原子操作直接使用std::sync::atomic如AtomicUsize::load、fetch_add、compare_exchange等不需要任何#![feature(intrinsics)]。核对函数名与签名如果你确实在维护/试验 intrinsic 声明编译器或系统级开发到 library/core/src/intrinsics/ 目录下逐一对照函数名是否与上表完全一致区分atomic_cxchg与atomic_cxchgweak这类前缀相近的项泛型参数与常量参数ORD、VOLATILE等是否与当前声明形态一致是否遗漏#[rustc_intrinsic]/#[rustc_nounwind]属性。理解错误码文档的时效性若你在旧版编译器报错信息或历史 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 个原子 intrinsicatomic_cxchg、atomic_load、atomic_store、atomic_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),仅供参考
返回列表