Memory comparison of strings

memcmp сравнивает данные, хранящиеся в строках после null terminator

Описание

Этот дефект возникает, когда:

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

  • Количество сравниваемых байтов таково, что вы сравниваете бессмысленные данные, хранящиеся после null terminator.

Для образца:

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

Риск

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

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

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

Если вы используете 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 terminator).

#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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: MEMCMP_STRINGS
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 188
Введенный в R2017a