MISRA C:2012 Rule 11.5

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

Описание

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

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

Объяснение

Если указатель на void брошен в указатель на объект, получившийся указатель может быть неправильно выровнен. Неправильное выравнивание вызывает неопределенное поведение. Однако такой бросок может иногда быть необходимым, например, при использовании функций выделения памяти.

Реализация Polyspace

Броски или неявные преобразования из NULL или (void*)0 не генерируйте предупреждение.

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

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

Примеры

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

void foo(void) {

    unsigned int  u32a = 0;
    unsigned int  *p32 = &u32a;
    void          *p;
    unsigned int  *p16;

    p   = p32;                /* Compliant - pointer to uint32_t 
                               *            into pointer to void */
    p16 = p;                  /* Non-compliant */

    p   = (void *) p16;       /* Compliant */  
    p32 = (unsigned int *) p; /* Non-compliant */  
}

В этом примере правило нарушено когда указатель p из типа void* брошен к указателям на другие типы.

Правило не нарушено когда p16 и p32, которые являются указателями на non-void типы, брошены к void*.

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

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