exponenta event banner

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

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

Описание

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

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

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

Функция «Стандартная библиотека»

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

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

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#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 (четыре) меньше, чем количество сравниваемых байтов (шесть). Это сравнение несовместимо.

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

Группа: Стандартные библиотеки
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2017a