exponenta event banner

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

Отливка не должна исключать никаких противоречий или изменчивых квалификаций из типа, на который указывает указатель

Описание

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

Отливка не должна исключать никаких противоречий или изменчивых квалификаций из типа, на который указывает указатель.

Объяснение

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

  • Приводит от указателя к 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.

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

Группа: Преобразования типов указателей
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b