Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;用g+构建+; < C++ >使用 G++< /COD>?< /P>编译数组边界检查有没有方法?_C++_Arrays - Fatal编程技术网

C++;用g+构建+; < C++ >使用 G++< /COD>?< /P>编译数组边界检查有没有方法?

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

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

  • 问题是


  • 理想情况下,不应以任何方式修改源代码。使用
    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省略帧指针
    传递给编译器

    它最初用于铬测试,现在也是。有一个很好的例子。您可能还需要阅读更多上下文