繁体   English   中英

超过缓冲区大小?

[英]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,在阵列外写入是非法的
  • 对于您的操作系统,在未映射的地址或使用错误权限(只读)映射的地址写入是非法的

这些允许进行的过程的想法并不总是完美匹配。

C程序完全有可能做一些完全脑损伤的事情,这会让操作系统说“我没关系”,因为它与正常操作无法区分。

回到你的问题,可能前13个字节实际上并没有打扰操作系统(它们是在有效页面中编写的)。 然后下一个字节可能触及只读存储器或未映射的地址,操作系统有机会发现错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM