C++ 在windows上检测free()之后的使用。(悬空指针)

C++ 在windows上检测free()之后的使用。(悬空指针),c++,c,security,testing,C++,C,Security,Testing,我试图检测“Use after free()”bug,也就是所谓的“悬挂指针”。我知道Valgrind可以用来检测*nix平台上的“释放后使用”bug,但是windows呢?如果我没有消息来源呢?有没有比Valgrind更好的程序来检测程序中所有悬空的指针?一个免费和开放的源代码将是首选,但我会使用一个商业解决方案,如果它能完成这项工作 几年前我就用过这个。它已经存在很长一段时间了,当我使用它时,它非常好。NuMega BoundsChecker曾经捕捉过这种东西。虽然不确定他们是否仍在经营中…

我试图检测“Use after free()”bug,也就是所谓的“悬挂指针”。我知道Valgrind可以用来检测*nix平台上的“释放后使用”bug,但是windows呢?如果我没有消息来源呢?有没有比Valgrind更好的程序来检测程序中所有悬空的指针?一个免费和开放的源代码将是首选,但我会使用一个商业解决方案,如果它能完成这项工作

几年前我就用过这个。它已经存在很长一段时间了,当我使用它时,它非常好。

NuMega BoundsChecker曾经捕捉过这种东西。虽然不确定他们是否仍在经营中…

它不如Valgrind,但微软的Windows也有类似的功能。它还可以让您模拟大多数API的错误条件,告诉您最重要的客户端是否会出现问题:)

MSVC调试内存分配器已经在这样做了。当您从已悬挂的指针取消引用中获得0xfeeefeee时。如果运气好的话,这会毁掉这个节目。

是另一个值得一看的选择。它在囤积网站上,不幸的是,它似乎使用了框架,所以你需要在左侧导航中查找DieHard。

检查。它不是开源的,但可以工作。

您可以使用
gflags.exe
和在进程中启用堆检查:

我已经有一段时间没有使用它了,老实说,我记不起它与C运行时堆(相对于Windows堆管理器)的交互有多好(以确保每个
malloc()
/
free()
/
new
/
delete
调用都被单独检查)


免费,但不是开源。

在Free()之后,将指针值设置为0,然后等待烟花?

请参阅我们的检查点。确实需要您拥有源代码,但确实在Wndows上运行。

C++是其中一个标记。我从来没有听说过“C++程序员使用
free
。你仍然可以用delete获得一个悬空的指针。但是“free()之后使用”比“悬空指针”更为常见。@Rook:周围一定有不同的社区。我会说“悬空指针”,希望人们能理解。我不会说“释放后使用()”。如果你没有源代码,那么你就无法修复问题,这就不再是一个与编程相关的问题。@Clifford破解软件是一个编程问题,编写利用漏洞的代码仍然是软件开发:)我使用了purify,它似乎只是在程序崩溃后检测bug。我正在寻找使应用程序崩溃的新方法:)我使用了Purify,它肯定能够捕获各种内存问题,如悬空指针、双删除、数组边界、内存泄漏(我工作的系统上有许多误报)。显然,有时程序也会崩溃。在任何类型的运行时检查器上,您都必须执行损坏的代码,否则它将无法检测到它。如果您正在寻找一个完全不同的静态检查器,这是一个完全不同的问题P@Matteo你说的对,这也是人类不理解假阳性。这很酷,但我正试图尽可能有效地追踪所有可能出现这种错误的案例。逐行遍历大型程序非常耗时,尽管变量断点会有所帮助。但是如果包含0xfeeefeee的内存被重新用于新对象,会发生什么情况?那么这种检测方法就不起作用了。@jmatthias:将悬空指针错误地使用到回收的内存中被称为“暂时”内存错误。我们的工具SafetyCheck将捕捉到这一点。请参阅gflags.exe中的“页面堆”选项更改堆的工作方式。由于malloc/free/new/delete只是调用heap API,“页面堆”是检测大多数内存冲突的好方法。实际的功能是嵌入在Windows中的,gflags.exe只是更改注册表中的某些内容。它们会检查这两个条件,然后再检查更多。