- 论坛徽章:
- 20
|
gcc版本4.4.7- typedef unsigned int u32;
- static inline u32 jhash2(const u32 *k, u32 len, u32 init)
- {
- u32 c = 0;
- while (len > 3) {
- c += k[2];
- len -= 3;
- k += 3;
- }
- return c;
- }
- struct Obj1 {
- u32 a[5];
- u32 b[5];
- } obj1;
- struct Obj2 {
- u32 a[10];
- } obj2;
- #ifndef N
- #define N 8
- #endif
- #ifdef USE_OBJ2
- #define OBJ obj2
- #else
- #define OBJ obj1
- #endif
- u32 test()
- {
- return jhash2((u32 *)&OBJ, N, 0);
- }
复制代码 以上代码是对jhash2的简单模拟。
Obj1和Obj2结构的内存布局应该一样的。
但是,当使用-Wall -O2 -fno-strict-aliasing编译的时候,
Obj1在N取7/8/9的时候会产生warning: array subscript is above array bounds
使用Obj2就不会。
请问各位大牛,这该怎么解释?感觉跟循环展开有关系?- for i in {0..50}
- do
- gcc test.c -Wall -O2 -fno-strict-aliasing -c -DN=$i -Werror -DUSE_OBJ1 || echo error: N=$i, OBJ=obj1
- gcc test.c -Wall -O2 -fno-strict-aliasing -c -DN=$i -Werror -DUSE_OBJ2 || echo error: N=$i, OBJ=obj2
- done
复制代码 |
|