MISRA C:2012 Rule 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 с неполным типом приведен к тому же неполному типу.

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

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

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

Группа: Преобразования типов указателей
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2014b