2013-10-03 24 views
0

我们有一个例子证明了由于C中不正确的malloc大小造成的非确定性故障吗?由于malloc大小不正确导致的不确定性失败?

例如,在我的“gzip的”程序在linux:

. 
. 
. 
char* a = (char*)malloc(256) // correct version 
is changed to 
char* a = (char*)malloc(206) //faulty version 
. 
. 
. 

正因为如此,该传递正确的版本的测试箱TC变为上有故障的版本失败(即,分段故障)。 但是,失败是非确定性的。有时,错误版本的失败测试用例tc不会导致段错误(即通过)。

这可能是由于malloc的'未定义'行为,但我不知道它是如何发生的。

有没有人可以给我一些具体的例子? 预先感谢您。

+1

[请不要在C]中输入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。 – unwind

回答

3

将内存想象成一系列页面。有些是提供给您的过程中,有些是不可用的,由于权限的,有些是根本无法进入,即没有映射考虑这个图(不按比例):

 +      + + 
     | Page, 4096 bytes  | | 
     +-----------------+------+ | 
     |     |  | | 
     |     |  | | 
     |     |  | | 
     +-----------------+------+-->v 
      3890B   206B X <-- Not mapped, can't touch! 

如果分配的206个字节这一切都取决于其中那些206字节将会存在的页面。

  • 如果他们撒谎在启动(向左)访问更是OK尽可能 的Linux而言(但仍然不确定的行为就为C而言)但是

  • 如果访问更多字节涌进另一个页面,用不同的 保护或成不是在映射的一个,Linux的不会高兴,你会得到一个segfault

所以你可以控制一些你无法控制的东西:malloc将分配你的数据,即额外的50个字节。

+0

好身材,明确描述。谢谢。 – freddy

+1

@freddy不要接受它,也许更好的东西出现。 – cnicutar

1

这不是malloc的未定义行为。它只是给你你所要求的记忆。

您可能稍后访问非保留的内存(类似a[208] = 'x';),这会导致未定义的行为。

C标准说:

未定义行为

行为,在使用非便携式或错误的程序结构的或错误的数据, 对于这本国际标准中并没有规定要求

这意味着任何东西都可能发生。你无法预测结果,并且必须始终避免这种情况。

+0

谢谢,但'未定义的行为'是什么?它如何能够非确定性地导致失败? – freddy

+0

[未定义的行为](http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior)在这里你可以阅读更多关于UB。 – Arya

相关问题