惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
F
Full Disclosure
A
About on SuperTechFans
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
Know Your Adversary
Know Your Adversary
K
Kaspersky official blog
L
LINUX DO - 热门话题
Recorded Future
Recorded Future
C
Cisco Blogs
M
MIT News - Artificial intelligence
T
Tenable Blog
G
GRAHAM CLULEY
月光博客
月光博客
Recent Announcements
Recent Announcements
V
Visual Studio Blog
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
P
Privacy International News Feed
P
Proofpoint News Feed
I
Intezer
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
O
OpenAI News
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
The Cloudflare Blog
Spread Privacy
Spread Privacy
酷 壳 – CoolShell
酷 壳 – CoolShell
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed

博客园 - PKICA

博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 rust线程-std::thread::park和unpark 配合Builder实现轻量级的线程挂起与唤醒 rust自定义线程属性std::thread::Builder rust线程 rust关联函数 rust高并发设计实践进阶 rust高并发设计实践 rust性能优化与安全边界 联合体union在rust和C语言中有什么区别 rust并发与异步编程 rust类型系统与零成本抽象 rust内存模型 告别大显存依赖!用 Rust 新一代深度学习框架 Burn 打造纯 CPU 文本分类推理引擎 rust类型系统标记 编译配置解答 git实用命令 rust底层设计理念值得注意的几个地方总结 rust可变引用作为函数参数的机理详解 Rust内存重解释transmute C与Rust类型映射 Rust FFI 安全抽象范式 rust延迟初始化原语 rust重借用机制与原理 rust参数传递模型 汇编语言语法详解 gdb汇编调试 gdb-pwndbg的安装与使用指南 gdb调试插件gef C语言thread_local linux系统readelf命令使用指南 gcore转储进程内存 gdb查看命令 RGB与YUV颜色编码的区别 Rust原子类型 C++ STL求两个集合交集差集 gdb调试集锦 ubuntu24.0.4使用root用户登录 ubuntu24.0.4输入密码后跳回登录界面 AI内存压缩技术TurboQuant及存疑 ubuntu切换到指定内核版本 在没有顶级科技大佬直接背书的情况下deepseek为啥能够异军突起? HuggingFace和deepseek的关系 当前主流AI大模型 Rust写时克隆Cow系列2
如何预防rust不良的代码设计总结
PKICA · 2026-07-22 · via 博客园 - PKICA

屎山代码,也许是为了那个啥,故意写的,也有可能是水平有限,写了能跑即可的一堆代码。无论那一种,且不可自觉得意,因为屎山代码浪费的不是第一作者的时间,更是要接手者的命,迅哥曾说:浪费他人时间,等于谋财害命。那些不合理的代码本质上属于“非惯用写法”(Non-idiomatic Rust)、“代码异味”(Code Smells)或“不符合核心哲学”(Violations of Core Philosophies)的行为。

基于 Rust 官方标准库(std)、编译器指南、官方圣经《The Rust Programming Language》以及官方 Lint 工具 Clippy 的术语分类,来讲解一下这些不良的代码设计:

一、 破坏“零成本抽象”(Violations of Zero-Cost Abstractions)

