【问题标题】:Segmentation Fault in the Following Program for string comparisons以下程序中用于字符串比较的分段错误
【发布时间】: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


【解决方案1】:

你定义

char pin_buf[4];

预先确定的大小为4,然后,无需任何检查,您就可以使用

 strcpy(pin_buf,pin);

pin 有超过 3 个元素(以及终止的 null)时,您将在尝试复制时超出分配内存的边界,从而导致 undefined behavior

这就是为什么,你观察

"...我输入错误密码后仍然出现分段错误(例如:"acdc""ancgff")。我得到正确的响应密码,如 "abc""xyz""

也就是说,您根本不需要pin_buf。您打算执行的操作可以使用pin 本身完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2014-11-28
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多