PORTING.MACRO.NUMTYPE

描述内建数字型的宏

PORTING 检查器会标识那些可能依赖于不同编译器中特定实施细则的代码。PORTING.MACRO.NUMTYPE 检查器会检测使用描述内建数字型的宏的情况。

漏洞与风险

通常,编译器会针对它们的特定数据模型和功能提供“宽容”的数字限制(通常在 limits.h 中)。跨平台使用这些值很危险,因为其他编译器提供的限制可能不同,并可能采用完全不同的宽度(依据按位表示法)。该做法可能导致堆栈溢出、数值溢出或欠位、操作运行时预算耗尽以及许多其它问题。

缓解与预防

定义您自己的限制,以便您清楚了解正在处理的内容,而不是依赖于特定平台的编译器所提供的抽象数字。

漏洞代码示例

复制
   extern void do_something_that_takes_a_while();
   void foo()
   {
      for( int i = 0; i < INT_MAX; i++ )
        do_something_that_takes_a_while();
   }

在两个平台之间(比如在 16 位和 32 位之间)移动该代码时,该函数的操作预算可能以指数级别扩展。

修正代码示例

复制
   #define MAX_OPS 65535
   extern void do_something_that_takes_a_while();
   void foo()
   {
      for( int i = 0; i < MAX_OPS; i++ )
        do_something_that_takes_a_while();
   }

该代码定义了其自己的限制,确保不论在平台间如何移动,都使用相同的数字值。