首页
/ Embassy项目中的select_slice函数内存安全问题分析

Embassy项目中的select_slice函数内存安全问题分析

2025-06-01 19:45:00作者:邓越浪Henry

问题背景

在Embassy项目的异步编程框架中,select_slice函数被设计用于同时等待多个Future中的任意一个完成。然而,该函数的当前实现存在严重的内存安全问题,可能导致未定义行为(UB)或程序输出错误结果。

问题现象

通过一个简单的测试用例可以重现这个问题。程序创建了两个异步任务,使用select_slice等待其中一个完成,然后交换已完成和未完成的Future,最后尝试执行交换后的Future。在Miri(一个Rust的内存安全检查工具)下运行时,会报告"Undefined Behavior"错误;在常规运行时会输出随机内存地址而非预期值。

技术原理分析

问题的核心在于select_slice函数错误地处理了Future的Pin语义。具体来说:

  1. 该函数接受一个可变引用(&mut [Fut])作为参数,内部将这些Future转换为Pin<&mut Fut>进行轮询
  2. 函数返回后,这些Future又变回普通的可变引用
  3. 用户代码可以对这些Future进行移动或交换操作,违反了Pin的保证

在Rust的异步编程模型中,Pin类型用于确保某些Future不会被移动,因为它们可能包含自引用结构。当这些Future被移动后,自引用指针将指向错误的内存位置。

解决方案

正确的做法应该是让select_slice函数接受Pin<&mut [Fut]>作为参数。这样:

  1. 调用者必须首先将Future数组固定(Pin)在内存中
  2. 函数内部可以直接安全地获取每个Future的Pin引用
  3. 函数返回后,Future仍然保持固定状态,防止用户代码进行非法移动操作

这种修改保持了API的安全性,同时解决了内存安全问题。它强制调用者在调用select_slice之前就考虑好内存固定的问题,而不是在函数内部临时固定。

未来改进方向

虽然上述解决方案可以修复当前的内存安全问题,但从长远来看还有优化空间:

  1. 当Rust的分配器API稳定后,可以考虑接受Box<[Fut]>参数,这样可以在堆上分配并自动固定Future数组
  2. 另一种思路是使用&mut [Option]参数,让函数能够在完成时安全地释放其他Future

不过需要注意的是,Option方案需要谨慎处理,因为单纯依赖Option的析构函数来释放Future可能仍然存在安全问题。

总结

这个案例展示了在异步编程中正确处理Pin语义的重要性。Embassy项目的select_slice函数由于忽略了Pin的生命周期管理,导致了潜在的内存安全问题。通过修改API签名来强制提前固定内存,可以有效地解决这个问题,同时也为未来的API改进奠定了基础。

登录后查看全文
热门项目推荐

项目优选

收起
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
156
2 K
kernelkernel
deepin linux kernel
C
22
6
pytorchpytorch
Ascend Extension for PyTorch
Python
38
72
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
519
50
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
942
555
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
195
279
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
993
396
communitycommunity
本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息
359
12
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
146
191
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Python
75
71