当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用g++构建的C++中的运行时数组边界检查》经验,为你挑选了2个好方法。

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

Valgrind的Memcheck无法检测堆栈上分配的阵列上的溢出.

在通过启用GCC扩展-fbounds-checking是只对于C的前端实现.

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



1> 小智..:

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上阅读更多上下文.



2> Demi..:

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

valgrind --tool=exp-sgcheck  

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

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

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有