[英]Exceed the buffer size?
为什么有可能超过C中的缓冲区大小达到一定限度而没有任何错误(分段错误)?
例如,我正在玩这个代码:
#include <stdio.h>
#include <string.h>
void function1(char *a) {
char buf[10];
strcpy(buf, a);
printf("End of function1\n");
}
main (int argc, char *argv[]) {
function1(argv[1]);
printf("End of main\n");
}
我能够作为参数传递最多23个字符而不是10个字符而没有任何错误,但是当我使用24个字符时,我得到了分段错误。
我知道第24个字符,我达到了返回值。 但是与以前的13 ??相提并论!!
你确实收到了错误。 你超过缓冲区大小并没有发生任何可怕的事情。 天真地,当你超过缓冲区时,会发生一些可怕的事情。 您所期望的没有发生,错误的定义。
我不是想轻浮。 我的观点是严肃的 - 如果你违反规则,你不知道会发生什么。 您可能会收到错误。 它似乎很好。 还可能发生其他事情。 原则上,它是不可预测的。 它可能会从编译器变为编译器,操作系统变为操作系统,甚至可能会运行。
在这种情况下可能发生的事情是, buf
是堆栈中的最后一个东西,并且它之后的空间不用于任何关键的东西。 所以在它无害之后使用一些空间。 您最终可能会遇到关键结构或点击不可写的页面,从而导致错误。
这是未定义行为的美妙之处 。
这些允许进行的过程的想法并不总是完美匹配。
C程序完全有可能做一些完全脑损伤的事情,这会让操作系统说“我没关系”,因为它与正常操作无法区分。
回到你的问题,可能前13个字节实际上并没有打扰操作系统(它们是在有效页面中编写的)。 然后下一个字节可能触及只读存储器或未映射的地址,操作系统有机会发现错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.