exponenta event banner

CERT C: Rec. DCL13-C

Объявить параметры функции, которые являются указателями на значения, не измененные функцией, как const

Описание

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

Объявите параметры функции, которые являются указателями на значения, не измененные функцией, как const. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие параметра «Указатель на неконтинентальную функцию».

Примеры

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

Проблема

Средство проверки правил помечает указатель на не-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-qualified, но тип, на который он указывает, - not. Этот параметр несовместим, поскольку 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];
}

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

Группа: Rec. 02. Объявления и инициализация (DCL)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.