PORTING.BSWAP.MACRO
エンディアンネス チェックを行わないカスタム バイトスワップ マクロの使用
PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.BSWAP.MACRO チェッカーはカスタムバイトスワップマクロがエンディアンの確認なしで使用される状況を検出します。PORTING.BSWAP.MACRO チェッカーがバイトスワップマクロとしてのコードにフラグを立てるようにするには、マクロの定義にシフトするビットとシフト演算子が含まれている必要があります。これには次のものが使用できます。
- 左シフト (<<) 演算子または右シフト (>>) 演算子
- ビットおよび (&) またはビットまたは (|) 演算子
- 8 の倍数である整数のリテラル
- 0xFF または 0xFF00 などのバイトマスク
バイトスワップマクロがエンディアンガードマクロにより保護されていない場合、Klocwork は指摘を報告します。
脆弱性とリスク
通常のバイトスワップマクロは、MSB を LSB にスワップするなどして、データを移動している整数型のレイアウトを推定します。基底チップのエンディアンの性質が、ビルドと次のビルドの間など、時間によって異なる可能性がある環境では、そのような操作が安全ではない場合があります。特に、変換対象の整数型が永続的なストレージや別のハードウェア環境から読み込まれる場合は安全とはいえません。
軽減と防止
エンディアンに脆弱な操作では、実行しているトランスフォームが使用する環境に適切かどうかを確認できるよう、BIG_ENDIAN または LITTLE_ENDIAN ガードマクロを使用してマクロの定義を保護します。
脆弱コード例
コピー
// Pretty normal byte swapping macro, changes unsigned integers from one type of endian to another
#define SWAPBYTES(x) ( ((x) & 0xff) << 24 ) | ( (((x) >> 8) & 0xff) << 16 ) | ( (((x) >> 16) & 0xff) << 8 ) | ( (((x) >> 24) & 0xff)
この例では、マクロの定義が特定のエンディアンアーキテクチャに特有ですが、定義は保護されず、逆アーキテクチャに対する使用を目的としたビルドに不適切にコンパイルされてしまう場合があります。
修正コード例
コピー
// Now the definition is endian-guarded
#if BIG_ENDIAN
#define SWAPBYTES(x) ( ((x) & 0xff) << 24 ) | ( (((x) >> 8) & 0xff) << 16 ) | ( (((x) >> 16) & 0xff) << 8 ) | ( (((x) >> 24) & 0xff) )
#else
#define SWAPBYTES(x) ( x )
#endif
修正例では、適切なエンディアンガードでマクロ定義をガードするので、逆アーキテクチャの代替を定義できます。