【发布时间】:2016-03-24 17:46:33
【问题描述】:
我知道在 C 语言中,有些数组可以在声明时指定长度。我想知道这些长度声明是否只是供其他程序员查看和理解使用,或者编译器是否可以通过禁止读取超过缓冲区长度的字符来保护代码。当我读入一个字符串时,它会继续运行,并开始覆盖存储在我要读入的缓冲区之后声明的变量中的数据。是否有安全的方法来读取数据?
char arr[5];
char buff[5] = "cat";
printf("The buffer holds: %s\n", buff);
printf("Input a word to be held in \"arr\": ");
scanf("%s", arr);
printf("The array holds: %s\n", arr);
printf("The buffer holds: %s\n", buff);
printf("%c\n", arr[9]);
如果读入 arr 的字符串足够长,“cat”将被覆盖,并且编译标志似乎都没有做任何事情(我使用 -Wextra -Wall -Werror -std=c99 编译)唯一抱怨的是瓦尔格林。如何在 C 中编写安全的数组代码?
【问题讨论】:
-
你行事有条不紊。
C标准规定编译器供应商没有义务为您辩护。越界写入是未定义的行为。 -
您是否尝试添加
-O2? -
lm gt fy...
safe scanf -
射你的脚
-
感谢大家的回答!你们真的为答案付出了一些努力,而且你们每个人都提出了一个有趣的观点(黑客、编译器行为、替代解决方案),所以很难选择一个好的答案。我想我最终会使用不同的语言来轻松检查用户输入的错误,然后使用 C 语言进行内部工作,以确保变量等在界限内。
标签: c arrays buffer-overflow