【问题标题】:clang dangling reference?叮叮当当参考?
【发布时间】:2012-10-05 09:01:34
【问题描述】:

我的功能是发出“悬空引用”警告,即:

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

这严重吗?真正纠正它的最佳方法是什么?

【问题讨论】:

    标签: c


    【解决方案1】:

    你似乎有设计问题,在这里。如果s 真的只在那个函数中使用并且无条件地设置为buffer,那么拥有它static 是没有意义的。如果是这样,这个悬空引用也不是很危险,但最好清理代码以避免意外。

    【讨论】:

      【解决方案2】:

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

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

      1. 你动态内存分配使用malloc()(调用者应该记得free()它)或
      2. buffer 声明为static 本地。

      【讨论】:

      • 我继续,只是将缓冲区设为静态 :) 谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多