我目前正在大学的一门课程中学习 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 个字符,您可以让程序打印出密码。但这显然不是崩溃。
所以我还没有找到一种方法来使程序崩溃,但不知怎的,我很确定,有一种方法可以做到这一点。
有人有什么想法吗?
谢谢 :)
输入长度超过 15 个字符的用户名或密码can使程序崩溃,只是不能保证这样做。
当您写入超出数组范围时,您会调用未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior。宽松地说,这意味着您不能对程序将做什么做出任何假设。它可能会崩溃,可能会输出奇怪的结果,或者可能看起来工作正常。
只因为节目could崩溃并不一定意味着它will.
话虽这么说,考虑到您可能遇到的大多数编译器的工作方式,您输入的字符串越长,崩溃的可能性就越大。
局部变量通常分配在彼此相邻的堆栈上。例如,假设username
紧接之前出现password
在堆栈上。如果您输入 20 个字符的用户名,它将写过去username
into password
and username
将不包含空终止字节。当您输入密码时,它将覆盖用户名前 16 个字符之后的任何字符。然后当您打印时username
,您将看到您输入的内容的前 16 个字符,后面是密码。
现在假设您输入 100 个字符作为用户名。这将写过去username
和过去password
并且很可能会覆盖返回地址main
。那么当main
尝试返回会读取虚假地址,而尝试跳转到该地址会导致崩溃。
但同样,这都是特定于系统的,并且可能会根据您放置变量的类型/顺序、您调用的函数以及您用于编译的优化设置等而有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)