【问题标题】:How to set warning in g++ for warning of returning pointer to local variable?如何在g ++中设置警告以警告返回指向局部变量的指针?
【发布时间】:2014-05-10 16:30:43
【问题描述】:

我认为这两个函数都有问题,因为它们返回指向堆栈中分配的局部变量的引用/指针:

int &func1() {
   int a = 3; 
   return a;
}
int *func2() {
    int a = 3;
    int *p = &a;
    return p;
}

但是当我使用编译命令 g++ -Wall 时,为什么它只对 func1 发出警告而不对 func2 发出警告?是因为 func2 可以故意用于某种目的,还是可以通过添加其他参数来设置警告?我的 g++ 版本是 4.6.3,在 Ubuntu 12.04 上。

【问题讨论】:

  • 返回对局部变量的引用是未定义的行为。返回一些指针不是。只有 取消引用 指针是。的确,没有办法合理地使用func2() 的值,但它不是那种未定义的行为。
  • gcc.gnu.org/onlinedocs/gcc/Warning-Options.html,有一个选项(-Wno-return-local-addr)(如果我理解正确的话)应该删除这种警告,即警告是默认启用。也许升级 gcc ?

标签: c++ g++ warnings


【解决方案1】:

编译器无法知道您要对 func2 中返回的指针做什么。

你也可以返回一个数组的实例,例如:

int *func2() {
    int a = 3;
    int *p = &a;
    /*some useful stuff*/
    if (some_criteria)
        p = new int[10];
    return p;
}

因为编译器没有能力评估返回指针的语义。

【讨论】:

  • 很好的例子,没想到!所以,是的,我上面的评论是无关紧要的......
【解决方案2】:

根据 gcc.gnu.org/onlinedocs/gcc/Warning-Options.html 上面的@kebs,有一个选项 (-Wno-return-local-addr) 可以做到这一点,默认情况下使用 -Wall (我检查过)。

但是,我有类似的东西

    char * foo(string bar) {
      return bar.c_str();
    }

没有警告。但是 bar 是一个副本,因此尽管 -Wall 会默默返回一个本地值。

应该有extr &

    char * foo(string &bar) {
      return bar.c_str();
    }

在一个几乎总是正常工作的大型程序中浪费了几个小时来跟踪它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2020-03-10
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多