シフトする際のビット損失または未定義の動作の検出
このセクションの内容:
説明
シフト演算にオーバフローがないか、シフトカウントが有効化どうかをチェックします。
チェックを実行する理由
符号付きオーバフローの動作は定義されておらず、符号なしのオーバフローによって、結果が望ましくない切捨てになることがあるためです。
オーバフローは、左シフト演算 E1<<E2 で、E1 がマイナスの場合、あるいはE1*2E2 で定義された結果が、その型の表現可能な値の範囲にない場合に発生します。
使用方法
コンパイラオプション :‑‑runtime_checking signed_shift|unsigned_shift
IDE で、 [プロジェクト]>[オプション]>[ランタイム解析]>[整数シフトオーバフロー]
1 つまたは複数のモジュールにチェックを適用できます。
シフトの前にマスクをすれば、チェックを回避できます。
/* Cannot overflow */
int f(int x) { return (x & 0x00007FFF) << 16; } 仕組み
コンパイラは、チェックが失敗することがないと判断した場合を除いて、各シフト演算についてチェックを実行するコードを挿入します。
コードサイズは大きくなります。つまり、アプリケーションにリソースの制約がある場合、オーバヘッドを最小限に抑えるため、このチェックはモジュール単位で使用してください。
例
C-RUNランタイムエラー解析を使用するにあたってに記載された手順に従ってください。[整数シフトオーバフロー]オプションを使用します。
これは、実行時に識別されるソースコードの一例です。
C-RUN は、シフトオーバフローとシフトカウントオーバフローのいずれかを報告します。これは、リストされるメッセージの一例です。
