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

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

Описание

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

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

Объяснение

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

Реализация Polyspace

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

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

Указатель должен указать на квалифицированный к 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 - квалифицированный, таким образом, это несовместимо.

  • В last_char указатель s является const - квалифицированный, но тип, на который это указывает, не. Этот параметр несовместим, потому что 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];
}

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

Группа: объявления и определения
Категория: консультация
Категория AGC: консультация
Язык: C90, C99

Введенный в R2014b