exponenta event banner

MISRA C:2012 Правило 11.6

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

Описание

Определение правила

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

Объяснение

Преобразование между целочисленными типами и указателями в void может привести к ошибкам или неопределенному поведению.

  • Если целочисленный тип привязан к указателю, результирующий указатель может быть неправильно выровнен. Неправильное выравнивание приводит к неопределенному поведению.

  • Если указатель приводится к арифметическому типу, результирующее значение может находиться за пределами допустимого диапазона для типа.

Преобразование не целочисленных арифметических типов и указателей в void не определен.

Внедрение Polyspace

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

void foo(void) {

    void          *p;
    unsigned int  u;
    unsigned short r;

    p = (void *) 0x1234u;            /* Non-compliant - undefined */
    u = (unsigned int) p;            /* Non-compliant - undefined */

    p = (void *) 0;                  /* Compliant - Exception */

}

В этом примере: p является указателем на void. Правило нарушается в следующих случаях:

  • Целочисленное значение приводится к p.

  • p приводится к unsigned int тип.

Правило не нарушается, если целочисленная константа со значением 0 приводится к указателю на void.

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

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