ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Запретить возврат ссылок на временные объекты

Open b2soft opened this issue 3 years ago • 7 comments

На данный момент возвращать ссылку на временный объект является UB. Можно считать ill-formed код, если функция возвращает ссылку (без учета cv-квалифаеров) и в return statement указан возврат локальной/рвалуе переменной.

int& GetRef()
{
    int x = 42;
    return x; // Хорошо бы тут Compilation Error returning reference to local variable
}

Позволит увидеть подобные ошибки на этапе компиляции, вместо UB на рантайме. Следует отметить, что в компиляторе MSVC подобный код еще и работает нормально, что создает ложное впечатление о "правильности" кода и его переносимости (GCC будет писать ворнинг -Wreturn-local-addr на такой возврат). Также, механизм определения подобного кода существует (ворнинг в GCC), но не у всех включен + не все включают Treat Warning as Errors. А ворнинг достаточно критичный и не всегда заметный, по моему мнению. Я тяжело себе представляю, в каком случае возврат ссылки на локальную переменную вообще является корректным использованием механизма ссылок.

b2soft avatar Dec 21 '21 15:12 b2soft

Да, ошибка весьма распространенная. Подобное улучшение языка было бы весьма полезным.

sergii-rybin-tfs avatar Dec 24 '21 15:12 sergii-rybin-tfs

Да, ошибка весьма распространенная. Подобное улучшение языка было бы весьма полезным.

Ранее в одном из Телеграм чатов по С++ с Антоном обсуждали такое предложение (поверхностно), но не смогли придумать хорошую формулировку. Возможно, сейчас получится :)

b2soft avatar Dec 25 '21 20:12 b2soft

Есть много спорных моментов в языке, без которых C++ был бы проще в разработке и поддержке менее квалифицированными разработчиками.

У меня похожее предложение #476, суть которого даже объяснить не каждому получается. В тоже время этот UB я встречал на каждом из проектов.

Возможно, эти части стандарта упрощали разработку компилятора или потребление его ресурсов, но в современных реалиях они слишком удорожают разработку, усложняют кривую обучения и формируют некачественную репутацию языку.

sergii-rybin-tfs avatar Dec 26 '21 09:12 sergii-rybin-tfs

В голову пришёл интересный случай: локальный объект имеет неявный каст к Ty& и возвращает ссылку на некоторое содержимого, хранящееся не в самом объекте. С учётом невозможности полноценного анализа lifetime в современном C++ получим множество false-positive.

DymOK93 avatar Jan 09 '22 14:01 DymOK93

В голову пришёл интересный случай: локальный объект имеет неявный каст к Ty& и возвращает ссылку на некоторое содержимого, хранящееся не в самом объекте. С учётом невозможности полноценного анализа lifetime в современном C++ получим множество false-positive.

А можно пример какой-то минимальный-реалистичный?

b2soft avatar Jan 09 '22 15:01 b2soft

я так понял что предложение только про локальные переменные? а мемберы - это уже вне скоупа

sergii-rybin-tfs avatar Jan 09 '22 16:01 sergii-rybin-tfs

Да, речь про локальные переменные. Отслеживать мемберов проблематично, конечно, без лайфтайм системы.

b2soft avatar Jan 09 '22 16:01 b2soft