【问题标题】:What C/C++ tools can check for buffer overflows? [closed]哪些 C/C++ 工具可以检查缓冲区溢出? [关闭]
【发布时间】:2010-09-15 02:18:43
【问题描述】:

有人要求我维护一个充满内存泄漏的大型 C++ 代码库。在四处寻找时,我发现我们有很多导致泄漏的缓冲区溢出(它是如何变得如此糟糕的,我不想知道)。

我决定先删除缓冲区溢出。为了让我更轻松地寻找错误,可以使用哪些工具来检查缓冲区溢出?

【问题讨论】:

    标签: c++ c buffer-overflow buffer-overrun


    【解决方案1】:

    在 Linux 上我会使用 Valgrind。

    【讨论】:

    • 有趣。一旦我想不出还有什么要修复的,我会看看这个代码库是否可以在 Linux 上编译(尽管我非常怀疑)。已投赞成票,因为其他人可能会发现您的回答很有用。
    • 只是缓冲区溢出有点矫枉过正......
    • 缓冲区溢出是一个非常讨厌的错误,因为结果不一定接近原因(即它可能会在 500 行之后崩溃)。如果堆栈被破坏,您将需要所有可以调试的帮助。这就是 Valgrind 大放异彩的地方——它会在溢出时立即捕获。
    • valgrind 有一些前端,比如 kcachegrind,使其更实用。
    • Valgrind 对于缓冲区溢出可能有点矫枉过正,但最初的问题提到程序充满了内存泄漏。 Valgrind 也应该有助于解决许多其他内存问题。
    【解决方案2】:

    考虑使用更现代的数据结构来避免缓冲区溢出。读入 std::string 不会溢出,而且 std::vectors 比数组安全得多。我不知道您的应用程序是什么,并且可能使用原始缓冲区是因为您需要速度,但更常见的是使用原始缓冲区,因为这是原始程序员所习惯的。

    使用提到的工具搜索内存泄漏是个好主意,但它们可能无法找到所有潜在的泄漏,而使用标准字符串和容器类可以消除您没有意识到的问题。

    【讨论】:

    • 这不适用于 C。
    【解决方案3】:

    IBM 的 Purify 会执行此操作,您在其下运行您的应用程序,它会给您报告所有错误(包括其他错误)。

    要消除内存泄漏,请使用 UMDH - 运行您的应用程序,拍摄内存快照,再次运行它,创建快照,然后使用差异工具查看自第一次运行以来所做的分配(请注意,您必须运行您的应用程序一次,并尽可能地拍摄快照)。

    【讨论】:

    • 很高兴知道它不能在 Windows 7 x64 上运行。
    【解决方案4】:

    检查electric-fence,它是专为缓冲区溢出而设计的!它不会减慢代码本身的速度(但会减慢分配/解除分配的速度)。它适用于 linux 和 windows。

    它通过在每个分配的空间之前和之后添加一个没有读写访问权限的段来工作。尝试访问此内存最终会导致 UNIX 上的分段错误和 Windows 上的内存冲突(或类似情况)。

    【讨论】:

    • 来源是here。显然它已被DUMA 取代
    【解决方案5】:

    女士:

    【讨论】:

    • 不错!但基于运行时。使用大型代码库(以 C 语言编写),您将主要测试程序的设计方式。攻击者可以花费数千小时阅读代码以找到内存泄漏漏洞。我本来希望有一个类似于 JavaScript 的自动化源代码分析工具。
    【解决方案6】:

    /GS 的问题是它实际上不会扫描错误。它只会在事后提醒你。似乎您正在寻找一种工具来扫描您现有的代码以查找潜在的缓冲区过度/不足运行。

    Microsoft PreFAST 工具是解决此问题和其他缺陷的好工具。

    Information here

    【讨论】:

      【解决方案7】:

      我很惊讶在 Windows 上没有人提到 Application Verifier (free!)。 Visual Leak Detector(在另一个答案中提到)对于跟踪多种类型的内存泄漏绝对是惊人的,但 Application Verifier 是跟踪内存错误(如缓冲区溢出、双重释放和释放后缓冲区使用)的首选工具(还有很多很多)。

      编辑:而且它非常非常易于使用。

      【讨论】:

      • 不错!但基于运行时。使用大型代码库(以 C 语言编写),您将主要测试程序的设计方式。攻击者可以花费数千小时阅读代码以找到内存泄漏漏洞。我本来希望有一个类似于 JavaScript 的自动化源代码分析工具。
      【解决方案8】:

      我投票给 Rational Purify。功能强大,价格相称。做很多问题的短工作,并且可以真正为自己付出代价。此外,在大多数 *nix 上都可用。不过,不确定 Windows。

      【讨论】:

        【解决方案9】:

        Compuware's Devpartner 的 BoundsChecker 组件在动态执行方面做得很好。对于静态测试,我建议将pc-lint and flex-lintRiverblade's visual lint 结合使用以提高可用性和报告能力。如果你收到了一个新的代码库,我建议你从静态分析开始,规则相当松散,这样你就可以抓住那些讨厌的东西。随着代码库的改进,您可以收紧规则集。

        如果您需要在 Windows Mobile / Windows CE 上执行此操作,请查看Entrek's code snitch

        另一个考虑代码是否进入该字段的工具是AQtrace,它主要分析用户计算机上的崩溃并将详细信息发送给您。 (以防万一所有的边界检查、净化、linting、valgrinding 等等……遗漏了什么)

        【讨论】:

          【解决方案10】:

          我的公司 Semantic Designs 正在寻找运行时 memory safety checker(包括缓冲区溢出)的 beta 测试人员,以检测所有类型的内存访问违规,甚至那些 valgrind 和 Purify 无法检测到的违规。目前这仅适用于 Windows C 程序,不适用于 C++ 或其他操作系统。

          编辑 2011 年 6 月 1 日:CheckPointer 工具已投入生产。仍然只有 C/Windows。 处理多种 C 方言:MS Visual C、GCC 3/4。

          2012 年 5 月 5 日编辑:CheckPointer 现在处理 C99,包括检查对标准 C 和 C99 库的调用。

          【讨论】:

            【解决方案11】:

            Visual Studio 有一个 /GS 编译器标志,可添加缓冲区溢出保护。还有其他的吗?

            【讨论】:

              【解决方案12】:

              你可以试试Visual Leak Detector - 我自己用过,这是我推荐用于内存泄漏检测的第一件事。

              【讨论】:

                【解决方案13】:

                我推荐 Jochen Kalmbach 的 CodeProject 上的免费“泄漏查找器”工具。有关此线程(以及其他答案)的更多详细信息,请参阅我的帖子memory leak question

                【讨论】:

                  【解决方案14】:

                  在 Windows 上,您可以使用内存泄漏/缓冲区溢出和其他运行时错误检测:

                  如果您有需要清理的大型项目,我认为它们物有所值。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-02-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-09-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-10-02
                    相关资源
                    最近更新 更多