MISRA C:2012 Rule 11.6

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

Описание

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

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

Объяснение

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

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

  • Если указатель брошен к арифметическому типу, получившееся значение может найтись вне позволенной области значений для типа.

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

Реализация 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