【发布时间】:2010-09-15 02:18:43
【问题描述】:
有人要求我维护一个充满内存泄漏的大型 C++ 代码库。在四处寻找时,我发现我们有很多导致泄漏的缓冲区溢出(它是如何变得如此糟糕的,我不想知道)。
我决定先删除缓冲区溢出。为了让我更轻松地寻找错误,可以使用哪些工具来检查缓冲区溢出?
【问题讨论】:
标签: c++ c buffer-overflow buffer-overrun
有人要求我维护一个充满内存泄漏的大型 C++ 代码库。在四处寻找时,我发现我们有很多导致泄漏的缓冲区溢出(它是如何变得如此糟糕的,我不想知道)。
我决定先删除缓冲区溢出。为了让我更轻松地寻找错误,可以使用哪些工具来检查缓冲区溢出?
【问题讨论】:
标签: c++ c buffer-overflow buffer-overrun
在 Linux 上我会使用 Valgrind。
【讨论】:
考虑使用更现代的数据结构来避免缓冲区溢出。读入 std::string 不会溢出,而且 std::vectors 比数组安全得多。我不知道您的应用程序是什么,并且可能使用原始缓冲区是因为您需要速度,但更常见的是使用原始缓冲区,因为这是原始程序员所习惯的。
使用提到的工具搜索内存泄漏是个好主意,但它们可能无法找到所有潜在的泄漏,而使用标准字符串和容器类可以消除您没有意识到的问题。
【讨论】:
IBM 的 Purify 会执行此操作,您在其下运行您的应用程序,它会给您报告所有错误(包括其他错误)。
要消除内存泄漏,请使用 UMDH - 运行您的应用程序,拍摄内存快照,再次运行它,创建快照,然后使用差异工具查看自第一次运行以来所做的分配(请注意,您必须运行您的应用程序一次,并尽可能地拍摄快照)。
【讨论】:
检查electric-fence,它是专为缓冲区溢出而设计的!它不会减慢代码本身的速度(但会减慢分配/解除分配的速度)。它适用于 linux 和 windows。
它通过在每个分配的空间之前和之后添加一个没有读写访问权限的段来工作。尝试访问此内存最终会导致 UNIX 上的分段错误和 Windows 上的内存冲突(或类似情况)。
女士:
【讨论】:
/GS 的问题是它实际上不会扫描错误。它只会在事后提醒你。似乎您正在寻找一种工具来扫描您现有的代码以查找潜在的缓冲区过度/不足运行。
Microsoft PreFAST 工具是解决此问题和其他缺陷的好工具。
【讨论】:
我很惊讶在 Windows 上没有人提到 Application Verifier (free!)。 Visual Leak Detector(在另一个答案中提到)对于跟踪多种类型的内存泄漏绝对是惊人的,但 Application Verifier 是跟踪内存错误(如缓冲区溢出、双重释放和释放后缓冲区使用)的首选工具(还有很多很多)。
编辑:而且它非常非常易于使用。
【讨论】:
我投票给 Rational Purify。功能强大,价格相称。做很多问题的短工作,并且可以真正为自己付出代价。此外,在大多数 *nix 上都可用。不过,不确定 Windows。
【讨论】:
Compuware's Devpartner 的 BoundsChecker 组件在动态执行方面做得很好。对于静态测试,我建议将pc-lint and flex-lint 与Riverblade's visual lint 结合使用以提高可用性和报告能力。如果你收到了一个新的代码库,我建议你从静态分析开始,规则相当松散,这样你就可以抓住那些讨厌的东西。随着代码库的改进,您可以收紧规则集。
如果您需要在 Windows Mobile / Windows CE 上执行此操作,请查看Entrek's code snitch
另一个考虑代码是否进入该字段的工具是AQtrace,它主要分析用户计算机上的崩溃并将详细信息发送给您。 (以防万一所有的边界检查、净化、linting、valgrinding 等等……遗漏了什么)
【讨论】:
我的公司 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 库的调用。
【讨论】:
Visual Studio 有一个 /GS 编译器标志,可添加缓冲区溢出保护。还有其他的吗?
【讨论】:
你可以试试Visual Leak Detector - 我自己用过,这是我推荐用于内存泄漏检测的第一件事。
【讨论】:
我推荐 Jochen Kalmbach 的 CodeProject 上的免费“泄漏查找器”工具。有关此线程(以及其他答案)的更多详细信息,请参阅我的帖子memory leak question
【讨论】:
在 Windows 上,您可以使用内存泄漏/缓冲区溢出和其他运行时错误检测:
如果您有需要清理的大型项目,我认为它们物有所值。
【讨论】: