LINUX.ORG.RU

Потестите свой GCC. у меня бага

 


0

2

версия с репы такая: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609

опции компилятора: -std=c++11 -Wall -Wextra -Wshadow -Winit-self -Wredundant-decls -Wcast-align -Wundef -Wfloat-equal -Wunreachable-code -Wmissing-include-dirs -Wswitch-default -fno-rtti -fno-exceptions

код

#include <cstring>
#include <iostream>

class StringRef{
public:	
	const std::string &_ref; //const reference to some string
	StringRef(const std::string &fs):_ref(fs){}
};

//print two strings 
void printTwoStrings(const StringRef &ft, const std::string &fs){
	std::cout<<"\nmust be: A  B > ";
	std::cout<< ft._ref <<"  " << fs << "\n";
}

//print string ref only
void printRef(StringRef &ft){
	std::cout<<"\ntrying to print string ref";
	std::cout<< ft._ref << "\n";
}


int main(){
//incorrect behavior - reference to local object
	StringRef lt("A"); 
	printTwoStrings(lt,"B");

//correct behavior - reference to temporary object
	printTwoStrings(StringRef("A"),"B");

	//printRef(lt); //it crashes

//just wait
	std::string ls;
	getline(std::cin,ls);
}

печатает в неверном случае B B, а должно быть A B.

На clang-6.0 все нормально.

★★★
Ответ на: комментарий от xaizek

Бага в коде. В первом случае UB. Там же ссылка на мёртвый объект.

где мертвый. он на стеке, пока не вышли из мейна, он живее всех живых.

alysnix ★★★
() автор топика
Ответ на: комментарий от xaizek

lt – да, но не std::string, на который указывает lt._ref.

точно. вопрос снимается.

alysnix ★★★
() автор топика

ASAN это ловит, кстати.

i-rinat ★★★★★
()

Типичный сценарий поведения неофита, чуть что не так, ищем ошибку в компиляторе. Классика.

Надеюсь, про 20 это шутка.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Типичный сценарий поведения неофита, чуть что не так, ищем ошибку в компиляторе. Классика.

Я так понимаю, что @WitcherGeralt не писал багрепорты разработчикам компиляторов, потому что не искал ошибки в компиляторах, так как это поведение неофитов?

а по теме @i-rinat правильно сказал, тут всё ловит ASAN.

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Как-то раз от безысходности искал ошибку в одной библиотеке, и, ЧСХ, нашел, но другую, а свою нашел потом.

Нет, грешить на баги в компиляторе не нормально, особенно когда обделался на жалких 30 строках. Сначала ищешь ошибку у себя в коде, с вероятностью в 99.999% именно там она и будет.

WitcherGeralt ★★
()

Кстати, начиная с цпп20 будет продлена жизнь временного объекта при инициализации агрегата выражением в фигурных скобках (не случай автора, но близко):

a temporary bound to a reference in a reference element of an aggregate initialized using direct-initialization syntax (parentheses) as opposed to list-initialization syntax (braces) exists until the end of the full expression containing the initializer. 

struct A {
  int&& r;
};
A a1{7}; // OK, lifetime is extended
A a2(7); // well-formed, but dangling reference

Полез сейчас - сколько там всякой мелочёвки ввели, надо заново кресты осваивать )).

pavlick ★★
()
Ответ на: комментарий от pavlick

Кстати, начиная с цпп20 будет продлена жизнь временного объекта при инициализации агрегата выражением в фигурных скобках

При инициализации агрегата жизнь продлевается начиная с C++98.

(В C++98/03 даже исключения из правила продления жизни для временных объектов в new-initializer не было, его добавили в N2531 :-/)

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от pavlick

я ведь тоже не сам придумал

Кривое истолкование скинутой тобой цитаты придумал ты сам.

о чём они тогда толкуют?

О том, что в добавленном в C++20 способе инициализации агрегатов круглыми скобками, время жизни временных объектов не продлевается до времени жизни ссылки-члена агрегата.

А не о том, что в C++20 добавили продление жизни при инициализации агрегатов фигурными скобками.

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

Ну да, затупил, ввели то инициализацию агрегатов через ().

pavlick ★★
()
Ответ на: комментарий от thunar

Хм, ссылка то константная. Ее константность разве не продлевает время жизни объекта, по аналогии с возвратом такой ссылки?

dvetutnev
()
Последнее исправление: dvetutnev (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Ну подумаешь, в глаза долбится. С кем не бывает.

peregrine ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.