メインコンテンツ

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

CWE Rule 482

Comparing instead of Assigning

R2023a 以降

説明

ルールの説明

The code uses an operator for comparison when the intention was to perform an assignment.

Polyspace 実装

このルール チェッカーは、[== (等号) 演算子の無効な使用] をチェックします。

すべて展開する

問題

この問題は、単純なステートメントで代入演算子ではなく等号演算子が使用された場合に発生します。

リスク

= 演算子ではなく == 演算子を使用すると、気付かないうちに間違った結果が生じる可能性があります。変数に値を代入することを意図していた場合、代入は行われません。変数は以前の値を保持するか、以前に初期化されていない場合、未初期化のままになります。

修正方法

== (等号) 演算子ではなく、= (代入) 演算子を使用します。

次のような代入演算子と等号演算子の連鎖に対してチェックが表示されます。

compFlag = val1 == val2;
コードの可読性を高めるために、等価性チェックをかっこに入れます。
compFlag = (val1 == val2);

== 演算子の使用を意図している場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

例 — for ループ内の等価性評価
void populate_array(void)
{
    int i = 0;
    int j = 0;
    int array[4];

    for (j == 5; j < 9; j++)  //Noncompliant
    {
        array[i] = j;
        i++;
    }
}

for ループ内で、ステートメント j == 5j を 5 に設定するのではなく、j が 5 と等しいかどうかをテストします。j の値が 5 ではなく 0 から開始されるため、for ループは 0 から 8 まで反復します。等号演算子の無効な使用により、次の行で範囲外の配列アクセスが副次的に発生します。

修正 — 代入演算子に変更

1 つの修正方法として、== 演算子を 1 つの等号 (=) に変更することができます。== 記号を変更することで想定どおりの回数 for ループが反復されるため、両方の欠陥が解決します。

void populate_array(void)
{
    int i = 0;
    int j = 0;
    int array[4];

    for (j = 5; j < 9; j++) {
        array[i] = j;
        i++;
    }
}

チェック情報

カテゴリ: その他

バージョン履歴

R2023a で導入