2016-09-13 117 views
-3

我想使用“检查库”为malloc(3)编写一个检查单元测试。在C中创建malloc()缓冲区溢出0

这个单元测试应该会产生缓冲区溢出。

  1. 在int变量上分配一个double(即int * ptr = malloc(3))缓冲区溢出?
  2. 怎么样分配一个大于int的最大值的数字?

您能否给我一些缓冲区溢出的简单例子?

+0

数字的最大值是多少?所以我不能无限地在一个int值上写数字。 – surveyCorps

+0

正如我所说,我的测试案例应该会产生缓冲区溢出。我可以这样做,如果我分配的int指针(int * ptr = malloc(3))我给它一个很大的值(即* ptr = 59595959595959595959595959595)?那么这是一个缓冲区溢出? – surveyCorps

+0

如果您的平台上的sizeof(int)> 3'是一个缓冲区溢出。否则,不。 –

回答

0

写入或读取由malloc分配的缓冲区的末尾会产生undefined behavior,这意味着在发生时不能依赖任何特定行为。该程序可能似乎工作,它可能会核心转储,或者它可能会输出意外的结果。

因为溢出一个malloc'ed缓冲区导致未定义的行为,所以为它创建测试用例是毫无意义的,除非您正在测试malloc的特定实现。根据你的问题的措辞,似乎并非如此。

2

要溢出缓冲区,您需要访问超出其保证大小或开始之前的缓冲区。分配并不真正访问任何可见的缓冲区,所以很难看到任何类型的分配是否会成为缓冲区溢出,除非分配例程本身存在错误或其结构已损坏。

在int变量上分配一个double(即int * ptr = malloc(3))缓冲区溢出?

不,因为没有缓冲区被访问。

如何分配一个大于int的最大值的数字?

不,因为没有缓冲区被访问。

要溢出一个缓冲区,你必须首先有一个缓冲区,然后溢出它。例如:

int* j = malloc (2 * sizeof (int)); 
j[2] = 1; 

在这里,我分配缓冲区与两个整数空间,然后通过访问第三整数(0是第一个,1是第二,所以图2是第三)溢出它。

+1

并且'int i = j [2];'会是一个缓冲区溢出,尽管是读取而不是写入操作。它也会访问未初始化的数据,就像'i = j [0];'或'i = j [1];'它们不是缓冲区溢出,否则就是OK。 –