官方定义:Rust 的核心基石之一。承诺“你没用到的东西,不需付出代价;你用到的东西,自己手写也不会更高效”。

  • 官方术语现象:堆分配对抗借用检查(Fighting Borrow Checker with Allocations)
    • 底层行为:在函数传参或数据流转时,为了规避借用检查器(Borrow Checker)关于生命周期的报错,频繁且盲目地在调用栈中插入 .clone()ToOwned::to_owned()String::from
    • 官方技术审查:这被 Clippy 归类为 clippy::perf(性能低效)。它强制在堆(Heap)上重新分配内存,将原本属于编译期的引用检查,变成了昂贵的运行时系统调用开销。
    • 官方推荐(Idiomatic):显式声明生命周期参数('a),或在需要“延迟分配/只读共享”的边界使用标准库提供的写时复制智能指针 std::borrow::Cow

二、 滥用“运行时借用”规避编译期保证

官方定义:Rust 追求将内存安全和并发安全约束在“编译期保证”(Compile-time Guarantee)。

  • 官方术语现象:无节制的动态所有权(Indiscriminate Dynamic Ownership)
    • 底层行为:为了绕开非循环图结构(DAG)的单一所有权限制,将普通业务对象全量包裹在 Rc<RefCell<T>>(单线程)或 Arc<Mutex<T>>(多线程)中。
    • 官方技术审查:这被视为一种“逃避编译期安全”的代码异味。它将借用规则推迟到了运行时,不仅引入了额外的引用计数与原子操作开销,还会导致程序在特定执行路径下触发 BorrowMutError 运行时崩溃(Panic)或陷入死锁(Deadlock)。
    • 官方推荐(Idiomatic):遵循官方倡导的“单一所有权树”架构;若必须构建复杂的图状网络,建议使用索引(利用 Vecusize 下标)作为替代,将所有权流向交还给编译器控制。

三、 未能实现“消除非法状态”(Failure to Make Illegal States Unrepresentable)

官方定义:利用 Rust 的强类型系统和丰富的代数数据类型(ADT),让不合法的业务状态在编译阶段就无法被表达出来。

  • 官方术语现象:基本类型偏执与字符串型(Primitive Obsession & Stringly-Typed)
    • 底层行为:直接使用基本数据类型(如 Stringu32)或无名元组 (String, String, bool) 来承载具有特定业务约束的数据(如邮件地址、订单状态)。
    • 官方技术审查:这属于 clippy::style(风格不当) 与 clippy::correctness(正确性隐患)。它导致开发者无法为特定数据赋予编译期约束,并且由于缺乏类型隔离,极易发生入参顺序颠倒导致的逻辑漏洞。
    • 官方推荐(Idiomatic):
      • Newtype 模式:使用元组结构体(如 struct Email(String);)进行类型包装,实现编译期类型安全。
      • 类型状态模式(Type-State Pattern):用不同的结构体代表实体的不同生命周期阶段(如 DraftPostPendingPostPublishedPost),让非法的函数调用在编译时直接报错。

四、 扭曲错误处理哲学(Misusing Error Handling)

官方定义:Rust 将异常区分为“可恢复错误”(Recoverable Error)和“不可恢复错误”(Unrecoverable Error),并拒绝引入隐式的 try-catch 运行时异常机制。

  • 官方术语现象:盲目解包与恐慌控制流(Blind Unwrapping & Panic as Control Flow)
    • 底层行为:在生产级代码中大量遗留 .unwrap().expect(),或者在应当处理常规业务异常的边界直接使用 panic! 宏。
    • 官方技术审查:此行为属于严重违背官方 clippy::correctness 的行为。panic! 会引发系统栈展开(Stack Unwinding),其设计初衷是应对毁灭性的不可恢复错误。将其用作控制流会导致程序弹性极差,面临服务意外下线的风险。
    • 官方推荐(Idiomatic):显式返回 Result<T, E>Option<T>。利用标准库的 ? 操作符(Error Propagation) 进行错误链条的优雅向上传递,配合流式组合子(如 .and_then().map_err())进行函数式处理。

五、 误用特质导致“抽象劣化”

官方定义:Rust 不支持类与继承,它依靠数据结构(Struct)和特质(Trait)提供静态分发的多态性。

  • 官方术语现象:过度面向对象伪装(Object-Oriented Emulation)
    • 底层行为:在 Trait 中声明过多且臃肿的默认方法来模拟类继承,或者在不需要运行时多态的场景下,滥用指针特征对象 Box<dyn Trait>
    • 官方技术审查:这属于 Clippy 中 clippy::pedantic(过度设计) 审查的范畴。过度引入 dyn Trait 意味着开启了动态分发(Dynamic Dispatch),程序必须通过虚表(Vtable)在运行时查找方法,直接破坏了编译器的内联优化(Inlining)和单态化(Monomorphization)加速。
    • 官方推荐(Idiomatic):在已知类型集合的情况下,优先使用 enum 结合模式匹配(Pattern Matching),这是高性能的静态分发;在需要多态约束时,优先使用特征限界(Trait Bounds)或 impl Trait,让编译器在编译期完成代码展开。

🔍 官方规范的核心标尺:Clippy 的五大分类

在 Rust 官方的工程落地中,判断一段代码是否跨过了“非惯用写法”的红线,依靠的是官方内置工具 Clippy 的审视标准:

  • clippy::correctness:代码存在导致死锁、内存踩踏、逻辑崩塌等致命隐患。
  • clippy::perf:代码违背了零成本抽象,引入了不必要的堆内存分配或运行时时钟周期消耗。
  • clippy::style:写法不符合 Idiomatic Rust 的清爽习惯,代码冗余。
  • clippy::complexity:将简单问题复杂化,写出了难以维护的复杂架构。
  • clippy::pedantic:属于高标准审查,主要检查暴露的 API 行为是否具备完美的严谨性。

参考资料: