EN JP CN

PORTING.CAST.PTR

PORTING.CAST.PTR

ポインター型と非ポインター型の間のキャスト

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.CAST.PTR チェッカーは、ポインターまたは非ポインターのいずれでもない型の間でのキャストを検索します。

脆弱性とリスク

使用するプラットフォームやアーキテクチャによっては、符号なし整数のように整数型と同じビット数でポインターを表す場合と表さない場合があるので、ポインターを非ポインター型 (またはその逆) にキャストすることは安全ではないと考えられます。

軽減と防止

整数型にポインター値を保存しようとしないでください。ポイントされた型が実際に非表示となる必要がある場合は、代わりに void ポインターを使用します。

脆弱コード例

1   extern char* getData();
2   void foo()
3   {
4     char* ptr = getData();
5     unsigned int ptrValue = (unsigned int)ptr;

6       printf("Got data from: %d\n", ptrValue);
7   }

ポインター型の整数型との交換は、特定のプラットフォームで必ず失敗します。よって、すべてのプラットフォームで安全でないと考えられます。

修正コード例

1   extern char* getData();
2   void foo()
3   {
4     char* ptr = getData();
5     void* ptrValue = (void*)ptr;

6       printf("Got data from: %p\n", ptrValue);
7   }

修正例では、安全でない式の代わりに void ポインターを使用しています。