MISRA C:2012 Rule 8.13

Указатель должен указывать на const-квалифицированный тип, когда это возможно

Описание

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

Указатель должен указывать на const-квалифицированный тип, когда это возможно.

Объяснение

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

Реализация Polyspace

Средство проверки правил помечает указатель на const, отличное от - function parameter, если указатель не изменяет адресуемый объект. Предположение, что указатель не предназначен для изменения объекта и поэтому должен указывать на const-квалифицированный тип.

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

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

Примеры

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

#include <string.h>

typedef unsigned short uint16_t;

uint16_t ptr_ex(uint16_t *p) {      /* Non-compliant */
    return *p;
}

char last_char(char * const s){     /* Non-compliant */
    return s[strlen(s) - 1u];
}

uint16_t first(uint16_t a[5]){      /* Non-compliant */
    return a[0];
}

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

  • В ptr_ex функция, p не изменяет объект. Однако тип, которому p точки не const-qualified, так что это несовместимо.

  • В last_char, указатель s является const-qualified, но тип, на который он указывает, отсутствует. Этот параметр несовместим, потому что s не изменяет объект.

  • Функция first не изменяет элементы массива a. Однако тип элемента не const-квалифицированный, так a также не совместим.

Коррекция - Использование const Ключевые слова

Одной из возможных коррекций является добавление const квалификаторы определений.

#include <string.h>

typedef unsigned short uint16_t;

uint16_t ptr_ex(const uint16_t *p){     /* Compliant */
    return *p;
}

char last_char(const char * const s){   /* Compliant */
    return s[strlen( s ) - 1u];
}

uint16_t first(const uint16_t a[5]) {   /* Compliant */
    return a[0];
}

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

Группа: Декларации и определения
Категория: Консультационные
Категория СМЖЛ: Консультационная
Введенный в R2014b