#reference #variables #container #key #opaque #mutable #object

no-std cursedcontainer

一个带有不透明键的“诅咒”容器,可作为静态变量使用

3 个版本

0.1.2 2021 年 12 月 19 日
0.1.1 2021 年 12 月 18 日
0.1.0 2021 年 12 月 18 日

#12 in #opaque

MIT 许可证

9KB
79 行代码(不包括注释)

cursedcontainer

Crates.io Workflow status

请,为了世界上所有美好的事物,除非你彻底阅读了代码并理解了使用这样一件完全不安全的软件的后果,否则请不要使用这个包。你已经收到警告。

一个带有不透明键类型的“诅咒”容器,允许检索包含在其中的对象的可变引用。

CursedContainer 是一个同步首次使用初始化的 Vec<T> 包装器,其中内层 Vec 中的对象本身被包含在一个 UnsafeCell 中,允许在不拥有 CursedContainer 的可变引用的情况下检索这些对象的可变引用。

这种设计允许将 CursedContainer 赋值给 static 变量,如下所示

static CONTAINER: CursedContainer<usize> = CursedContainer::new();

let key = CONTAINER.insert(69420);
assert_eq!(CONTAINER.get(key), Some(&mut 69420));

安全性

哈哈,好笑。

CursedContainer 中内置了一些关于初始化竞争条件的安全性,但访问容器中的项目是按设计不安全的 - 它允许检索存储在容器中相同对象的可变引用的多个副本。

确保使用 CursedContainer 时不会出现严重错误的责任在于您的应用程序代码。

但是...为什么?

这个crate是为作者的爱好操作系统项目开发的,这里的缺乏安全性是为了这个目的而设计的。

许可证

cursedcontainer 根据 MIT 许可证授权,其文本可以在 LICENSE 文件 中找到,或者可以在 https://opensource.org/licenses/MIT 上找到。

依赖项

~150KB