免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17480 | 回复: 5
打印 上一主题 下一主题

古怪!!一个编译警告! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-03 13:42 |只看该作者 |倒序浏览
redhat 9,几个月前编译没有任何问题,代码没有作任何改动,今天rebuild了一下,出现这个warning(几百个),估计是环境问题。(我把代码拷贝到另外一台电脑,编译没有问题)
在这里想请教一下
这个warning产生的原因是什么?
如何可以去掉这个warning?

现在贴出一部分编译结果

*******.c:318: warning: pointer targets in assignment differ in signedness
*******.c:319: warning: pointer targets in assignment differ in signedness
*******.c:320: warning: pointer targets in assignment differ in signedness
*******.c:321: warning: pointer targets in assignment differ in signedness
*******.c:322: warning: pointer targets in assignment differ in signedness
*******.c:323: warning: pointer targets in assignment differ in signedness
*******.c:324: warning: pointer targets in assignment differ in signedness
*******.c:325: warning: pointer targets in assignment differ in signedness
file1.c:262: warning: pointer targets in passing argument 2 of 釳D5Update?differ in signedness
file1.c:263: warning: pointer targets in passing argument 2 of 釳D5Update?differ in signedness
file1.c:264: warning: pointer targets in passing argument 2 of 釳D5Update?differ in signedness

另外,无意发现一个古怪的现象,估计和这个warning有关。在gdb的时候发现memset无效。(我用以前编译的版本gdb,没有这个问题),一并在这里请教一下,为什么这个str的前面几个字节会不能memset

1282            UINT8  str[256] = {0};
(gdb) n
1289            INT32  ret = 0;
(gdb)
1291            if (!g_sql_data.state) return FALSE;
(gdb)
1294            memset(str, 0x00, sizeof(querystr));
(gdb)
1295            sprintf(str, SQL_GET_SYSTEMPARAM);
(gdb) p str
$1 = "\032\034\005\b\201", '\0' <repeats 250 times>

[ 本帖最后由 ChinaPeter 于 2007-7-3 13:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-03 14:04 |只看该作者
是unsigned的原因吧.

论坛徽章:
0
3 [报告]
发表于 2007-07-03 14:14 |只看该作者
原帖由 baohuaihuai 于 2007-7-3 14:04 发表
是unsigned的原因吧.


好像是,系统环境在哪里设置??可以具体点么

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-07-03 19:18 |只看该作者
〉〉sprintf(str, SQL_GET_SYSTEMPARAM);
这一行干吗用的?

论坛徽章:
0
5 [报告]
发表于 2007-07-04 09:02 |只看该作者
原帖由 lenovo 于 2007-7-3 19:18 发表
〉〉sprintf(str, SQL_GET_SYSTEMPARAM);
这一行干吗用的?



str是sql查询字符串,这行代码是给str赋值。

论坛徽章:
0
6 [报告]
发表于 2007-07-04 09:38 |只看该作者
原帖由 baohuaihuai 于 2007-7-3 14:04 发表
是unsigned的原因吧.


的确是unsigned的原因,但是我不知道在哪里设置可以解决这个问题。
我写的测试代码
test.c
#include <time.h>
#include <stdio.h>
#define UINT8 unsigned char

void getFormatTime(UINT8 *str_time, time_t time_stamp);
int main()
{
    time_t time_stamp = 0;
    UINT8 time_str[32] = {0};        
    UINT8 buf[4] = {0x00,0x00,0x00,0x00};
    memset(buf,0,4);

    time_stamp = 1179974176;
    getFormatTime(time_str, time_stamp);
    printf("time_str = %s \n", time_str);
    return 0;
}
void getFormatTime(UINT8 *str_time, time_t time_stamp)
{
        struct tm tm_time;
        if(str_time == NULL)
        {
                return;
        }
        if(time_stamp == 0)
        {
                str_time[0] = '\0';
                return;
        }
        localtime_r(&time_stamp, &tm_time);
        sprintf(str_time, "%d-%d-%d %d:%d:%d", (tm_time.tm_year+1900), tm_time.tm_mon+1, tm_time.tm_mday, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec);
}

[root@EMC prac]# gcc -g -w -Wall -o test test.c
[root@EMC prac]# gdb test
(gdb) b main
Breakpoint 1 at 0x80483c4: file test.c, line 9.
(gdb) r
Starting program: /home/root/prac/test
Breakpoint 1, main () at test.c:9
9       {
(gdb) n
main () at test.c:10
10          time_t time_stamp = 0;
(gdb) n
11          UINT8 time_str[32] = {0};
(gdb) n
12          UINT8 buf[4] = {0x00,0x00,0x00,0x00};
(gdb) n
13          memset(buf,0,4);
(gdb) p buf
$1 = "\000??
(gdb) p time_str
$2 = "\003綷000@", '\0' <repeats 27 times>
(gdb) n
16          time_stamp = 1179974176;
(gdb) p buf
$3 = "\000??
(gdb)

可以看出unsigned char数组,初始化无效,memset也无效。
同样的代码在另外一台机子上是可以,两台电脑是用同一张光盘装得(redhat),只是出问题的电脑前一阵好像编译过什么冬冬,不知道为什么就坏了。
下面是在另外一台电脑上gdb结果
(gdb) n
9           unsigned char time_str[32] = {0};
(gdb) n
10          unsigned char buf[4] = {0x00,0x00,0x00,0x00};
(gdb) n
11          memset(buf,0,4);
(gdb) p time_str
$1 = '\0' <repeats 31 times>
(gdb) p buf
$2 = "\000\000\000"
(gdb) n
14          time_stamp = 1179974176;
(gdb) p buf
$3 = "\000\000\000"
(gdb)

[ 本帖最后由 ChinaPeter 于 2007-7-4 09:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP