Memory comparison of strings

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