MISRA C:2012 Rule 11.8

Приведение не должно удалять какую-либо несовпадающую или летучую проверку из типа, на который указывает указатель

Описание

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

Отливка не должна удалять какую-либо несовпадающую или летучую проверку из типа, на который указывает указатель.

Объяснение

Это правило запрещает:

  • Смещения от указателя на const объект на указатель, который не указывает на const объект.

  • Смещения от указателя на volatile объект на указатель, который не указывает на volatile объект.

Такие слепки нарушают проверку типа. Для примера, const qualifier указывает состояние объекта только для чтения. Если приведение удаляет квалификатор, объект перестанет быть доступным только для чтения.

Реализация Polyspace

Polyspace® помечает как неявное, так и явное преобразования, которые нарушают это правило.

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

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

Примеры

расширить все

void foo(void) {

    /* Cast on simple type */
    unsigned short           x;
    unsigned short * const   cpi = &x;  /* const pointer */
    unsigned short * const  *pcpi;   /* pointer to const pointer */
    unsigned short **ppi;
    const unsigned short    *pci;    /* pointer to const */
    volatile unsigned short *pvi;    /* pointer to volatile  */
    unsigned short          *pi;

    pi = cpi;                        /* Compliant - no cast required */
    pi  = (unsigned short *)  pci;   /* Non-compliant */
    pi  = (unsigned short *)  pvi;   /* Non-compliant */
    ppi = (unsigned short **)pcpi;   /* Non-compliant */
}

В этом примере:

  • Переменные pci и pcpi иметь const квалификатор в их типе. Правило нарушается, когда переменные приводятся к типам, которые не имеют const квалификатор.

  • Переменная pvi имеет volatile квалификатор в своем типе. Правило нарушается, когда переменная приведена к типу, который не имеет volatile квалификатор.

Хотя cpi имеет const квалификатор в своем типе, правило не нарушается в операторе p=cpi;. Назначение не вызывает преобразования типов, поскольку оба p и cpi иметь тип unsigned short.

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

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