UndefinedBehaviorSanitiser Issue - CS50 Vigenere - PullRequest
1 голос
/ 01 ноября 2019

Я работаю над Vigenere (CS50) и продолжаю получать «UndefinedBehaviorSanitiser SEGV по неизвестному адресу», когда я запускаю свою программу с любым аргументом, который проходит начальный скрининг.

Я читал об этой проблеме, но не могу найти решение. Я сократил свой код настолько, насколько мог, и обнаружил, что проблема возникает, даже когда я делаю эту часть. Где проблема? Большое вам спасибо.

#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;
            }
         }
    }
}

1 Ответ

0 голосов
/ 01 ноября 2019

Исправление действительно

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

Функция / макрос isalpha принимает только одно целое число, которое должно иметь значение одного символа как unsigned char. Но argv[1] является указателем на несколько символов!

Теперь, как дополнительное усложнение, isalpha часто реализуется как макрос и часто кодируется так, что компилятор не выдает any диагностика для неправильного типа аргумента. Это прискорбно, но вам просто нужно , чтобы знать это, когда вы программируете на C.

Требуется также приведение от char к unsigned char - если нет, то любойрасширенные символы (например, ä) вызовут неопределенное поведение на платформах, где подписано char - и они равны на процессорах x86 - потому что значение будет отрицательным, но isalpha будет ожидать толькочисло, которое является либо EOF, либо неотрицательным числом, меньшим или равным UCHAR_MAX.

...