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

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

Описание

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

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

Объяснение

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

Например:

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

Обменивайтесь сообщениями в отчете

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

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

extern char buffer1[ 12 ];
extern char buffer2[ 12 ];
void f1 ( void )
{
	( void ) strcpy ( buffer1, "abc" );
	( void ) strcpy ( buffer2, "abc" );
	if ( memcmp ( buffer1, buffer2, sizeof ( buffer1 ) ) != 0 )
	{
		/* Non-compliant */
	}
}

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

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

Группа: Стандартные библиотеки
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2017a