exponenta event banner

MISRA C:2012 Правило 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, которые являются указателями наvoid типы, приводятся к void*.

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

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