используя memcmp для сравнения буферов с 0 байтами - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь сравнить 2 текста из файлов побайтно, используя memcmp, после того, как я прочитал оба из них в память, один файл в буфер (char * или char [], пробовал оба). проблема в том, что файл, который я читаю в буфер, имеет много 0 байтов, что заставляет его останавливаться на первых 0 байтах, думая, что это нулевой завершающий ноль, что вызывает ошибку сегментации. как сделать так, чтобы функция продолжала сравнивать байты даже при наличии 0 байтов?

Я уже пытался проверить, заполнен ли буфер или нет, я распечатал его побайтово, и он показал все байты, включая 0 байтов. когда я полностью его печатаю с использованием printf ("% s", буфер), я получаю только первый байт (второй байт равен 0 байт).

void detect_virus(char *buffer, unsigned int size){
    link* l = (link*) malloc(sizeof(link));
    load(l);
    unsigned int location = 0;
    while(l != NULL){
        location = 0;
        while(location < size - l->vir->SigSize){
            int isVirus = memcmp(buffer + location, l->vir->sig, l->vir->SigSize);
            if(isVirus == 0)
                printf("%d, %s, %d\n", location, l->vir->virusName, l->vir->SigSize);
            location++;
        }
    }
    free(l);
}

void detect(link* list){
    char filename[50];
    fgets(filename, 50, stdin);
    sscanf(filename, "%s", filename);
    FILE* file = fopen(filename, "rb");
    char* buffer = (char*) malloc(10000);
    fseek(file, 0, SEEK_END);
    unsigned int size = ftell(file);
    fseek(file, 0, SEEK_SET);
    fread(buffer, 1, size, file);
    detect_virus(buffer, size);
    fclose(file);
}

Я получаю ошибку сегментации при первом вызове функции memcmp вместо полного сравнения текстов. есть идеи как это исправить?

редактировать код для load функции:

void load(link* list){
    printf("Enter Viruses file name: \n");
    char* filename = (char*) malloc(100);
    fgets(filename, 100, stdin);
    sscanf(filename, "%s", filename);
    FILE* file = fopen(filename, "r");

    while(!feof(file)){
        short length = 0;
        fread(&length, 2, 1, file);
        if(length == 0)
            break;
        struct virus* v = (struct virus*)malloc(length);
        fseek(file, -2, SEEK_CUR);
        fread(v, length, 1, file);
        v->SigSize = v->SigSize - 18;
        list_append(list, v);
    }
    list = list->nextVirus;
    free(filename);
    fclose(file);
}

как примечание, я проверял функцию раньше, и она работала.

редактировать Я обнаружил проблему, спасибо всем!

1 Ответ

0 голосов
/ 26 марта 2019

За 7.21.6.7 Функция sscanf , параграф 2 стандарта C (шахтное соединение):

Функция sscanf эквивалентна fscanf, за исключением того, что входные данные получены из строки (указанной аргументом s), а не из потока. Достижение конца строки эквивалентно обнаружению конца файла для функции fscanf. Если копирование происходит между перекрывающимися объектами, поведение не определено.

Обратите внимание на жирную часть.

В вашем коде:

sscanf(filename, "%s", filename);

массив filename определенно перекрывается с массивом filename, вызывая тем самым неопределенное поведение.

Удалить эту строку кода.

Вам также необходимо добавить проверку ошибок, особенно проверяя, что возврат от fopen() не NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...