GCC `-fsanitize=bounds` 与 `std::array` 的奇怪行为

2023-12-22

我正在尝试使用以下命令找出代码中的越界问题-fsanitize=bounds选项,但我面临着奇怪的行为:

例如在下面的代码中:

#include <cstdlib>
#include <array>

int main (int, char **)
{
    std::array <char, 1> a;
    const char b = a [X]; // X <--- put index here!

    return EXIT_SUCCESS;
}

使用选项编译:$ g++ -std=c++11 -fsanitize=bounds -O0 main.cpp -o main.

如果我尝试访问索引大于 1 的元素,则会报告错误:/usr/include/c++/5/array:53:36: runtime error: index 2 out of bounds for type 'char [1]' .

但如果我尝试访问索引为 1 的元素,一切正常并且不会报告任何错误。

这是预期的行为吗?可能是我错过了什么?

该示例经过测试:

  • $ g++ --version g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609;
  • $ g++ --version g++ (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005.

UPDATE
我试过-fsanitize=bounds-strict在 GCC 6 中,结果相同。


我无法立即找到这方面的文档(或者,实际上,任何类型的强大文档),但我觉得这很可能是该功能的实现细节。获取尾后一位指针是合法的,因此实现无法捕获这一点。看来实现是通过查看指针来工作的,而不是等待这样的指针被取消引用(如果您考虑如何创建-fsanitize=bounds).

简而言之,这可能只是该工具的限制。

在 GCC 6 中,你可以尝试-fsanitize=bounds-strict这增加了该工具的强度(包括添加对检测对灵活的类成员数组的 OOB 访问的支持)。

我无法判断这是库还是编译器问题,但无论哪种方式,值得注意的是,同样的问题目前是针对 clang 的一个未解决的错误(#21485 https://llvm.org/bugs/show_bug.cgi?id=21485),并且评论中的假设与我上面的漫谈相符。

第三方文章ubsan http://developers.redhat.com/blog/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan/也意味着这最终是预期的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC `-fsanitize=bounds` 与 `std::array` 的奇怪行为 的相关文章

随机推荐