5. glibc-2.3.5 for ARM 的 memset 函数 bug

函数原型:

void *memset(void *s, int c, size_t n);

n < 8 时功能正常。

n >= 8 时,实际填充到内存中的字节不再一致,作如下分布:

s[4*i+0] = (char)c;
s[4*i+1] = (char)c | (char)(c >> 8);
s[4*i+2] = (char)c | (char)(c >> 8) | (char)(c >> 16);
s[4*i+3] = (char)c | (char)(c >> 8) | (char)(c >> 16) | (char)(c >> 24);

可能会导致如下的错误:

memset(buf, '\xf0', 8);

预想的 buf 中的数据:

f0, f0, f0, f0, f0, f0, f0, f0

实际上,由于 '\xf0' 转为 int 型后为 0xfffffff0, 数据为:

f0, ff, ff, ff, f0, ff, ff, ff