Правило 11.8 MISRA C:2012

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

Описание

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

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

Объяснение

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

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

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

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

Реализация Polyspace

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

Обменивайтесь сообщениями в отчете

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

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

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

Примеры

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

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: необходимый
Язык: C90, C99

Введенный в R2014b