exponenta event banner

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

Преобразования не должны выполняться между указателем на неполный тип и любым другим типом

Описание

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

Преобразования не должны выполняться между указателем на неполный тип и любым другим типом.

Объяснение

Неполный тип - это тип, не содержащий достаточной информации для определения его размера. Например, оператор struct s; описывает неполный тип, поскольку поля s не определены. Размер переменной типа s невозможно определить.

Преобразования в указатель или из него в неполный тип приводят к неопределенному поведению. Обычно указатель на неполный тип используется для скрытия полного представления объекта. Эта инкапсуляция разрывается, если другой указатель неявно или явно привязан к такому указателю.

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

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

Примеры

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

#include <stdio.h> 
struct s *sp;
struct t *tp;
short  *ip;
struct ct *ctp1;
struct ct *ctp2;


void foo(void) {

    ip = (short *) sp;            /* Non-compliant */
    sp = (struct s *) 1234;       /* Non-compliant */
    tp = (struct t *) sp;         /* Non-compliant */
    ctp1 = (struct ct *) ctp2;    /* Compliant */

    /* You can convert a null pointer constant to 
     * a pointer to an incomplete type */
    sp = NULL;                    /* Compliant - exception  */

    /* A pointer to an incomplete type may be converted into void */
    struct s *f(void);
    (void) f();                   /* Compliant - exception  */

}

В этом примере типы s, t и ct неполные. Правило нарушается в следующих случаях:

  • Переменная sp с неполным типом приводится к базовому типу.

  • Переменная sp с неполным типом приводится к другому неполному типу t.

Правило не нарушается, если:

  • Переменная ctp2 с неполным типом приводится к тому же неполному типу.

  • NULL указатель приводится к переменной sp с неполным типом.

  • Возвращаемое значение f с неполным типом приводится к void.

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

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