有没有办法在使用g++
编译的C ++中进行数组边界检查?
Valgrind的Memcheck无法检测堆栈上分配的数组上的溢出。
GCC extension enabled by -fbounds-checking
为only implemented for the C front end。
理想情况下,不应以任何方式修改源代码。使用std::vector
,std::tr1::array
或boost::array
不是一种选择,因为代码库很大,而且这种转变是不可行的。
答案 0 :(得分:8)
Google的AddressSanitizer是一个编译器检测模块和运行时库,可以检查对堆,堆栈和全局变量的越界访问等。它可用in Clang 3.1+和in GCC 4.8+。
要使用它,请在编译器和链接器的参数中传递-fsanitize=address
(或旧的Clang 3.1中的-faddress-sanitizer
)(链接asan
;不需要显式{{1 }})。要在错误消息中获得更好的堆栈跟踪,请将-lasan
传递给编译器。
它最初用于Chromium测试,since 2012,它也是used by Firefox devs。有一个很好的blog post on how to get it running with Qt。您可能还想阅读更多上下文on Wikipedia。
答案 1 :(得分:6)
有一个名为SGCheck的Valgrind工具(以前称为Ptrcheck)可以检查堆栈数组边界是否超出。
valgrind --tool=exp-sgcheck <program> <arguments>
该工具仍然标记为实验性工具,它带有几个limitations。其中之一是:
平台:堆栈/全局检查在PowerPC,ARM上无法正常工作 或S390X平台,仅适用于X86和AMD64目标。那是因为 堆栈和全局检查需要跟踪函数调用和退出 可靠,并且在使用链接的ABI上没有明显的方法 注册函数返回。
答案 2 :(得分:1)
GCC mudflap(-fmudflap
)可以对C进行边界检查,但截至2012年中期无法处理所有C ++代码(例如std::vector
)。它在2015年中期被GCC 4.9删除,被Address Sanitizer取代。 mudflap选项仍然存在,但什么都不做。
有MIRO补丁 - M udflap 我受到 R 指示 O 对象的影响。有关详细信息,请参阅其homepage。此外,还有a paper about it。
我曾短暂地尝试过MIRO。它看起来非常好,但也许不适用于100%的C ++代码。我打算在开发期间使用MIRO,然后将其关闭(并使用常规编译器)进行发布。如果您正在编写自己的代码,那么使其适用于MIRO应该相当容易。