C/C++有哪些工具可以检查缓冲区溢出?

25

我被要求维护一个大型的C++代码库,里面存在大量内存泄漏的问题。在研究时,我发现有很多缓冲区溢出导致了这些泄漏(不想知道是怎么变得这么糟糕的)。

我决定先解决缓冲区溢出的问题。为了让我的错误调试更容易,有哪些工具可以用来检查缓冲区溢出?

14个回答

28

在 Linux 上,我会使用 Valgrind。


这有点过度杀伤力,仅仅为了缓冲区溢出问题。 - PierreBdR
2
缓冲区溢出是一个非常讨厌的错误,因为其影响不一定与原因相近(例如,它可能会在500行后崩溃)。如果堆栈被破坏,你需要尽可能多的帮助来进行调试。这就是Valgrind发挥作用的地方——它可以在溢出发生时立即捕获它。 - diciu
使用Valgrind即使它有些过度也没有问题,你会得到很多额外的错误检查,例如未初始化内存的使用。 - ideasman42
valgrind是我用来查找溢出的首选工具,你还会使用什么工具来查找呢? - paulm
Valgrind并未捕获像将12个字符的sprintf放入10个字符缓冲区这样简单的缓冲区溢出。 - bu11d0zer
显示剩余3条评论

10
考虑使用更现代的数据结构,以避免缓冲区溢出。 读取std::string不会溢出,而std::vector比数组更安全。 我不知道你的应用程序是什么,可能使用原始缓冲区是因为需要速度,但更常见的情况是使用原始缓冲区是因为原始程序员对此感到舒适。
使用提到的工具搜索内存泄漏是一个好主意,但它们可能无法找到所有潜在的泄漏。 而使用标准字符串和容器类可以消除您没有意识到的问题。

这对于C语言不起作用。 - user2284570

8

IBM的Purify可以做到这一点,您可以在其下运行您的应用程序,它会给您一个所有错误的报告(包括其他错误)。

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


很高兴知道它不支持 Windows 7 x64。 - sorin

4

请查看Electric-fence,它专门设计用于防止缓冲区溢出!它不会减慢代码本身的速度(但会减慢分配/释放内存的速度)。它可以在Linux和Windows上使用。

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


来源在这里。显然已被DUMA取代。 - Fake Name

3
我很惊讶没有人提到在Windows上免费的应用程序验证器(Application Verifier)。另一个答案中提到的Visual Leak Detector非常适合跟踪许多类型的内存泄漏,但Application Verifier是跟踪内存错误(如缓冲区溢出、双重释放和释放后缓冲区使用等)的佼佼者(还有许多其他功能)。
编辑:而且它非常易于使用。

不错!但是基于运行时。如果你有一个大型的代码库(比如我用C写的),你主要会测试程序按照设计方式运行的情况。攻击者可能需要数千个小时来阅读代码,以找到内存泄漏漏洞。我本来期望有一种类似于JavaScript的源代码分析自动化工具。 - user2284570

3
问题在于/GS并不会实际扫描错误。它只会在事后提醒您。看起来您正在寻找一种工具,可以扫描您现有的代码以查找潜在的缓冲区溢出/下溢。一个很好的工具是Microsoft PreFAST工具,可用于此类缺陷和其他缺陷。 此处提供信息

3

MS:

(注:以上为it技术相关内容,涉及两个工具的介绍和下载链接)

很不错!但是它是基于运行时的。对于一个大型的代码库(在我的情况下是用C编写的),你主要会测试程序的设计方式。攻击者可能需要几千个小时阅读代码,才能找到内存泄漏漏洞。我本来期望有一个类似于JavaScript的源代码分析自动化工具。 - user2284570

2

我推荐使用 Rational Purify。它非常强大,但价格也相对较高。它可以轻松解决许多问题,并且真的可以为自己赚钱。此外,它可用于大多数*nix系统。不过,我不确定它是否适用于Windows系统。


2
Compuware's Devpartner的BoundsChecker组件在动态执行方面非常出色。对于静态测试,我建议使用pc-lint和flex-lint结合Riverblade's visual lint以获得更好的可用性和报告。如果你拿到了一个新的代码库,我建议从使用相对宽松的规则进行静态分析开始,这样可以捕捉到一些恶意的东西。随着代码库的改进,您可以收紧规则集。
如果您需要在Windows Mobile / Windows CE上进行此操作,请查看Entrek's code snitch 另一个需要考虑的工具是AQtrace,它基本上分析用户机器上的崩溃并向您发送详细信息。(以防万一所有的边界检查、净化、linting、valgrinding等都漏掉了什么)

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库的调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接