我被要求维护一个充满内存泄漏的大型C ++代码库。在探索时,我发现我们有很多缓冲区溢出导致泄漏(它如何变坏,我不想知道)。
我决定先删除缓冲区溢出。为了使我的bug更容易找到,可以使用哪些工具来检查缓冲区溢出?
答案 0 :(得分:26)
在Linux上我会使用Valgrind。
答案 1 :(得分:10)
考虑使用更现代的数据结构作为避免缓冲区溢出的方法。读入std :: string不会溢出,std :: vectors比数组更安全。我不知道您的应用程序是什么,并且可能因为您需要速度而使用原始缓冲区,但更常见的是它们被使用,因为这是原始程序员所熟悉的。
使用上述工具搜索内存泄漏是一个好主意,但它们可能找不到所有潜在的泄漏,而使用标准字符串和容器类可以消除您没有意识到的问题。
答案 2 :(得分:8)
IBM的Purify将执行此操作,您在其下运行您的应用程序,它将为您提供所有错误的报告(包括其他错误)。
要消除内存泄漏,请使用UMDH - 运行应用程序,拍摄内存快照,再次运行,快照,然后使用diff工具查看自第一次运行以来所做的分配(请注意,您必须运行应用程序一次,并尽可能快地拍摄快照。
答案 3 :(得分:4)
检查electric-fence,它的设计只是为了缓冲区溢出!它不会减慢代码本身的速度(但会减慢分配/释放速度)。它工作,Linux和Windows。
它的工作原理是在每个分配的空间之前和之后添加一个没有读或写访问权限的段。尝试访问此内存最终会导致UNIX上的分段错误以及Windows上的内存冲突(或类似内容)。
答案 4 :(得分:3)
/ GS的问题是它实际上不会扫描错误。它会在事后警告你。看起来您正在寻找一种工具,它将扫描您现有的代码,以查找潜在的缓冲区上/下运行。
一个很好的工具,以及其他缺陷,是Microsoft PreFAST工具。
答案 5 :(得分:3)
MS:
答案 6 :(得分:3)
我很惊讶在Windows上没有人提到Application Verifier (free!)。 Visual Leak Detector(在另一个答案中提到)对于跟踪许多类型的内存泄漏绝对是惊人的,但Application Verifier是用于跟踪内存错误的首选,如缓冲区溢出,双重释放和免费后缓冲区使用(加上许多,更多)。
编辑:它非常非常容易使用。
答案 7 :(得分:2)
我投票给Rational Purify。非常强大,价格相匹配。做很多问题的短期工作,真的可以收回成本。此外,大多数* nix可用。但不确定Windows。
答案 8 :(得分:2)
Compuware's Devpartner的BoundsChecker组件在动态执行方面做得非常好。对于静态测试,我建议pc-lint and flex-lint加上Riverblade's visual lint以获得可用性和报告。如果你已经交了一个新的代码库,我建议开始使用静态分析和合理宽松的规则,这样你就可以抓住那些令人讨厌的东西。随着代码库的改进,您可以完善规则集。
如果您需要在Windows Mobile / Windows CE上执行此操作,请查看Entrek's code snitch
另一个考虑代码是否进入字段的工具是AQtrace,它基本上分析用户计算机上的崩溃并向您发送详细信息。 (以防所有那些限制,净化,掉毛,valgrinding等......错过了什么)
答案 9 :(得分:2)
我的公司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库上的调用。
答案 10 :(得分:1)
Visual Studio有一个/ GS编译器标志,可以添加缓冲区溢出保护。还有其他人吗?
答案 11 :(得分:1)
你可以尝试Visual Leak Detector - 我自己使用它,这是我建议用于内存泄漏检测的第一件事。
答案 12 :(得分:1)
我推荐Jochen Kalmbach在CodeProject上使用免费的“leakfinder”工具。有关此memory leak question
的此主题(以及其他答案)的详细信息,请参阅我的帖子答案 13 :(得分:0)
在Windows上进行内存泄漏/缓冲区溢出和其他运行时错误检测,您可以使用:
如果您有需要清理的大型项目,我认为它们值得付出代价。