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]))
isalpha
function/macro只接受一个整数,它的值必须是单个字符,如unsigned char
。但是argv[1]
是指向多个字符的指针!
现在,作为一个额外的并发症,isalpha
通常被实现为一个宏,并且经常被编码以便编译器不会对错误的类型产生 any 诊断的论据。这很不幸,但您在使用 C 语言编程时需要了解这些。
也需要将 char
转换为 unsigned char
- 如果不需要,则任何扩展字符(例如 ä
)将在 [=15] 的平台上调用未定义的行为=] 已签名 - 它们 在 x86 处理器上是 - 因为该值将是负数,但 isalpha
只期望一个数字 EOF
或小于或等于 UCHAR_MAX
.
的非负数
我正在开发 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]))
isalpha
function/macro只接受一个整数,它的值必须是单个字符,如unsigned char
。但是argv[1]
是指向多个字符的指针!
现在,作为一个额外的并发症,isalpha
通常被实现为一个宏,并且经常被编码以便编译器不会对错误的类型产生 any 诊断的论据。这很不幸,但您在使用 C 语言编程时需要了解这些。
也需要将 char
转换为 unsigned char
- 如果不需要,则任何扩展字符(例如 ä
)将在 [=15] 的平台上调用未定义的行为=] 已签名 - 它们 在 x86 处理器上是 - 因为该值将是负数,但 isalpha
只期望一个数字 EOF
或小于或等于 UCHAR_MAX
.