MISRA C:2012 Rule 11.8

Бросок не должен удалять const или энергозависимую проверку от типа, на который указывает указатель

Описание

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

Бросок не должен удалять const или энергозависимую проверку от типа, на который указывает указатель.

Объяснение

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

  • Броски от указателя до const возразите против указателя, который не указывает на const объект.

  • Броски от указателя до volatile возразите против указателя, который не указывает на volatile объект.

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

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