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 с неполным типом брошен к тому же неполному типу.

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

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

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

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