CERT C: Rec. DCL00-C

Const-qualify неизменяемые объекты

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

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

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

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

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

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

Риск

const-qualification переменной избегает непреднамеренного изменения переменной во время последующего обслуживания кода. The const qualifier также указывает разработчику, что переменная сохраняет свое начальное значение в оставшейся части кода.

Зафиксировать

Если вы не ожидаете изменения значения переменных в течение ее жизни, добавьте 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 квалификатор.

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

Группа: Рек. 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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