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

时间:2010-02-18 18:26:06

标签: c++ arrays

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

理想情况下,不应以任何方式修改源代码。使用std::vectorstd::tr1::arrayboost::array不是一种选择,因为代码库很大,而且这种转变是不可行的。

3 个答案:

答案 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应该相当容易。