2017-03-15 34 views
0

我试图为使用GFlags的小应用程序启用页堆,但由于某些原因,它不起作用。Windows GFlags应用程序堆损坏检测

我写了一个小的C++应用程序,它是所有破坏堆内存:

int* a; 
a= (int*)malloc(1); 
*a= 8888800; 
return 0; 

当运行该代码的应用程序不会崩溃。 但是在启用页堆的情况下,我期望它在第三行。

我怀疑我没有正确激活GFlags,但无法弄清楚问题所在。在图像文件选项卡中运行GFlags exe后,我将路径复制到我的exe文件并标记为启用页堆并停止在异常选项上。我检查了CMD并看到页面堆已启用。可能是什么问题呢?

+1

你有*未定义的行为*。当你有UB时会发生什么,*,*,*,并且你无法预测它。在某些情况下,它似乎可以正常工作,而在其他情况下,它会导致崩溃,有时甚至可能会得到[鼻恶魔](http://catb.org/jargon/html/N/nasal-demons.html)。这也是为什么不应该在C++中使用'malloc'的一个很好的例子。 –

+0

那么,有什么方法可以证明GFlags的工作原理,并将为我们的产品在那里工作? –

+0

@Someprogrammerdude:是不是未定义的行为滥用语言的东西?恕我直言,这不是C++语言的滥用,因为编译器确切地知道该怎么做。所以问题是WIndows如何通过内存管理来处理这种情况。编译器无法知道'malloc()'分配了多少字节。如果参数'1'表示1 kb,那么一切都很好。 –

回答

2

页堆意味着在变量所在的页面后面有一个受保护的页面。这也意味着您必须访问该受保护页面中的内存才能使其崩溃。你没有编写足够的数据来达到页面的末尾。

喜欢的东西

int* a; 
a= (int*)malloc(1); 
*(a+4096)= 8888800; 
return 0; 

应该工作(未测试)。请记住,当页堆打开时,堆上的每个变量都需要8 kB内存:4 kB用于变量处于可访问页的位置,后面是受保护页的4 kB。

因此总而言之,页堆并不是生产应用程序的好主意,但可能适用于小型测试应用程序。您需要确定缓冲区溢出(或欠载)。