MISRA C:2012 Rule 21.14

Стандартная Библиотечная функция memcmp не буду использоваться, чтобы выдержать сравнение, пустой указатель отключил строки

Описание

Управляйте определением

Стандартная Библиотечная функция memcmp не буду использоваться, чтобы выдержать сравнение, пустой указатель отключил строки.

Это правило прибывает из MISRA C®: 2 012 Поправок 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 может быть сообщен отличающийся, но это различие прибывает из неинициализированных символов после пустых терминаторов строки.

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

Группа: Стандартные библиотеки
Категория: необходимый
Категория AGC: необходимый
Введенный в R2017a