23

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

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

4

14 回答 14

27

在 Linux 上,我会使用 Valgrind。

于 2008-10-03T14:42:24.507 回答
10

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

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

于 2008-10-03T14:54:50.953 回答
8

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

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

于 2008-10-03T14:44:31.427 回答
4

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

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

于 2008-10-03T14:44:58.103 回答
3

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

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

信息在这里

于 2008-10-03T14:43:46.063 回答
3

多发性硬化症:

于 2008-10-03T14:48:20.953 回答
3

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

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

于 2009-07-19T01:58:28.320 回答
2

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

于 2008-10-03T14:45:32.563 回答
2

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

如果您需要在 Windows Mobile / Windows CE 上执行此操作,请查看Entrek 的代码告密者

另一个需要考虑代码是否进入现场的工具是AQtrace,它主要分析用户机器上的崩溃并向您发送详细信息。(以防万一所有的边界检查、净化、棉绒、valgrinding 等.. 遗漏了一些东西)

于 2008-10-03T15:15:33.190 回答
2

我的公司Semantic Designs正在寻找用于检测所有类型的内存访问违规的运行时内存安全检查器(包括缓冲区溢出)的 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 库的调用。

于 2011-02-26T03:40:33.233 回答
1

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

于 2008-10-03T14:40:14.823 回答
1

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

于 2008-10-03T14:43:32.087 回答
1

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

于 2008-10-03T14:47:30.610 回答
0

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

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

于 2008-10-03T15:07:26.513 回答