メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

未変更の変数に const 修飾子が付いていません

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;
}

この例では、ポインター pwdconst 修飾されていません。しかし、定数による初期化以降は、関数 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 がある値に初期化され、同じ値が 2 回再代入されます。大規模なコードでは、このような問題がコピーアンドペーストのミスから発生しやすくなります。

修正 – プログラミング エラーを修正する

この例の再代入はプログラミング エラーの可能性を示しています。1 つの修正方法として、プログラミング エラーを修正することによって、同じ値の再代入を回避します。

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

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: UNMODIFIED_VAR_NOT_CONST
影響度: Low

バージョン履歴

R2020a で導入

すべて展開する