EN JP CN

PORTING.CAST.PTR.SIZE

PORTING.CAST.PTR.SIZE

サイズに互換性がない可能性がある型へのポインター キャスト

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

脆弱性とリスク

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

軽減と防止

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

脆弱コード例


1   void foo(long* pl)
2   {
3     int i, *pi;

4       i = 32;
5       pi = &i;
6       *pl = *(long*)pi;   // PORTING.CAST.PTR.SIZE
7   }

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

修正コード例


1   void foo(long* pl)
2   {
3     int i, *pi;

4       i = 32;
5       pi = &i;
6       *pl = 0L | *(int*)pi;
7   }

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

関連チェッカー

PORTING.CAST.SIZE

外部参考ガイドライン