Сравнение памяти строк

memcmp сравнивает данные, хранимые в строках после пустого терминатора строки

Описание

Сравнение памяти строк происходит когда:

  • Вы сравниваете два байта байтом строк с функцией memcmp.

  • Количество сравненных байтов таково, что вы сравниваете бессмысленные данные, хранимые после пустого терминатора строки.

Например:

memcmp(string1, string2, sizeof(string1))
может сравнить байты в строке после пустого терминатора строки.

Риск

Пустой терминатор строки показывает конец строки. Сравнение байтов после пустого терминатора строки бессмысленно. Вы можете сделать ложный вывод, что две строки не равны, даже если байты перед пустым хранилищем терминатора строки то же значение.

Фиксация

Используйте strcmp для сравнения строк. Функция сравнивает строки только до пустого терминатора строки.

Если вы используете memcmp для сравнения байта байтом двух строк, избегаете сравнения байтов после пустого терминатора строки. Определите количество байтов, чтобы выдержать сравнение при помощи функции strlen.

Примеры

развернуть все

#include <stdio.h>
#include <string.h>

#define SIZE20 20

int func()
{
    char s1[SIZE20] =  "abc";
    char s2[SIZE20] =  "abc";

    return memcmp(s1, s2, sizeof(s1));
}

В этом примере sizeof возвращает длину целого массива s1, который равняется 20. Однако только первые три байта строки релевантны.

Даже при том, что s1 и s2 содержат то же значение, сравнение с memcmp может показать ложное неравенство.

Исправление — использует strlen, чтобы определить количество байтов, чтобы выдержать сравнение

Одно возможное исправление должно определить количество байтов, чтобы сравнить использование функции strlen. strlen возвращает количество байтов перед пустым терминатором строки (и, исключая сам пустой терминатор строки).

#include <stdio.h>
#include <string.h>

#define SIZE20 20

int func()
{
    char s1[SIZE20] =  "abc";
    char s2[SIZE20] =  "abc";

    return memcmp(s1, s2, strlen(s1));
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: на
Синтаксис командной строки: MEMCMP_STRINGS
Влияние: носитель
ID CWE: 188

Введенный в R2017a