cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open b2soft opened 2 years ago

b2soft commented 2 years ago

На данный момент возвращать ссылку на временный объект является 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. А ворнинг достаточно критичный и не всегда заметный, по моему мнению. Я тяжело себе представляю, в каком случае возврат ссылки на локальную переменную вообще является корректным использованием механизма ссылок.

sergii-rybin-tfs commented 2 years ago

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

b2soft commented 2 years ago

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

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

sergii-rybin-tfs commented 2 years ago

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

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

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

DymOK93 commented 2 years ago

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

b2soft commented 2 years ago

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

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

sergii-rybin-tfs commented 2 years ago

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

b2soft commented 2 years ago

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