clang悬空参考?

时间:2012-10-05 09:01:34

标签: c

我的功能是发出'悬挂参考'警告,即:

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'引用。这将是一个悬垂的参考

这是否严重,实际纠正它的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

这里似乎有设计问题。如果s实际上只在一个函数中使用并且无条件地设置为buffer,那么将它static完全没有意义。如果是这样的话,这个悬空参考也不是一个非常危险的参考,但更好地清理你的代码以避免意外。

答案 1 :(得分:1)

是的,这很严重 它会导致未定义的行为buffer的生命周期仅限于函数的范围({}),它可能/可能不会超出函数体。它有时似乎有效,有时可能会失败。它不能保证工作,你会期望你的程序以一种定义的方式工作。所以应该避免它。

您需要以这样的方式定义buffer,以使其生命周期超出函数体。有两种方法可以做到这一点:

  1. 使用malloc()进行动态内存分配(来电者应记住free())或
  2. buffer声明为static本地。