PORTING.BYTEORDER.SIZE
ネットワーク変換マクロを使用した互換性のない型の使用
PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.BYTEORDER.SIZE チェッカーは、互換性のないタイプがネットワークバイトオーダーマクロである ntoh*() および hton*() に使用される状況を検出します。
脆弱性とリスク
型のプロモーションおよびデモーションの基礎となる ANSI セマンティックスに基づいて、通常のデータ変換関数は引数として不適切な型を受け取り、その結果、不正確な変換が実行される可能性があります。最悪の場合、バイト操作プロセスの一環として、ランダムデータが変換される可能性もあります。
軽減と防止
コードによりネットワーク間でデータを変換する場合は、必ず適切な ntoh*() または hton*() バリアントを使用します。
脆弱コード例
コピー
unsigned short foo(int socket)
{
int len;
unsigned short val = 0;
len = read(socket, &val, sizeof(unsigned short));
if( len == sizeof(unsigned short) )
val = ntohl(val); // PORTING.BYTEORDER.SIZE
return val;
}
このチェッカーは、渡される型 (符号なし short) のサイズが変換関数 ntohl() で想定されるサイズと異なるために、行 7 について警告を生成します。
修正コード例
コピー
unsigned short foo(int socket)
{
int len;
unsigned short val = 0;
len = read(socket, &val, sizeof(unsigned short));
if( len == sizeof(unsigned short) )
val = ntohs(val);
return val;
}
修正例では、変換のサイズに適したマクロ/関数を使用することで、予想どおりのバイトがスワップされるようになっています。