Unmodified variable not const-qualified

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

Описание

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

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

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

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

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

Риск

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

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

Если вы не ожидаете изменения значения переменных в течение ее жизни, добавьте 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++
По умолчанию: Off
Синтаксис командной строки : UNMODIFIED_VAR_NOT_CONST
Влияние: Низкое
Введенный в R2020a