exponenta event banner

MISRA C:2012 Правило 21.14

Функция «Стандартная библиотека» memcmp не должны использоваться для сравнения пустых завершенных строк

Описание

Определение правила

Функция «Стандартная библиотека» memcmp не используется для сравнения пустых завершенных строк.

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

Если memcmp используется для сравнения двух строк, и длина каждой строки меньше, чем количество сравниваемых байт, строки могут выглядеть различными, даже если они логически одинаковы. Символы после нуль-терминатора сравниваются, даже если они не являются частью строки.

Например:

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

extern char buffer1[ 12 ];
extern char buffer2[ 12 ];
void f1(void)
{
    (void) strcpy(buffer1, "abc");
    (void) strcpy(buffer2, "abc");

    if (memcmp(buffer1,    /* Non-compliant */
               buffer2,
               sizeof(buffer1)) != 0) {

    }
}

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

Проверить информацию

Группа: Стандартные библиотеки
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2017a