PORTING.BITFIELDS
構造内のビット フィールド
PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.BITFIELDS チェッカーは構造内でのビットフィールドの使用を検出します。
脆弱性とリスク
ビットフィールドを使用するデータ構造を定義する場合、メモリの構造のレイアウトにおいて、特定のチップの特定のコンパイラの基礎となるエンディアン表現に依存することになります。そのため、データ転送や永続的な記録などのために、アプリケーションを異なるコンパイラに移植すると、このレイアウトは簡単に変更され、データ構造がバイトバッファに書き込まれるときに問題が発生します。
軽減と防止
このような移植の問題を解決するには、特定のエンディアンアーキテクチャ用に明示的にレイアウトされた構造の特定のバリアントを定義し、各バリアントを適切な BIG_ENDIAN または LITTLE_ENDIAN マクロで保護します。
脆弱コード例
コピー
struct
{
unsigned short f1 : 4;
unsigned short f2 : 5;
unsigned short f3 : 7;
} myPackedLayout;
この例での問題とは、エンディアンアーキテクチャ間での移行がある場合に、構造のランタイムレイアウトが変わるということです。そのため、'f3' が、チップやツールチェインに応じて 'f1' の前または後のいずれかで発生します。
修正コード例
コピー
#if BIG_ENDIAN
struct
{
unsigned short f1 : 4;
unsigned short f2 : 5;
unsigned short f3 : 7;
} myPackedLayout;
#endif
この修正例では、レイアウトは共通のアーキテクチャを共有するチップで必ず同様に機能することがわかっているあるため、そのアーキテクチャを共有しないチップの代替パックレイアウトを定義できます。この場合、ツールチェーンのチップセットに依存することなく、プログラマーがレイアウトを定義します。