このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
= 演算子の無効な使用
条件付きステートメント内の代入
説明
この欠陥は、if
や while
などの条件付きステートメントの述部内で代入が行われた場合に発生します。
C および C++ では、単一の等号は比較ではなく代入を表します。条件付きステートメントで単一の等号を使用している場合は、誤入力やミスである可能性があります。
代入対象のオブジェクトが代入演算子と同じステートメント (初期化子を使用した if ステートメントなど) で宣言されている場合、Polyspace® は "= (代入) 演算子の無効な使用" を報告しません。たとえば、次のコード スニペット内の変数 tol
は、if
ステートメント内で宣言されて関数 tolerance
の戻り値が代入されますが、Polyspace は =
演算子の使用を違反として報告しません。
#include <iostream> #include <stdexcept> #include <string> extern float tolerance(float actual, float expected); enum STATUS { FAIL, PASS }; STATUS func(float val, float size) { if (auto tol = tolerance(val, size) < 0.01f) /* No defect. Equivalent to auto tol = tolerance(val, size); if( tol < 0.01f) */ { return PASS; } else { std::string errorMsg = "Tolerance exceeded by " + std::to_string(tol - 0.01f); throw std::runtime_error(errorMsg); } }
リスク
条件付きステートメントによる間違った値のテスト - 単一等号の演算は右辺のオペランドの値を左辺のオペランドに代入します。この代入は条件付きの述部内で行われるため、プログラムでは左辺のオペランドの新しい値が非ゼロかつ非 NULL であることがチェックされます。
保守およびコードの可読性の問題 - 代入を意図した場合でも、コードを読む際、または更新する際に、代入ではなく、誤って等値比較と解釈する可能性があります。
修正方法
代入がバグの場合、等価性をチェックするためもう 1 つ等号を追加します (
==
)。条件付きステートメント内で代入を意図的に行っている場合は、可読性を上げるため、代入とテストを分離します。代入を制御ステートメントの外に移動します。制御ステートメントでは、単純に代入の結果をテストします。
問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
例
結果情報
グループ: プログラミング |
言語: C | C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: BAD_EQUAL_USE |
影響度:Medium |
バージョン履歴
R2013b で導入