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

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

Описание

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

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

Объяснение

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

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

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

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

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

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

Примеры

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

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.

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

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

Введенный в R2014b