C++;用g+构建+; < C++ >使用 G++< /COD>?< /P>编译数组边界检查有没有方法?
Valgrind的Memcheck无法检测堆栈上分配的阵列上的溢出C++;用g+构建+; < C++ >使用 G++< /COD>?< /P>编译数组边界检查有没有方法?,c++,arrays,C++,Arrays,Valgrind的Memcheck无法检测堆栈上分配的阵列上的溢出 问题是 理想情况下,不应以任何方式修改源代码。使用std::vector,std::tr1::array或boost::array不是一个选项,因为代码库很大,这样的移位不可行。有一个名为(以前称为Ptrcheck)的Valgrind工具,它可以检查堆栈数组边界溢出 valgrind --tool=exp-sgcheck <program> <arguments> valgrind--tool=exp
理想情况下,不应以任何方式修改源代码。使用
std::vector
,std::tr1::array
或boost::array
不是一个选项,因为代码库很大,这样的移位不可行。有一个名为(以前称为Ptrcheck)的Valgrind工具,它可以检查堆栈数组边界溢出
valgrind --tool=exp-sgcheck <program> <arguments>
valgrind--tool=exp sgcheck。其中之一是:
平台:堆栈/全局检查在PowerPC、ARM上无法正常工作
或S390X平台,仅适用于X86和AMD64目标。那是因为
堆栈和全局检查需要跟踪函数调用和退出
可靠地,而且在使用链接的ABI上没有明显的方法可以做到这一点
注册函数返回
(<代码> -fMutFor < /Cord>)可以对C进行边界检查,但不能处理2012年中期的所有C++代码(例如:代码> STD::vector < /代码>)。2015年年中,GCC 4.9中删除了该物质,并由地址消毒剂取代。挡泥板选项仍然存在,但什么也不做
还有一个补丁——Mudflap通过引用对象进行了改进。有关更多信息,请参阅its。还有,
我试了一下米罗。它看起来非常好,但是可能不会用100%的C++代码工作。我打算在开发过程中使用MIRO,然后在发布时关闭它(并使用常规编译器)。如果您正在编写自己的代码,那么使用MIRO应该相当容易。谷歌是一个编译器检测模块和运行时库,它可以检出对堆、堆栈和全局的绑定访问。它是可用的,并且是可用的
要使用它,请将参数中的-fsanize=address
(或旧式Clang 3.1中的-faddress sanitarizer
)传递给编译器和链接器(链接asan
;无需显式-lasan
)。要在错误消息中获得更好的堆栈跟踪,请将-fno省略帧指针
传递给编译器
它最初用于铬测试,现在也是。有一个很好的例子。您可能还需要阅读更多上下文