exponenta event banner

Неизмененная переменная не соответствует условию

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

Описание

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

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

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

Средство проверки считает переменную измененной, если ее адрес назначен указателю или ссылке (если это не указатель или ссылка на 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 квалификатор.

void resetBuffer(int aCondition) {
    int addr = 0xff;
    if(aCondition){
        addr = 0xff;
    }
    else {
        addr = 0xff;
    }
}

В этом примере переменная addr инициализировано значением и переназначено одно и то же значение дважды. В более крупных примерах кода такие проблемы могут легко возникнуть из-за ошибок копирования-вставки.

Исправление - исправление ошибки программирования

Переназначение в этом примере указывает на возможную ошибку программирования. Одной из возможных корректировок является исправление ошибки программирования и, таким образом, исключение переназначения того же значения.

void resetBuffer(int aCondition) {
    int addr = 0xff;
    if(aCondition){
        addr = 0x00;
    }
}

Информация о результатах

Группа: Надлежащая практика
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: UNMODIFIED_VAR_NOT_CONST
Воздействие: Низкий
Представлен в R2020a