メインコンテンツ

CERT C: Rec.DCL00-C

Const-qualify immutable objects

説明

ルール定義

Const-qualify immutable objects.1

Polyspace 実装

ルール チェッカーは、"const 修飾されていない不変変数" をチェックします。

すべて展開する

問題

const 修飾されていない不変変数は、ローカル変数が const 修飾されておらず、後続のステートメントのいずれかが変数の存続期間中に true になった場合に発生します。

  • 初期化後に変数に対する書き込み操作を行わないでください。

  • 書き込み操作を行った場合は、同じ定数値が変数に再代入されます。

チェッカーは、変数のアドレスが、ポインターまたは参照に割り当てられたり (それが変数 const へのポインターまたは参照ではない場合)、他の関数に渡されたり、それ以外に使用されたりした場合に、その変数を変更されたものと見なします。このような状況では、チェッカーが const 修飾子の追加を提案しません。

チェッカーは、初期化後に配列要素に対する書き込み操作がまったく行われなかった場合にのみ、const 修飾の候補として配列にフラグを設定します。チェッカーは、整数型、浮動小数点型、enum 型、boolean 型の関数パラメーターにはフラグを設定しません。

リスク

変数を const 修飾することによって、後のコード保守期間での意図しない変数の変更が回避されます。const 修飾子は、残りのコードでも変数の初期値が保持されることを開発者に示すことにもなります。

修正方法

存続期間を通して変数値の変更を想定しない場合は、const 修飾子を変数宣言に追加し、宣言時に変数を初期化します。

変数の変更を想定する場合は、変更が行われなかった場合に実行されなかったプログラミングがないかを確認し、問題があれば修正します。

例 - ポインターの const 修飾がない
#include <string.h>

char returnNthCharacter (int n) {
    char* pwd = "aXeWdf10fg" ; //Noncompliant
    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" ; //Compliant
    char nthCharacter;
        
    for(int i=0; i < strlen(pwd); i++) {
        if(i==n)
            nthCharacter = pwd[i];
    }
    return nthCharacter;
}

チェッカーは、ポインター宣言に欠落している const にしかフラグを設定しないことに注意してください。チェッカーは、参照先にも const 修飾子が必要かどうかを判断しません。

チェック情報

グループ: Rec.02.宣言と初期化 (DCL)

バージョン履歴

R2020b で導入

すべて展開する


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.