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

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

Описание

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

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

Объяснение

Стандартная Библиотечная функция

memcmp ( lhs, rhs, num );
выполняет сравнение байта байтом первых байтов num двух объектов, на которые указывают lhs и rhs.

Не используйте memcmp для сравнения байта байтом следующего.

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

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

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

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

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

Примеры

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

struct S;
bool_t f1 ( struct S *s1, struct S *s2 )
{
		return ( memcmp ( s1, s2, sizeof ( struct S ) ) != 0 ); /* Non-compliant */
}

union U
{
uint32_t range;
uint32_t height;
};
bool_t f2 ( union U *u1, union U *u2 )
{
		return ( memcmp ( u1, u2, sizeof ( union U ) ) != 0 ); /* Non-compliant */
}

const char a[ 6 ] = "task";
bool_t f3 ( const char b[ 6 ] )
{
		return ( memcmp ( a, b, 6 ) != 0 ); /* Non-compliant */
}

В этом примере:

  • Структуры s1 и s2 сравнены в функции bool_t f1. Возвращаемое значение этой функциональной силы указывает, что s1 и s2 отличаются из-за дополнения. Это сравнение несовместимо.

  • Объединения u1 и u2 сравнены в функции bool_t f2. Возвращаемое значение этой функциональной силы указывает, что u1 и u2 являются тем же самым из-за неумышленного сравнения u1.range и u2.height, или u1.height и u2.range. Это сравнение несовместимо.

  • Чрезвычайно массивы символов a и b сравнены в функции bool_t f3. Возвращаемое значение этой функциональной силы неправильно указывает, что строки отличаются, потому что длина a (четыре) является меньше, чем количество байтов выдержало сравнение (шесть). Это сравнение несовместимо.

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

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

Введенный в R2017a