MISRA C:2012 Rule 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.

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

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