exponenta event banner

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

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

Описание

Этот дефект возникает в следующих случаях:

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

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

Например:

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

Риск

Нуль-терминатор означает конец строки. Сравнение байтов после нулевого терминатора не имеет смысла. Можно сделать ложный вывод о том, что две строки не равны, даже если байты перед терминатором null хранят одно и то же значение.

Зафиксировать

Использовать 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 возвращает число байт перед терминатором null (и исключая сам терминатор null).

#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
Воздействие: среднее
ИДЕНТИФИКАТОР CWE: 188
Представлен в R2017a