MISRA C:2012 Rule 11.7

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

Описание

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

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

Объяснение

Это правило касается типов, которые являются по существу булевской переменной, символом, перечислением или плаванием.

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

  • Броски к или от указателя до типа с плавающей точкой приводят к неопределенному поведению.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

int foo(void) {

    short *p;
    float  f;
    long  *l;

    f = (float)   p;              /* Non-compliant */
    p = (short *) f;              /* Non-compliant */

    l = (long *)  p;              /* Compliant */
}

В этом примере правило нарушено когда:

  • Указатель p брошен к float.

  • float переменная брошена к указателю на short.

Кастинг между указателем и non-integerer переменной силой вызывает отказ компиляции. Polyspace® отмечает такие броски.

Правило не нарушено когда указатель p брошен к long*.

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

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