使用新的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;
}
答案 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)
temp
在int temp;
之后未初始化。
logcat (MSPRO_P->regs[test], byte, &temp, test)
由于指向temp
的指针被传递给函数,我们作为程序员可以猜测该函数应该初始化temp
。但是,如果不是不可能的话,编译器绝对肯定地断言是非常困难的,特别是当该函数在单独的翻译单元中时。从编译器的角度来看,没有简单的方法来判断logcat
是写入*temp
还是先读取未初始化状态。这就是警告的原因。
摆脱此警告的最简单方法是为temp分配一些初始值,例如:
int temp = 0