我正在尝试使用以下命令找出代码中的越界问题-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(使用前将#替换为@)