为 Rust 引入 RealtimeSanitizer

几个月前,作者在布里斯托尔的[AudioDevCon]会议上首次发表了关于 Rust 在音频应用方面的演讲。在那里,作者结识了 Chris 和 David,他们介绍了[RealtimeSanitizer (RTSan)]工具,该工具将正式纳入 LLVM20。

RTSan 是开发者工具包的强大补充,有助于检测代码中的实时违规行为,尤其对于实时编程新手来说具有挑战性。当时 RTSan 仅适用于 C++,他们正在寻找能帮助使其在 Rust 中可用的人,鉴于社区的兴趣增长,作者接受了挑战,现在第一个版本已可用。

现在就测试它

理解实时约束

实时编程需要保证代码在特定时间框架内完成,如自动驾驶汽车在检测到行人穿过街道时必须在保证的毫秒数内刹车,音频编程也有实时要求,否则会出现音频故障,在航空航天、机器人、工业自动化等领域实时要求也很关键。

什么使代码非实时安全

实时安全代码要求每行代码的执行时间可预测,不能阻塞等待外部操作,这排除了网络请求等操作,即使标准库函数也可能导致问题,使用第三方代码需仔细审查。

RTSan 如何工作

它在检测到 malloc 等实时违规时引发运行时错误,虽不完美但很有价值,作者已发现一些意想不到的内存分配情况。

使其在 Rust 中可用

RTSan 将随 LLVM20 提供,Rust 最终会采用,可像其他 sanitizer 一样在不稳定 Rust 中集成并使用-Zsanitizer=realtime标志。RTSan 引入了[[clang::nonblocking]][[clang::blocking]]属性来标记特定函数,还创建了[rtsan-standalone-rs]以在稳定 Rust 中提供立即访问。

实现

得益于现有的[C-Header],Rust 包装器由三个 crate 组成,rtsan-standalone提供安全包装器和scoped_disabler宏,rtsan-standalone-macros实现宏,rtsan-standalone-sys处理底层集成。

使用 sanitizer

通过功能标志可选加入,在 Cargo.toml 中添加依赖和功能,所有宏和函数在功能关闭时无成本,示例展示了如何使用 RTSan 捕获实时违规,如标记音频处理函数为非阻塞。

特殊情况:互斥锁

发现 Linux 和 macOS 中互斥锁实现不同,macOS 首次锁操作触发分配,Linux 使用 futex 实现,RTSan 仅在 Linux 求助于系统调用时检测到,在实时上下文中使用此类互斥锁涉及复杂的无锁编程领域。

扩展功能

查看示例了解其他功能,如blocking宏、scoped_disabler宏、no_sanitize_realtime等,以及可通过运行时标志自定义 RTSan 行为。

了解更多

参与

欢迎反馈和贡献,可通过DiscordRealtimeSanitizer (RTSan)Email:[mailto:realtime.sanitizer@gma...]。

阅读 6
0 条评论