c/c++中隐式算数转换造成的Bug

先看下文代码:

#include 
int aaa[]={1,2,3,4};
#define TOTALELEMENT (sizeof(aaa)/sizeof(aaa[0]))
int main()
{
    int d=-1;
    if(d<=TOTALELEMENT) printf("d<=TOTALELEMENT!\n");
    else printf("d>TOTALELEMENT!\n");
    return 0;
}

各位觉得输出结果应该是什么?输出结果如下:

d>TOTALELEMENT!

如果不相信的话可以自行复制代码执行测试,该Bug产生的原因在于,sizeof的返回值是unsigned类型。由于ANSI C的算数转换漏洞,在进行算数比较时,编译器会将d的int型默认转换成unsigned int比较,导致-1变成一个非常大的正数,结果就是"d>TOTALELEMENT!\n"。如果需要得到正确结果,只需在TOTALELEMENT加一个强制类型转换即可:

#include 
int aaa[]={1,2,3,4};
#define TOTALELEMENT (sizeof(aaa)/sizeof(aaa[0]))
int main()
{
    int d=-1;
    if(d<=(int)TOTALELEMENT) printf("d<=TOTALELEMENT!\n");
    else printf("d>TOTALELEMENT!\n");
    return 0;
}

你可能感兴趣的:(c/c++中隐式算数转换造成的Bug)