Unmodified variable not const-qualified

Переменная не 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 спецификатор.

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