MISRA C:2012 Rule 21.14

Функция Standard Library memcmp не должен использоваться для сравнения строк с завершением null

Описание

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

Функция Standard Library memcmp не должен использоваться для сравнения строк с обрыв null.

Это правило получено от MISRA C®: 2012 1 о внесении изменений.

Объяснение

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

Для образца:

memcmp(string1, string2, sizeof(string1))
можно сравнить байты после null terminator, если 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