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 ビットのプラットフォームにコードを移植することができます。
関連チェッカー
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。