PORTING.CAST.PTR.SIZE

潜在的に互換性がないサイズのタイプへのポインターキャスト

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.CAST.PTR.SIZE チェッカーは、潜在的に互換性がないサイズのタイプへのポインターキャストを検出します。

脆弱性とリスク

特定のアーキテクチャのデータモデル用に作成されたコードは、新しいアーキテクチャで新しいデータモデルが使用される場合、移植が非常に困難になることがあります。たとえば、32 ビットと 64 ビットのデータモデル間でコードを移植する場合、新しいデータモデルでは、通常、'int' は 32 ビット値として使用されますが、'long' は 64 ビット値として使用されます。そのため、32 ビットデータモデルにおいて機能していたデータ型サイズで想定される等価性が実現されません。

軽減と防止

特定のコンパイラのデータモデルまたは基礎となるアーキテクチャ実装から抽象化されるコードベースのデータモデルを定義するのがベストプラクティスです。一般的な多くのコーディング基準では、すべての型でこのような抽象化が実現されます。

脆弱コード例

コピー
   void foo(long* pl)
   {
     int i, *pi;
       i = 32;
       pi = &i;
       *pl = *(long*)pi;   // PORTING.CAST.PTR.SIZE
   }

C 標準規格では、整数型に対する明示的なサイズ要件 (相対要件を除く) がないため、コンパイラのプロバイダは、相対サイズ要件 (long のサイズは int 以上でなければならないなど) を満たしている限り、'int' と 'long' (および 'long long') を自由に設計できます。この例に示されているコードは、通常の 32 ビット実装では機能しますが、ほとんどの 64 ビット実装では失敗します。

修正コード例

コピー
   void foo(long* pl)
   {
     int i, *pi;
       i = 32;
       pi = &i;
       *pl = 0L | *(int*)pi;
   }

修正コードでは、問題なく 64 ビットのプラットフォームにコードを移植することができます。

関連チェッカー

PORTING.CAST.SIZE

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。