如何在g ++中设置警告以警告返回指向局部变量的指针?

时间:2014-05-10 16:30:43

标签: c++ g++ warnings

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

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上。

2 个答案:

答案 0 :(得分:3)

编译器无法知道您要在 func2 中返回指针的内容。

您也可以返回数组的实例,例如:

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

因为编译器无法评估返回指针的语义。

答案 1 :(得分:0)

根据 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();
    }

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