Rust是否需要"defer"机制?

2024-11-06

本文探讨了在Rust中使用类似`defer`机制的必要性,尤其是在与C语言进行FFI(外部函数接口)交互时。作者通过一个分配和释放内存的示例,演示了直接使用`libc::free`释放Rust分配的内存会导致未定义行为。文章分析了`Vec`的内存管理细节,指出直接使用`free`释放`Vec`指针的风险。作者尝试了多种解决方案,包括使用`Box::from_raw`、自定义`OwningArrayC`结构体以及`scopeguard`库提供的`defer!`宏,但都遇到了各种问题,例如与借用检查器冲突。最终,作者提出Rust需要内置`defer`机制或改进借用检查器,以简化FFI编程并提高安全性。

阅读更多
未分类 defer

每日技巧 #2:更安全的Arena分配器

2024-11-04

本文介绍了一种更安全的Arena分配器,通过在分配的内存区域前后添加保护页来防止越界访问。Arena分配器将具有相同生命周期的多个分配分组到一个批次中,一次性分配和释放,从而简化代码并提高性能。然而,标准的Arena分配器容易出现越界写入错误,导致难以调试的问题。本文提出的解决方案是在Arena创建时,在实际分配的内存前后添加保护页,并将这些页面标记为不可读写,任何访问都会触发SIGSEGV信号,从而更容易诊断越界访问错误。文章还讨论了其他安全措施,例如每个类型一个bucket的分配策略以及更严格的单页分配方法。

阅读更多
未分类 Arena分配器

从成功的Rust重写项目中汲取的经验教训

2024-10-30

作者回顾了一个C++项目到Rust的增量式重写过程,总结了Rust的优势和遇到的挑战。优势包括简化代码、提升性能、更容易发现代码bug、方便的跨平台编译和内置测试框架。劣势主要集中在与C/C++交互时,`unsafe`代码块易引入未定义行为,Miri和Valgrind的局限性,内存泄漏问题,跨平台编译和Cbindgen工具的不足,不稳定的ABI,缺少自定义内存分配器的支持,以及Rust本身和FFI相关的复杂性。作者认为Rust在纯Rust项目中表现出色,但在与C/C++交互时仍存在很多问题,并表示未来可能会考虑使用Zig进行类似的重写工作。

阅读更多
未分类

像 1987 年那样从头开始写一个电子游戏

2024-06-20

本文介绍了如何使用 Odin 编程语言和 X11 协议从零开始编写一个类似于扫雷的游戏。文章详细讲解了连接 X 服务器、创建窗口、加载资源、处理键盘和鼠标事件以及实现游戏逻辑的步骤,并提供了完整的代码示例。作者强调了这种方法的优势在于应用程序体积小巧、独立性强,可以在任何 Unix 系统上运行。

阅读更多
未分类 Odin 编程语言