我的功能是发出'悬挂参考'警告,即:
int mode_pos = 0, mode;
static char *s;
char buffer[FAT_BUFFER + 1];
chan->i_mode = chan->mode;
buffer[0] = 0;
s = buffer;
mode = chan->mode;
if (!mode)
return NULL;
^^^^^^^^^^^^
与局部变量'buffer'关联的堆栈内存的地址在返回给调用者时仍由全局变量's'引用。这将是一个悬垂的参考
这是否严重,实际纠正它的最佳方法是什么?
答案 0 :(得分:3)
这里似乎有设计问题。如果s
实际上只在一个函数中使用并且无条件地设置为buffer
,那么将它static
完全没有意义。如果是这样的话,这个悬空参考也不是一个非常危险的参考,但更好地清理你的代码以避免意外。
答案 1 :(得分:1)
是的,这很严重
它会导致未定义的行为。 buffer
的生命周期仅限于函数的范围({
,}
),它可能/可能不会超出函数体。它有时似乎有效,有时可能会失败。它不能保证工作,你会期望你的程序以一种定义的方式工作。所以应该避免它。
您需要以这样的方式定义buffer
,以使其生命周期超出函数体。有两种方法可以做到这一点:
malloc()
进行动态内存分配(来电者应记住free()
)或buffer
声明为static
本地。