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();
}
该代码定义了其自己的限制,确保不论在平台间如何移动,都使用相同的数字值。