Нет предупреждения компилятора о возвращении ссылки на локальную переменную

С использованием:

g++ -Wall -ansi foo.cpp

я получаю предупреждение

foo.cpp:31: предупреждение: возвращена ссылка на локальную переменную «x»

из функции:

int &bar(int x) {
     return x;
}

но, удалив эту функцию из файла, я не получаю предупреждения от следующей функции:

int &get_max(int x, int y) {
    return x > y ? x : y;
}

Почему компилятор это допускает?


person Ali    schedule 26.04.2015    source источник
comment
Кажется, это было добавлено в GCC 5.1.   -  person chris    schedule 26.04.2015
comment
Это не разрешает это. Просто об этом не предупреждают. clang 3.4 сообщает об этом в обоих случаях.   -  person Anirudh Ramanathan    schedule 26.04.2015
comment
gcc имеет аналогичный сбой для кода C: pastebin.com/eU6MwPbn   -  person Keith Thompson    schedule 26.04.2015
comment
анализатор кода pfff VS2013 тоже не сообщает об этом!   -  person BitTickler    schedule 26.04.2015
comment
Компилятор не обязан предупреждать вас каждый раз, когда вы делаете что-то глупое.   -  person Brian Bi    schedule 26.04.2015
comment
@chris выглядит как ошибка, gcc ловит ее с включенной оптимизацией, но не без оптимизации.   -  person Shafik Yaghmour    schedule 26.04.2015
comment
@ Брайан, конечно, но gcc, похоже, хочет отловить эти случаи, и это происходит, когда оптимизация включена, так что это выглядит как ошибка, которую команда gcc, вероятно, хочет исправить, но мы не узнаем об этом без отчета об ошибке.   -  person Shafik Yaghmour    schedule 26.04.2015


Ответы (1)


Похоже на ошибку, предупреждение противоречиво, если мы включим оптимизацию в gcc 5.1, это произойдет поймать этот случай:

warning: function may return address of local variable [-Wreturn-local-addr]
 return x > y ? x : y;
                    ^

в то время как без оптимизации gcc пропускает это.

Поэтому лучше всего отправить отчет об ошибке. Если они не верят, что это ошибка или не исправят ее, то, по крайней мере, будет ссылка для других, у которых такая же проблема.

person Shafik Yaghmour    schedule 26.04.2015
comment
Мех; много проверок в GCC зависит от включенной оптимизации. Это будет не первое и не последнее. - person T.C.; 26.04.2015
comment
@Т.С. это все еще выглядит как ошибка, мне несколько раз говорили, что если вы обнаружите то, что, по вашему мнению, является ошибкой компилятора, отправьте отчет об ошибке. Хуже того, что может случиться, это то, что это не ошибка, или они не хотят ее исправлять, но, по крайней мере, другие теперь могут найти отчет и иметь его для справки. - person Shafik Yaghmour; 26.04.2015