PORTING.BYTEORDER.SIZE

网络转换宏使用了不兼容的类型

PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.BYTEORDER.SIZE 检查器会检测网络字节顺序宏 ntoh*() 和 hton*() 与不兼容类型一起使用的情况。

漏洞与风险

根据针对类型提升和类型降级的基础 ANSI 语义学,常见的数据转换函数可以接受不适当的类型来作为自变量,这导致可能出现不正确的转换。在最坏的情况下,这可能导致随机数据作为字节操纵进程的一部分进行转换。

缓解与预防

在代码对来自网络或发送至网络的数据进行转换时,始终使用适当的 ntoh*() or 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;
   }

检查器针对第 7 行生成警告,因为传递的类型大小 (unsigned short) 与转换函数 ntohl() 所预期的大小不同。

修正代码示例

复制
   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;
   }

经修复的示例使用了大小适当的宏进行转换,确保交换预期大小的字节。