当前位置: 技术问答>linux和unix
请教大家一个GCC编译器的问题
来源: 互联网 发布时间:2016-07-27
本文导语: 如下子函数调用: static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg) { BOOL th_first; u_char ac; th_first = FALSE; if (NULL == dp->p_cur_ac_que) { th_first = TRUE; ac = 1; } if (th_first) dp->tmpbuf[0] = ac; return TRUE...
如下子函数调用:
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
if (th_first) dp->tmpbuf[0] = ac;
return TRUE;
}
编译器报 ac might be used uninitialized in this function,我看了一下逻辑,没有问题,我试着换
一种写法,如下,逻辑与上面一致。
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
if (NULL == dp->p_cur_ac_que) dp->tmpbuf[0] = ac;
return TRUE;
}
第二种写法就没有报警,我的编译选项是-Wall,以上代码经过适当简化。
因此,GCC编译器是不是有点BUG,或者说如何用编译选项去掉以上告警。
请各位大虾指教。谢谢。
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
if (th_first) dp->tmpbuf[0] = ac;
return TRUE;
}
编译器报 ac might be used uninitialized in this function,我看了一下逻辑,没有问题,我试着换
一种写法,如下,逻辑与上面一致。
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
if (NULL == dp->p_cur_ac_que) dp->tmpbuf[0] = ac;
return TRUE;
}
第二种写法就没有报警,我的编译选项是-Wall,以上代码经过适当简化。
因此,GCC编译器是不是有点BUG,或者说如何用编译选项去掉以上告警。
请各位大虾指教。谢谢。
|
第二个if (NULL == dp->p_cur_ac_que) 的话
th_first = TRUE;
ac = 1;
dp->tmpbuf[0] = ac;
这3个语句都要执行,那直接把最后一个语句放到第一个if中就行阿。。
第一个报的是未初始化的警告吧。我感觉没有问题
th_first = TRUE;
ac = 1;
dp->tmpbuf[0] = ac;
这3个语句都要执行,那直接把最后一个语句放到第一个if中就行阿。。
第一个报的是未初始化的警告吧。我感觉没有问题
|
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
如果这个if为假,那么
下面那个
if (NULL == dp->p_cur_ac_que)
为真的话,那么ac不就是一个未初始化的值么
当然你要说,这是不可能发生的,但编译器哪有这聪明呢
你为什么不这样写呢
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
dp->tmpbuf[0] = ac;
}
return TRUE;
}
{
th_first = TRUE;
ac = 1;
}
如果这个if为假,那么
下面那个
if (NULL == dp->p_cur_ac_que)
为真的话,那么ac不就是一个未初始化的值么
当然你要说,这是不可能发生的,但编译器哪有这聪明呢
你为什么不这样写呢
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
dp->tmpbuf[0] = ac;
}
return TRUE;
}
|
static BOOL response_request_data(struct PORT *dp, BOOL is_unsol_msg)
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
/×如果上面那个dp->p_cur_ac_que不为NULL, 那么ac就没有初始值 ×/
if (th_first) dp->tmpbuf[0] = ac;
return TRUE;
}
{
BOOL th_first;
u_char ac;
th_first = FALSE;
if (NULL == dp->p_cur_ac_que)
{
th_first = TRUE;
ac = 1;
}
/×如果上面那个dp->p_cur_ac_que不为NULL, 那么ac就没有初始值 ×/
if (th_first) dp->tmpbuf[0] = ac;
return TRUE;
}