CERT C: Rec. DCL00-C

Const - квалифицирует неизменяемые объекты

Описание

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

Const - квалифицирует неизменяемый objects.[1]

Реализация Polyspace

Это средство проверки проверяет на переменную Unmodified, не квалифицированную к const.

Примеры

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

Проблема

Немодифицированная переменная, не квалифицированная к const, происходит, когда локальной переменной не является const- квалифицированный и один из следующих операторов верно в течение переменного времени жизни:

  • Вы не выполняете операции записи на переменной после инициализации.

  • Когда вы выполняете операции записи, вы повторно присваиваете то же постоянное значение переменной.

Средство проверки рассматривает переменную, как изменено, если ее адрес присвоен указателю или ссылке (если это не указатель или ссылка на const переменная), переданный другой функции, или в противном случае использовал. В этих ситуациях средство проверки не предлагает добавить const спецификатор.

Средство проверки отмечает массивы как кандидатов на const- проверка, только если вы не выполняете операции записи на элементах массива вообще после инициализации.

Риск

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

Фиксация

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

Если вы ожидаете, что переменная будет изменена, смотрите, указывает ли отсутствие модификации на пропуск программирования, и устраните проблему.

Пример - Недостающий const Проверка на указателе
#include <string.h>

char returnNthCharacter (int n) {
    char* pwd = "aXeWdf10fg" ;
    char nthCharacter;
        
    for(int i=0; i < strlen(pwd); i++) {
        if(i==n)
            nthCharacter = pwd[i];
    }
    return nthCharacter;
}

В этом примере, указатель pwd не const- квалифицированный. Однако вне инициализации с константой, это не повторно присвоено нигде в returnNthCharacter функция.

Коррекция – добавляет const в объявлении переменной

Если переменная не предназначается, чтобы быть измененной, добавьте const спецификатор в объявлении. В этом примере не изменяются и указатель и резкая переменная. Добавьте const спецификатор и к указателю и к резкой переменной. Более поздние модификации не могут повторно присвоить указатель pwd указать на различную переменную, ни изменить значение в резком местоположении.

#include <string.h>

char returnNthCharacter (int n) {
    const char* const pwd = "aXeWdf10fg" ;
    char nthCharacter;
        
    for(int i=0; i < strlen(pwd); i++) {
        if(i==n)
            nthCharacter = pwd[i];
    }
    return nthCharacter;
}

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

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

Группа: Rec. 02. Объявления и инициализация (DCL)
Введенный в R2020b

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.