超出范围时,C缓冲区溢出

时间:2014-07-16 10:03:34

标签: c buffer-overflow

考虑下一个测试程序:

char a[10];
strcpy(a, "test");
for(int i=0; i<3; i++) {
  char b[2];
  strcpy(b, "tt");
  strcat(a, b);
}
printf("%d %d %s\n", strlen(a), sizeof(a),  a);

输出:10 10 testtttttt。 一切似乎都没问题。

如果i <7,则缓冲区溢出,但没有错误。输出:18 10 testtttttttttttttt。程序似乎正在起作用。

如果我<11,那么我们会看到一个错误&#34;堆栈粉碎检测到&#34; ...

为什么当i&lt; 7?

时,该程序不会提示错误

3 个答案:

答案 0 :(得分:4)

您正在做的是未定义的行为。什么事情都可能发生。你看到的只是一个可能的结果,一些自动工具检测到它很晚而不是立即。你的代码是错误的,任何应该发生的假设是错误的,并且要求“为什么”是没有意义的。使用不同的编译器,或使用不同的编译器设置,或在不同的日子,结果可能完全不同。

顺便说一下,当i = 0时会有一个缓冲区溢出,因为你试图将两个字符和一个尾随零字节复制到一个只有两个字符空间的缓冲区中。

答案 1 :(得分:1)

  

如果i <7,则缓冲区溢出,但没有错误。产量:18   10 testtttttttttttttt。程序似乎正在起作用。

原因是因为未定义的行为。您可以期待任何值出现,因为您正在访问超出其限制的数组

您可以针对这些情况检查Valgrind

你的缓冲区变量只允许10个字符,你的参数是11,增加你的缓冲区以支持你的参数。

char a[10];

你得到的错误,即Stack Smashing,这是gcc用来检查缓冲区溢出错误的保护机制。

答案 2 :(得分:0)

你问为什么没有错误: 缓冲区溢出检测是一项可以帮助您的功能,但它绝对不能保证它会检测到缓冲区溢出。