【发布时间】:2020-09-24 15:11:56
【问题描述】:
我目前正在大学的一门课程中学习 C。现在我们有一个任务要解决,我不知道该怎么做。
任务如下所示: “是否有可能让这个程序因用户输入而崩溃?如果是,请解释这种情况。”
我们得到的程序很简单,看起来像这样:
#include <stdio.h> // Include to use printf, scanf
int main()
{
// Define buffers to store user name and password
char username[16];
char password[16];
// Read username and password from user input
printf("Enter your name: ");
scanf("%s", username);
printf("Enter your password: ");
scanf("%s", password);
printf("[SHOUTING OUT LOUD] Hello, %s!\n", username);
return 0;
}
我已经发现,如果您使用的用户名超过 15 个字符,您可以让程序打印出密码。但这显然不是崩溃。 所以我还没有找到使程序崩溃的方法,但不知何故,我很确定,有办法做到这一点。 有人知道吗?
谢谢:)
【问题讨论】:
-
ctrl+c算不算? -
问你这个问题的人可能是在掩饰细节或不完全理解 C。看起来你的意图是让你溢出缓冲区。但这并不能保证崩溃。请参阅已发布的有关未定义行为的答案。
-
"但这显然不是崩溃。" - 分段错误运行时错误在您看来不是崩溃吗?
-
好吧,从理论上讲,崩溃“可能”发生。但是写入足够长的用户名以覆盖堆栈区域,尤其是返回地址会导致崩溃。
-
我已经绑定输入超过 15 个字符,在我的情况下没有错误或崩溃。打印的结果不正确,但我已经预料到了。所以我接下来尝试的是输入大量字符,现在在某个时候我的程序停止工作并告诉我
*** stack smashing detected ***: <unknown> terminated Aborted...这更有可能是我想要的。但是有没有一个原因,为什么它发生在特定数量的字符上,这些字符也更高,然后是我的数组的 15+15 个字符?
标签: c arrays string memory crash