暗黙的または明示的な整数変換の検出
説明
整数変換(暗黙的または明示的)、あるいはビットフィールドへのライトアクセスによって値が変更されないことを確認します。
チェックを実行する理由
C ではより大きな型から小さい整数型への変換が可能なため、一部の変換で値の上位のビットが意図せずに削除されることがあります。このチェックは暗黙的な整数変換を限定することができ、データの損失が明示的な変換による意図的とはっきりさせる場合に便利です。
使用方法
コンパイラオプション ‑‑runtime_checking integer_conversion|implicit_integer_conversion
IDE で、 [プロジェクト]>[オプション]>[ランタイム解析]>[整数変換]
1 つまたは複数のモジュールにチェックを適用できます。
明示的なマスクを挿入することで、チェックを回避できます。
short f(int x)
{
return x & 0xFFFF; /* Will not report change of value */
}仕組み
コンパイラは、整数変換およびビットフィールドへのライトアクセスがあるたびにチェックを実行するコードを挿入します。ただし、チェックが失敗しないとコンパイラが判断した場合を除きます。明示的な定数からの変換はチェックされません。
インクリメント / ディクリメント演算子(++/‑‑)および複合代入(+=、-= など)は、longhand (var = var op val)として記述されたときと同じようにチェックされます。
たとえば、++i と i += 1 はどちらも、i = i + 1 と記述されたかのようにチェックされます。この場合、オーバフローのチェックが有効化されていれば加算がチェックされ、変換のチェックが有効になっていれば代入がチェックされます。int と同じ、またはそれ以上のサイズを持つ整数型の場合、変換チェックが失敗することはありません。しかし、より小さい整数型の場合は、この種類の式におけるあらゆる失敗が一般的に変換エラーとなります。この例は以下のようになります。
signed char a = 127;
void f(void)
{
++a; /* Conversion check error (128 -> -128) */
a -= 1; /* Conversion check error (-129 -> 127) */
}コードサイズは大きくなります。つまり、アプリケーションにリソースの制約がある場合、オーバヘッドを最小限に抑えるため、このチェックはモジュール単位で使用してください。
例
C-RUNランタイムエラー解析を使用するにあたってに記載された手順に従ってください。[整数変換]オプションを使用します。
これは、実行時に識別されるソースコードの一例です。
C-RUN は、整数変換の失敗またはビットフィールドのオーバフローのいずれかを報告します。これは、リストされるメッセージの一例です。
