【发布时间】:2016-09-08 05:40:35
【问题描述】:
以下 c 代码似乎在输入中占用多达 8 个字符,然后为更大的输入提供 segFaults。
int main()
{
char a[1];
printf("Input:\n");
scanf("%s",a);
printf("%s\n",a);
printf("%d\n",strlen(a));
printf("%d\n",sizeof(a));
return 0;
}
输出
案例一:
Input:
aaaaaaaa
aaaaaaaa
8
1
案例 2:
Input:
aaaaaaaaa
aaaaaaaaa
9
1
[1] 15688 segmentation fault (core dumped)
我的机器是 64 位 Intel Linux
编译器是gcc version 6.1.1 20160802 (GCC)
执行的命令序列:
gcc -c -g test.c - 创建输出文件 test.o
gcc -o test test.o
./test
我是 C 编程的初学者。非常感谢任何见解。
从表面上看,我希望它会在输入 2 个或更多字符时给出一些错误或警告。
另外,objdump -d test 给出了sub $0x10,%rsp,这意味着堆栈为 main() 存储了 16 个字节。所以也许应该输入 16 个字符而不是 8 个字符。
【问题讨论】:
-
您希望发生什么?
-
这是未定义的行为。什么事情都可能发生。在您的情况下,您将覆盖
main堆栈框架边界。 -
@Amit 我预计输入 2 个或更多字符时会出现 segFault,因为每个字符输入的大小应为 1 个字节
-
很多事情都会导致未定义的行为。
-
如果您可以确定地预测 UB 代码的结果,那它就不会是 UB。既然你知道这是UB,这个问题就没有意义了。