exponenta event banner

CERT C: Rec. DCL00-C

Конст-квалифицировать неизменяемые объекты

Описание

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

Const-qualify неизменяемые объекты. [1 ]

Внедрение Polyspace

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

Примеры

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

Проблема

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

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

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

Средство проверки считает переменную измененной, если ее адрес назначен указателю или ссылке (если это не указатель или ссылка на 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 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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