哪些C / C ++工具可以检查缓冲区溢出?
我被要求维护一个充满内存泄漏的大型C ++代码库。闲逛时,我发现我们有很多导致缓冲区泄漏的缓冲区溢出(它是如何变得如此糟糕的,我永远都不想知道)。
我决定先删除缓冲区溢出。为了使我的错误查找更加容易,可以使用哪些工具检查缓冲区溢出?
解决方案
Visual Studio具有一个/ GS编译器标志,该标志添加了缓冲区溢出保护。还有其他吗?
在Linux上,我将使用Valgrind。
我们可以尝试我自己使用过的Visual Leak Detector,这是我建议用于内存泄漏检测的第一件事。
/ GS的问题是它实际上不会扫描错误。事实发生后,它只会提醒我们。似乎我们在寻找一种工具,该工具将扫描现有代码以查找可能的运行过度/不足的缓冲区。
Microsoft PreFAST工具是解决此问题和其他缺陷的一个很好的工具。
这里的信息
IBM的Purify将执行此操作,在该程序下运行应用程序,它将为我们提供所有错误(包括其他错误)的报告。
要消除内存泄漏,请使用UMDH运行应用程序,对内存进行快照,再次运行,然后快照,然后使用diff工具查看自第一次运行以来所做的分配(请注意,我们必须运行一次应用程序,然后执行最好的快照)。
检查一下电子围栏,它只是为缓冲区溢出而设计的!它不会减慢代码本身的速度(但是会减慢分配/取消分配的速度)。它适用于linux和Windows。
它通过在每个分配的空间前后添加一个没有读或者写访问权限的段来工作。尝试访问此内存最终会在UNIX上出现分段错误,而在Windows上则会出现内存冲突(或者类似问题)。
我的投票投给Rational Purify。价格极其强大。缩短很多问题的工作时间,并且可以真正收回成本。而且,在大多数* nix上可用。不过,不确定Windows。
我建议Jochen Kalmbach在CodeProject上使用免费的" leakfinder"工具。有关此线程泄漏问题的更多信息,请参阅我的帖子(以及其他答案)
小姐:
- UMDH.exe工具:http://support.microsoft.com/kb/268343
- / analyze编译器选项(免费提供最新的Microsoft SDK)
考虑使用更现代的数据结构来避免缓冲区溢出。读入std :: string不会溢出,并且std :: vectors比数组安全得多。我不知道应用程序是什么,并且可能会因为需要速度而使用原始缓冲区,但是使用原始缓冲区是更常见的,因为这是原始程序员感到满意的。
使用提到的工具搜索内存泄漏是一个好主意,但是它们可能找不到所有潜在的泄漏,而使用标准字符串和容器类可以消除我们没有意识到的问题。
在Windows上,对于内存泄漏/缓冲区超限和其他运行时错误检测,可以使用:
- 来自Compuware(http://www.compuware.com/products/devpartner/visualc.htm)的Boundschecker
- IBM Rational Purify
我认为,如果我们有需要清理的大型项目,它们值得我们付出代价。
Compuware Devpartner的BoundsChecker组件在动态执行方面做得很好。对于静态测试,我建议将pc-lint和flex-lint与Riverblade的视觉皮棉结合使用,以提高可用性和报告功能。如果我们已经掌握了新的代码库,我建议我们先从具有适当宽松规则的静态分析开始,这样我们就可以抓住讨厌的东西。随着代码库的改进,我们可以收紧规则集。
如果我们需要在Windows Mobile / Windows CE上执行此操作,请查看Entrek的代码告密者
另一个考虑代码是否进入该字段的工具是AQtrace,它基本上分析用户计算机上的崩溃并向我们发送详细信息。 (以防万一边界检查,净化,掉毛,打磨等都错过了某些东西)
我很惊讶没有人提到Windows上的Application Verifier(免费!)。 Visual Leak Detector(在另一个答案中提到)对于跟踪多种类型的内存泄漏绝对是惊人的,但是Application Verifier是跟踪内存错误(如缓冲区溢出,两次释放以及释放后使用缓冲区,以及更多,还有更多)的佼佼者。
编辑:这是非常非常容易使用。