UndefinedBehaviorSanitiser 问题 - CS50 Vigenere

UndefinedBehaviorSanitiser Issue - CS50 Vigenere

我正在开发 Vigenere (CS50),当我 运行 我的程序带有任何通过初始筛选的参数时,我会一直收到 "UndefinedBehaviorSanitiser SEGV on Unknown Address"。

我已阅读有关此问题的信息,但找不到解决方案。我尽可能地减少了我的代码,发现即使在我执行这一部分时也会出现问题。问题在哪里? 非常感谢。

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

//int shift(char c);

int main(int argc, string argv[])
{
    if (argc != 2)
        {
        printf("Usage: ./vigenere keyword");
        return 1;
        }
    else
        {
        for (int i = 0; i < strlen(argv[1]); i++)
            {
            if (!isalpha(argv[1]))
            {
                printf("Usage: ./vigenere keyword");
                return 1;
            }
            else
            {
                printf("All good!");
                return 1;
            }
         }
    }
}

修复确实是

if (!isalpha((unsigned char)argv[1][i]))

isalphafunction/macro只接受一个整数,它的值必须是单个字符,如unsigned char。但是argv[1]是指向多个字符的指针!

现在,作为一个额外的并发症,isalpha 通常被实现为一个宏,并且经常被编码以便编译器不会对错误的类型产生 any 诊断的论据。这很不幸,但您在使用 C 语言编程时需要了解这些。

也需要将 char 转换为 unsigned char - 如果不需要,则任何扩展字符(例如 ä)将在 [=15] 的平台上调用未定义的行为=] 已签名 - 它们 在 x86 处理器上是 - 因为该值将是负数,但 isalpha 只期望一个数字 EOF 或小于或等于 UCHAR_MAX.

的非负数