LLVM 项目正在开发用于在 C++ 中安全地使用缓冲区的工具

LLVM 项目的开发人员提出了一些更改,旨在加强关键任务 C++ 项目的安全性,并提供一种方法来消除缓冲区溢出引起的错误。 这项工作主要集中在两个领域:提供允许安全使用缓冲区的开发模型,以及努力加强 libc++ 标准函数库的安全性。

建议的 C++ 安全编程模型涉及在使用缓冲区时使用标准库提供的类,而不是操作裸指针。 例如,建议使用 std::array、std::vector 和 std::span 类,这将为过度分配的内存添加运行时检查。

为了打击 clang 中的危险编程实践,建议显示所有指针算术运算的编译器警告,类似于使用“cppcoreguidelines-pro-bounds-pointer-arithmetic”标志时输出的 clang-tidy linter 警告,对此的支持将出现在版本 LLVM 16 中。为了启用此类警告,将向 clang 添加一个单独的标志,默认情况下不处于活动状态。

计划在 libc++ 中实现一个可选的增强保护模式,启用该模式后,将在运行时捕获一些导致未定义行为的情况。 例如,在 std::span 和 std::vector 类中,将监视越界内存访问,如果检测到,程序将崩溃。 开发人员相信,添加此类更改将使 libc++ 保持符合 C++ 标准,因为如何处理未定义行为的情况取决于库开发人员的选择,他们可能会将未定义行为视为失败,从而要求程序终止。

libc++ 中的运行时检查计划分为可单独启用的类别。 一些建议的检查不会导致操作的复杂性或 ABI 的更改,已经在 libc++ 安全模式中实现。

此外,计划准备用于更新代码的工具,允许您用容器替换带有裸指针的变量,并在容器无法直接替换指针的情况下使用替代处理程序(例如,“if(array_pointer)”构造可以转换为“if(span.data) ()”)。调整不仅可以应用于局部变量,还可以应用于指针类型的参数。

来源: opennet.ru

添加评论