【问题标题】:Runtime array bounds checking in C++ built with g++使用 g++ 构建的 C++ 中的运行时数组边界检查
【发布时间】:2010-02-18 18:26:06
【问题描述】:

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

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

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    Google 的 AddressSanitizer 是一个编译器检测模块和运行时库,可以检查对堆、堆栈和全局变量等的越界访问。可用in Clang 3.1+in GCC 4.8+

    要使用它,请将-fsanitize=address(或旧Clang 3.1 中的-faddress-sanitizer)传递给编译器和链接器(链接asan;不需要显式-lasan)。要在错误消息中获得更好的堆栈跟踪,请将 -fno-omit-frame-pointer 传递给编译器。

    它最初用于 Chromium 测试,since 2012,它也是used by Firefox devs。有一个很好的blog post on how to get it running with Qt。您可能还想阅读更多上下文on Wikipedia

    【讨论】:

      【解决方案2】:

      有一个名为 SGCheck(以前称为 Ptrcheck)的 Valgrind 工具可以检查堆栈数组边界是否溢出。

      valgrind --tool=exp-sgcheck <program> <arguments>
      

      该工具仍被标记为实验性的,它带有几个limitations。其中之一是:

      平台:堆栈/全局检查无法在 PowerPC、ARM 上正常工作 或 S390X 平台,仅适用于 X86 和 AMD64 目标。那是因为 堆栈和全局检查需要跟踪函数调用和退出 可靠,并且在使用链接的 ABI 上没有明显的方法可以做到这一点 注册函数返回。

      【讨论】:

        【解决方案3】:

        GCC mudflap (-fmudflap) 可以对 C 进行边界检查,但不能处理截至 2012 年中期的所有 C++ 代码(例如 std::vector)。它于 2015 年年中在 GCC 4.9 中被删除,由 Address Sanitizer 取代。挡泥板选项仍然存在,但什么也不做。

        MIRO 补丁 - Mudflap Referent Objects 改进。有关更多信息,请参阅其homepage。还有a paper about it

        我曾短暂尝试过 MIRO。它似乎非常好,但可能不适用于 100% 的 C++ 代码。我打算在开发过程中使用 MIRO,然后将其关闭(并使用常规编译器)进行发布。如果您正在编写自己的代码,那么使用 MIRO 应该相当容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-14
          • 2013-06-22
          • 2019-10-19
          • 2018-04-17
          • 2012-03-07
          • 2015-09-02
          • 2020-09-12
          • 1970-01-01
          相关资源
          最近更新 更多