Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单C程序中的缓冲区溢出_C - Fatal编程技术网

简单C程序中的缓冲区溢出

简单C程序中的缓冲区溢出,c,C,我编写了一个C程序,它检查是否输入了某个密码,并在密码正确时返回一个名为Secret的文件(至少它应该这样做)。 在测试过程中,我发现当输入数字1(111111111)的15倍作为输入时,它的行为与预期不符,文件机密甚至很难显示,这不是存储在文件中的密码 我添加了sanitize方法,该方法删除了所有非字母字符,但显然没有修复它 我真的不明白为什么会出现溢出,哪些变量(及其内存)会受到影响 c中的字符串的最后一个字符必须是'\0'(空终止符)。这意味着,当您进行如下分配时: char pass[

我编写了一个C程序,它检查是否输入了某个密码,并在密码正确时返回一个名为Secret的文件(至少它应该这样做)。 在测试过程中,我发现当输入数字1(111111111)的15倍作为输入时,它的行为与预期不符,文件机密甚至很难显示,这不是存储在文件中的密码

我添加了sanitize方法,该方法删除了所有非字母字符,但显然没有修复它


我真的不明白为什么会出现溢出,哪些变量(及其内存)会受到影响

c中的字符串的最后一个字符必须是'\0'(空终止符)。这意味着,当您进行如下分配时:

char pass[15];
您确实需要分配14个字符和1个空终止符

strcpy
基于此工作。如果字符串没有终止符,则会出现缓冲区溢出

通过查看15 1的密码,可以清楚地看出,您没有让空间放置空终止符


为了避免这种情况,请开始使用function及其系列

非常感谢!使用strncpy函数看起来确实更安全。是否有可能知道哪个确切的变量溢出导致返回机密文件?我很难理解堆栈框架上发生了什么导致了程序的这种行为。你最好的朋友是一个调试器,但看看你的程序,我觉得
strcpy(pass,str)是坏人吗