1、宏FD_ZERO 在libc-5.4.46版本中存在错误。
示例代码如下:
[code:1:5a2b7a82f8]
# define __FD_ZERO(fdsetp)
do {
int __d0, __d1;
__asm__ __volatile__ ("cld; rep; stosl"
: "=m" (((__fd_mask *)
(fdsetp))[__FDELT (__FD_SETSIZE)]),
"=&c" (__d0), "=&D" (__d1)
: "a" (0), "1" (sizeof (__fd_set)
/ sizeof (__fd_mask)),
"2" ((__fd_mask *) (fdsetp))
: "memory");
} while (0)
[/code:1:5a2b7a82f8]
解决办法为:替换为glibc 2.0版本。
2、不能用stdin初始化一个静态变量。
示例代码如下:
[code:1:5a2b7a82f8]
#include <stdio.h>
FILE *fp = stdin;
[/code:1:5a2b7a82f8]
解决办法:由于stdin不是一个常量,因此出错,在libc6以后的版本中,允许这样的使用方式,同时建议在main的开始处初始化。
3、#if使用存在bug。
示例代码如下:
[code:1:5a2b7a82f8]
memcpy(dest, src,
#ifdef PLATFORM1
12
#else
24
#endif
);
[/code:1:5a2b7a82f8]
解决办法:由于gcc预编译器不允许把#ifdef放在一个宏的参数中,所以出错,解决这个问题是,要么使用新版本的库,要么更改程序如下:
[code:1:5a2b7a82f8]
#ifdef PLATFORM1
memcpy(dest, src, 12);
#else
memcpy(dest, src, 24);
#endif
[/code:1:5a2b7a82f8]
4、浮点类型计算存在bug。
示例代码如下:
[code:1:5a2b7a82f8]
#include <iostream>
main() {
double min = 0.0;
double max = 0.5;
double width = 0.01;
cout << (int)(((max - min) / width) - 1) << endl;
}
[/code:1:5a2b7a82f8]
解决办法:在不同的系统中,上面的代码执行结果不一样。如果在编译的时候加上优化级别-O2,编译器在编译期分析最大值和最小值,并且给出一个结果;如果不加优化级别,在这个结果在运行期获得。优化级别的加入可能会改变赋值顺序。事实上,着不算是一个bug,而是float和double故有的局限。因为x87 FPU
的计算精度总比标准C的要高一些。
解决的办法是在编译的时候加上选项:-ffloat-store
这样强迫存储在主存重的浮点数比FPU中的精确。