使用g ++构建的C++中的运行时数组边界检查

ara*_*dia 19 c++ arrays

有没有办法在C++编译中使用g++?进行数组边界检查?

理想情况下,不应以任何方式修改源代码.使用std::vector,std::tr1::array或者boost::array是不是一种选择,因为它的代码量很大,这样的转变将是不可行的.

小智 9

Google的AddressSanitizer是一个编译器检测模块和运行时库,可以检查对堆,堆栈和全局变量的越界访问.它适用于Clang 3.1+GCC 4.8+.

要使用它,在编译器和链接器的参数之间传递-fsanitize=address(或-faddress-sanitizer在旧的Clang 3.1中)(链接asan;不需要显式-lasan).要在错误消息中获得更好的堆栈跟踪,请传递-fno-omit-frame-pointer给编译器.

它最初用于Chromium测试,自2012年起,它也被Firefox开发人员使用.关于如何使用Qt运行它有一篇很好的博客文章.您可能还想在Wikipedia上阅读更多上下文.


Dem*_*emi 6

有一个名为SGCheck的Valgrind工具(以前称为Ptrcheck)可以检查堆栈数组的超限.

valgrind --tool=exp-sgcheck <program> <arguments>
Run Code Online (Sandbox Code Playgroud)

该工具仍然标记为实验性,它有一些限制.其中之一是:

平台:堆栈/全局检查在PowerPC,ARM或S390X平台上无法正常工作,仅适用于X86和AMD64目标.这是因为堆栈和全局检查需要可靠地跟踪函数调用和退出,并且在使用链接寄存器进行函数返回的ABI上没有明显的方法.