【发布时间】:2017-08-23 22:01:08
【问题描述】:
以下代码出现分段错误。程序的逻辑是它应该接受正确的密码("abcd")并且如果输入任何其他密码它应该拒绝访问,但是在我输入错误的密码后仍然出现分段错误(例如:"acdc" 或 @987654323 @)。我得到正确的响应密码,如 "abc" 或 "xyz",我收到“访问被拒绝”消息。
请帮助我,无法理解为什么我会收到此错误?
#include <stdio.h>
#include <string.h>
int check(char *password)
{
char pin_buffer[4];
int authority = 0;
strcpy(pin_buffer,password);
if(strcmp(pin_buffer,"abcd")==0)
authority=1;
return authority;
}
int main(int argc, char *argv[])
{
if(argc < 1)
{
printf(argv[0]);
exit(0);
}
if(check(argv[1]))
{
printf("access granted");
}
else
{
printf("access denied};
}
【问题讨论】:
-
pin_buf的意义何在?你为什么不直接做if(strcmp(pin,"abcd")==0) -
使用 strncpy 命令代替 strcpy,以避免由于长度不匹配而导致分段错误。
-
我觉得应该学习调试才能成为优秀的程序员。您可以使用 GDB 对其进行调试,它会让您更深入地了解正在发生的事情。
-
您好,问题已解决,非常感谢。
-
pin_buffer[]有 4 个字节长,因此它可以保存一个 3 个字节的字符串(加上 NUL 终止符字节),因此任何提供的大于 3 个字节的密码都会溢出缓冲区,导致未定义的行为.这可能/将导致段错误事件。
标签: c string pointers buffer-overflow strcmp