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*.

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

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