Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2093457
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类: C/C++

2011-10-10 15:17:33

2.6.27.8内核在编译时,默认会提示如下警告:

HOSTCC scripts/basic/fixdep scripts/basic/fixdep.c: 在函数‘traps’中: scripts/basic/fixdep.c:377:2: 警告:提领类型双关的指针将破坏强重叠规则 scripts/basic/fixdep.c:379:4: 警告:提领类型双关的指针将破坏强重叠规则

问题上面说得很清楚,在scripts/basic/fixdep.c这个文件的377、379两行:

  1. void traps(void)
  2. {
  3.     static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";

  4.     if (*(int *)test != INT_CONF) {
  5.         fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#xn",
  6.             *(int *)test);
  7.         exit(2);
  8.     }
  9. }

所谓的“提领类型双关的指针”大概也不知道什么意思,个人理解应该是这里的test指针本来是char型的,但是这里又按int型来引用。所以存在“双关”,提领估计意思是用*取变量的操作。这个警告的意思,大致是如果用int型指针来提取char型的数据,会导致数据提取越界。
解决起来也很简单,直接建立一个新的int型的指针变量,将test强制转换后赋值给他,然后再用*操作符来提取数据,代码如下:

  1. void traps(void)
  2. {
  3.     static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";
  4.     int * tmp_p = (int *)test;

  5.     if (*tmp_p != INT_CONF) {
  6.         fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#xn",
  7.             *tmp_p);
  8.         exit(2);
  9.     }
  10. }
转自:
阅读(11588) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~