exponenta event banner

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

Приведение не должно выполняться между указателем на объект и не целочисленным арифметическим типом

Описание

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

Приведение не должно выполняться между указателем на объект и не целочисленным арифметическим типом.

Объяснение

Это правило охватывает типы, которые по существу являются логическими, символьными, перечисляемыми или плавающими.

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

  • Приведение к или от указателя к плавающему типу приводит к неопределенному поведению.

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

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

Примеры

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

int foo(void) {

    short *p;
    float  f;
    long  *l;

    f = (float)   p;              /* Non-compliant */
    p = (short *) f;              /* Non-compliant */

    l = (long *)  p;              /* Compliant */
}

В этом примере правило нарушается в следующих случаях:

  • Указатель p приводится к float.

  • A float переменная приводится к указателю на short.

Чередование указателя и переменной, не являющейся целым числом, может привести к сбою компиляции. Polyspace ® маркирует такие слепки .

Правило не нарушается, когда указатель p приводится к long*.

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

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