boolean 型オペランドの演算が無効な可能性があります
boolean 型オペランドの精度を超過するか、任意の値になる可能性がある演算
説明
この欠陥は、boolean 型オペランドが算術演算、関係演算、またはビット演算で使用されており、かつ次の場合に発生します。
boolean 型オペランドがトラップ表現をもつ。メモリ内での boolean 型のサイズは 1 以上のアドレス可能単位 (
charのサイズ) です。boolean 型は、値true (1)またはfalse (0)を表現するために 1 ビットのみを必要とします。メモリ内での boolean 型オペランドの表現にはパディング ビットが含まれます。そのメモリ表現は、trueでもfalseでもない値、つまりトラップ表現になる場合があります。演算の結果が boolean 型オペランドの精度を超過する可能性がある。
たとえば、以下のコード スニペットについて考えます。
bool_v >> 2
bool_vの値がtrue (1)またはfalse (0)である場合、このビット単位シフトはbool_vの 1 ビット精度を超過し、その結果は常に0になります。bool_vがトラップ表現をもつ場合、演算の結果は任意の値になります。
boolean 型オペランドの演算が無効な可能性がありますでは、以下の場合、欠陥が報告されません。
演算の結果が精度オーバーフローにならない。たとえば、
0x01や0x00を使用した&または|ビット演算。boolean 型オペランドがトラップ表現をもつことができない。たとえば、
0または1になる定数式や、trueまたはfalseに評価される比較。
リスク
boolean 型オペランドに対する算術演算、関係演算、ビット演算は、オペランドの精度を超過する可能性があり、boolean 値として使用すると予期しない結果を引き起こす場合があります。トラップ表現をもつ boolean 型のオペランドに対する演算では、任意の値が返される可能性があります。
修正方法
boolean 型のオペランドに対し、次の演算以外の演算を実行することを避けます。
代入演算 (
=)。等式演算 (
==または!=)。論理演算 (
&&、||、または!)。
例
結果情報
| グループ: 数値 |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: INVALID_OPERATION_ON_BOOLEAN |
| 影響度: 低 |
バージョン履歴
R2018b で導入