EN JP CN

PORTING.BYTEORDER.SIZE

PORTING.BYTEORDER.SIZE

ネットワーク変換マクロを使用した互換性のない型の使用

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.BYTEORDER.SIZE チェッカーは、互換性のないタイプがネットワークバイトオーダーマクロである ntoh*() および hton*() に使用される状況を検出します。

脆弱性とリスク

型のプロモーションおよびデモーションの基礎となる ANSI セマンティックスに基づいて、通常のデータ変換関数は引数として不適切な型を受け取り、その結果、不正確な変換が実行される可能性があります。最悪の場合、バイト操作プロセスの一環として、ランダムデータが変換される可能性もあります。

軽減と防止

コードによりネットワーク間でデータを変換する場合は、必ず適切な ntoh*() または hton*() バリアントを使用します。

脆弱コード例

1   unsigned short foo(int socket)
2   {
3     int len;
4     unsigned short val = 0;

5       len = read(socket, &val, sizeof(unsigned short));
6       if( len == sizeof(unsigned short) )
7           val = ntohl(val);     // PORTING.BYTEORDER.SIZE
8       return val;
9   }

このチェッカーは、渡される型 (符号なし short) のサイズが変換関数 ntohl() で想定されるサイズと異なるために、行 7 について警告を生成します。

修正コード例

1   unsigned short foo(int socket)
2   {
3     int len;
4     unsigned short val = 0;

5       len = read(socket, &val, sizeof(unsigned short));
6       if( len == sizeof(unsigned short) )
7           val = ntohs(val);
8       return val;
9   }

修正例では、変換のサイズに適したマクロ/関数を使用することで、予想どおりのバイトがスワップされるようになっています。