MISRA C:2012 Rule 21.16

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

Описание

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

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

Это правило прибывает из MISRA C®: 2 012 Поправок 1.

Объяснение

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

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

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

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

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

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

Примеры

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

#include <stdbool.h>
#include <stdint.h>

struct S {
//...
};

bool 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 f2(union U* u1, union U* u2)
{
    return (memcmp(u1, u2, sizeof(union U)) != 0); /* Non-compliant */
}

const char a[ 6 ] = "task";
bool 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: необходимый
Введенный в R2017a