没有生命周期参数的内存安全

这是一份关于在 C++中实现无寿命注解的内存安全引用类型的提案,主要内容总结如下:

  • 目标与背景:提案旨在探索无寿命参数的内存安全可行性,解释使旧的左值和右值引用内存安全的不可行性,并解决使用寿命注解的安全模型的常见反对意见。“Safe C++”引入了带寿命参数的借检查模型,增加了表达性但使类型系统更复杂,本提案提出一种无需寿命注解的替代借检查风格。
  • 安全引用(Safe references):引入新的“安全引用”标记T%,不接受寿命参数,其寿命参数化由函数类型决定。自由函数中所有参数寿命长于函数调用期间的单个发明寿命,非静态成员函数中隐式对象参数寿命长于发明寿命,发明寿命又长于返回的安全引用。
  • 排他性(Exclusivity)T%是可变安全引用,不能与其他重叠位置的引用别名;const T%是共享安全引用,可以与其他共享安全引用别名但不能与可变引用别名。安全引用强制排他性,而旧的引用类型不支持,需要单独的安全和不安全引用类型以保证健全性和表达性。
  • 约束规则(Constraint rules):实现了两组约束规则,自由函数通过参数寿命最短来约束返回引用,非静态成员函数通过隐式对象寿命来约束返回引用。非静态成员函数的约束规则反映了资源由类对象拥有的理念,同时也提供了一定的自由。
  • 二等引用(Second-class references):引用可分为一等和二等,参数传递指令如ininout相当于二等引用。这里的安全引用比二等引用更强大,可以从函数返回和构成对象,但编译器仍需实现借检查。
  • 其他安全方面(Other aspects of safety):详细介绍了 Safe C++中的四类内存安全,包括寿命安全、类型安全、线程安全和运行时检查。关键是在函数类型中添加safe-specifier,优先将重点放在向新代码过渡到安全编码实践上。
  • 实现一等引用(Achieving first-class references):目前的安全引用设计还不足以替代 C++中所有必要的不安全机制,如迭代器、视图和具有引用语义的 RAII 类型等。对于具有引用数据成员的用户定义类型,需要加强安全引用的支持,如使用协程、延迟表达式或析构函数等方式,但都存在问题。Rust 的寿命参数是解决一等安全引用的唯一已知可行方案,它能解决安全引用在处理引用引用时的不足,且有成熟的健全性理论,C++应采用以实现与其他安全语言的安全对等。此外,采用该特性对于改善 C++/Rust 互操作性也非常重要。
阅读 10
0 条评论