仅当超出范围时 C 缓冲区才会溢出

标签 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。程序似乎正在运行。

如果 i<11,那么我们会看到错误“检测到堆栈粉碎”...

为什么程序在 i<7 时不提示错误?

最佳答案

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

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

关于仅当超出范围时 C 缓冲区才会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24777927/

相关文章:

c++ - 如何基于现有文件数据库创建具有模式的内存数据库

c - 使用带有红外 Remote 的 Arduino 来打开/关闭汽车电源

c - 缓冲区溢出漏洞利用示例

c - 错误消息预期标识符或 ‘(’ 在 ‘{’ token 之前,而整个程序编写正确?

c - 为什么这个段错误在构建之间不一致?

c - 单链路链路交换节点崩溃

c - C 代码的缓冲区溢出错误

c - ASLR 暴力破解

strncpy 可以返回 0 吗?

linux - 我怎样才能找到 main() 的返回地址在堆栈中的位置?