警告:可以在此功能中使用未初始化

时间:2018-04-06 05:24:53

标签: c

使用新的gcc版本6.X

命中以下警告

警告:'temp'可能在此函数中未初始化使用[-Wyybe-uninitialized]

代码: -

int temp;
if (logcat (MSPRO_P->regs[test],
                        byte, &temp, test) == FALSE){
    memErrorMsgHistoryVa (MSPRO_MEMP, "Invalid Data Count 0 value");
    MSPRO_P->flashCmdError = TRUE;
}

2 个答案:

答案 0 :(得分:3)

gcc不应该警告将指向未初始化变量的指针传递给它不知道的任何函数(假设该函数将初始化它)。因此,我非常确定gcc知道logcat的内容,并且在那里检测到未初始化的用法。也许是内联等等。

示例:

$ cat > foo.c
static int
bar(int *a)
{
    return *a + *a;
}

int
foo(void)
{
    int x;
    int y = bar(&x);
    return x + y;
}
$ cc -Wall -c foo.c
$

在这里,尽管gcc对人类显而易见,但gcc实际上并不知道函数bar内部会发生什么。所以没有警告。

让我们帮助gcc了解正在发生的事情:

$ cc -O1 -Wall -c foo.c
foo.c: In function ‘foo’:
foo.c:4:12: warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
  return *a + *a;
         ~~~^~~~
foo.c:10:6: note: ‘x’ was declared here
  int x;
      ^
$

只是启用优化帮助gcc看看发生了什么(可能是一些内联发生)。

从您显示的最小代码片段和警告消息中,您看起来切断了实际上告诉您代码中问题发生位置的位,我得出的结论是问题在于您的问题logcat功能。

答案 1 :(得分:2)

tempint temp;之后未初始化。

logcat (MSPRO_P->regs[test], byte, &temp, test)

由于指向temp的指针被传递给函数,我们作为程序员可以猜测该函数应该初始化temp。但是,如果不是不可能的话,编译器绝对肯定地断言是非常困难的,特别是当该函数在单独的翻译单元中时。从编译器的角度来看,没有简单的方法来判断logcat是写入*temp还是先读取未初始化状态。这就是警告的原因。

摆脱此警告的最简单方法是为temp分配一些初始值,例如:

int temp = 0