Skip to main content

IAR Embedded Workbench for Arm 9.70.x

シフトする際のビット損失または未定義の動作の検出

このセクションの内容:
説明

シフト演算にオーバフローがないか、シフトカウントが有効化どうかをチェックします。

チェックを実行する理由

符号付きオーバフローの動作は定義されておらず、符号なしのオーバフローによって、結果が望ましくない切捨てになることがあるためです。

オーバフローは、左シフト演算 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ランタイムエラー解析を使用するにあたってに記載された手順に従ってください。[整数シフトオーバフロー]オプションを使用します。

これは、実行時に識別されるソースコードの一例です。

crs_shift_Hom7.1_M16_1.PNG

C-RUN は、シフトオーバフローシフトカウントオーバフローのいずれかを報告します。これは、リストされるメッセージの一例です。

message_shift_Hom7.1_M16.PNG