xlc++和g++AIX上使用xlc++编译器,Linux上使用g++编译器。对于C标准中没有严格定义的行为,两个编译器不一定会以相同的方式处理,代码在两个平台上运行时会有不同的表现。如果在一个平台上运行正常,在另一个平台上可能是bug。问题集中在以下几个方面危险代码示例xlc++编译器g++编译器处理方法s="12"sprintf(r,"%04s",s);s小于四位,左边加'0'r="0012"s小于四位,左边空格填''r=”12”增加校验码charp=r;for(;p=='';++p)*p='0';文件描述符file=NULL写入内容时fprintf(file,"...");无法写入,程序继续向下执行,程序崩溃增加判断if(file!=NULL)memcpyout-of-boundscopyarraydata变量之间地址分散,数组本身越界,其他Variables没有影响,一般都能出正常结果。变量之间的地址紧邻,数组本身越界,相邻定义的变量的值也会被覆盖,导致结果异常。检查对应位置复制内存长度,避免越界结构s包含一个double变量a,使用前没有初始化。a的默认值为0.0a。默认值是一个超大的正数,会导致程序崩溃。增加初始化过程memset(&s,'0',sizeof(s));32位系统和64位系统如果两个平台其中一个是32位版本,另一个是64位版本,一些变量的长度会发生变化。注意事项如下:变量类型32位系统64位系统危险代码和处理long4bytes8bytes避免使用sizeof(long)获取长度值指针4bytes8bytes一些memcpy和strncpy代码的三个参数是sizeof(pointer),迁移后复制的内存长度发生变化(4变成8)结果异常。需要根据情况修改,避免使用sizeof操作指针等平台长度不同的变量。当数组名作为参数时,也相当于一个指针,不应该进行sizeof操作。
