代码中的“ UndefinedBehaviorSanitizer:DEADLYSIGNAL”错误

时间:2019-07-29 00:16:09

标签: c cs50

所以我目前正在上这门CS50课程,我似乎无法弄清楚所提到的错误/崩溃与什么有关!

我正在尝试让我的代码检查命令行输入是否为整数。例如,。/ caesar 2有效,但./caesar 2z返回./caesar键。

错误消息:enter image description here

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>

//string error_key = "./caesar key \n";

int main(int argc, string argv[])
{
    if (argc == 2)
    {
        if (isdigit(argv[1]) == 0)
        {
            printf("./caesar key \n");
            return 1;
        }
        else
        {
            int string_to_int = atoi(argv[1]);
            printf("%i\n",string_to_int);
        }
    }
    else
    {
        printf("./caesar key \n");
        return 1;
    }
}

1 个答案:

答案 0 :(得分:1)

这是未定义的行为:

isdigit(argv[1])

argv[1]不是字符,而是指针。由于指针最有可能具有比unsigned char中表示的值高的值,因此会导致LLVM的未定义行为清除器出错。

从POSIX报价,该价格符合ISO C标准:

  

c参数是一个整数,应用程序应确保该整数的值是可表示为无符号字符或等于宏EOF值的字符。如果该参数具有任何其他值,则行为是不确定的。