Linux编译警告的解决办法
2013-01-10 17:05
363 查看
一、warning: cast from pointer to integer of different size
1).while((sp < 256) && (src[sp] != NULL))
->while((sp < 256) && (src[sp] !=
'\0'))
2).dest[dp] = NULL;
dest[dp] = '\0';
为了测试字符串的实际长度,C语言规定了字符串结束标志'\n';'\n'代表ASCII码为0的字符,它不是一个可以显示
的字符,而是一个空操作符,只作为一个辨别的标志。
二、warning: dereferencing type-punned pointer will break strict-aliasing rules
in file CSTFlowControl.c:
STAT_FC_STREAMING_FCSTATUS_EX * pMsg;
STREAM_PACKET strPkt;
pMsg = (STAT_FC_STREAMING_FCSTATUS_EX *)&strPkt;
when running C:\WindRiver\gnu\4.1.2-vxworks-6.6/x86-win32/bin/ccmips
(gcc version 4.1.2 (Wind River VxWorks G++ 4.1-82))
get warning: dereferencing type-punned pointer will break strict-aliasing rules
solution:
pMsg = (STAT_FC_STREAMING_FCSTATUS_EX *)(int32)&strPkt;
explanation:
convert the address of strPkt to an integer, then convert this integer to an pointer to struct (STAT_FC_STREAMING_FCSTATUS_EX
you should confirm that the conversion between those two data type is legal.
refer to:
我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:
unsigned int a;
TYPE *ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制)
ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:
unsigned int a;
TYPE *ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a;//呵呵,这就可以了。
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。
上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:
例十六:
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。
好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。
三、使编译时显示详细的错误/警告信息的编译选项是什么?
对程序要求严格的话可以用 -Wall -Werror
1).while((sp < 256) && (src[sp] != NULL))
->while((sp < 256) && (src[sp] !=
'\0'))
2).dest[dp] = NULL;
dest[dp] = '\0';
为了测试字符串的实际长度,C语言规定了字符串结束标志'\n';'\n'代表ASCII码为0的字符,它不是一个可以显示
的字符,而是一个空操作符,只作为一个辨别的标志。
二、warning: dereferencing type-punned pointer will break strict-aliasing rules
in file CSTFlowControl.c:
STAT_FC_STREAMING_FCSTATUS_EX * pMsg;
STREAM_PACKET strPkt;
pMsg = (STAT_FC_STREAMING_FCSTATUS_EX *)&strPkt;
when running C:\WindRiver\gnu\4.1.2-vxworks-6.6/x86-win32/bin/ccmips
(gcc version 4.1.2 (Wind River VxWorks G++ 4.1-82))
get warning: dereferencing type-punned pointer will break strict-aliasing rules
solution:
pMsg = (STAT_FC_STREAMING_FCSTATUS_EX *)(int32)&strPkt;
explanation:
convert the address of strPkt to an integer, then convert this integer to an pointer to struct (STAT_FC_STREAMING_FCSTATUS_EX
you should confirm that the conversion between those two data type is legal.
refer to:
我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:
unsigned int a;
TYPE *ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制)
ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:
unsigned int a;
TYPE *ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a;//呵呵,这就可以了。
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。
上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:
例十六:
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。
好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。
三、使编译时显示详细的错误/警告信息的编译选项是什么?
对程序要求严格的话可以用 -Wall -Werror
相关文章推荐
- Linux下时间戳不同步造成编译警告的解决办法
- Linux GCC编译警告:Clock skew detected. 错误解决办法
- Linux GCC编译警告:Clock skew detected. 错误解决办法
- 编译内核出错:invalid option `abi=aapcs-linux' 解决办法
- linux编译源码是内存不足的解决办法
- Linux内核编译,模块尺寸变大的解决办法
- RHEL 5安装arm-linux-gcc-4.4.3.tar.gz后,编译报/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found 错,解决办法!
- Linux下编译安装gtk问题的解决办法
- 在Visual Studio 编译代码时出现警告warning C4819: 该文件包含不能在当前代码页(936)中表示的字符的解决办法?
- (原创)Windows下编译的Shell脚本不能再Linux中运行的解决办法
- linux下编译出现空间不足解决办法
- arm-linux编译内核提示 Unable to find the ncurses libraries解决办法
- linux编译找不到apr问题解决办法
- Linux 下编译安装软件,找不到共享库 xx.so 的解决办法
- ICTCLAS2015 linux编译不通过解决办法(expected constructor, destructor or type conversion before '(' token)
- IMP-00041: 警告: 创建的对象带有编译警告解决办法
- UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
- MITK-ProjectTemplate编译错误C2220警告视为错误解决办法
- Linux编译程序时缺少连接库的解决办法
- Linux下编译安装freetype出错信息及解决办法