gcc 5.3 bug
От: night beast СССР  
Дата: 25.02.17 17:48
Оценка: 41 (2)
Пол дня потратил разбираясь

Валится:
class Base
{
    int m_count = {}; // если закоментировать инициализацию, то все ок. зачем-то у Derived обнуляется указатель на виртуальную таблицу.
};

struct Derived : public Base
{
    virtual ~Derived() {}

    void test() { do_test(); }
    virtual void do_test() = 0;

};

struct Test : Derived
{
    virtual void do_test() {
        std::cout << "ok";
    }
};
Test d;

int main()
{
    d.test();
    return 0;
}
Re: gcc 5.3 bug
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 25.02.17 18:04
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Пол дня потратил разбираясь


5.3 искать сложно, есть доступный 5.4, ничего странного не воспроизводится, аж на двух платформах.
The God is real, unless declared integer.
Re[2]: gcc 5.3 bug
От: night beast СССР  
Дата: 25.02.17 18:07
Оценка:
Здравствуйте, netch80, Вы писали:

NB>>Пол дня потратил разбираясь


N>5.3 искать сложно, есть доступный 5.4, ничего странного не воспроизводится, аж на двух платформах.


да, на ideone запускал -- нормально.
5.3 по дефаулту в виндовом qtcreator
Re: gcc 5.3 bug
От: Zhendos  
Дата: 25.02.17 18:20
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Пол дня потратил разбираясь


NB>Валится:

NB>
NB>class Base
NB>{
NB>    int m_count = {}; // если закоментировать инициализацию, то все ок. зачем-то у Derived обнуляется указатель на виртуальную таблицу.
NB>};

NB>struct Derived : public Base
NB>{
NB>    virtual ~Derived() {}

NB>    void test() { do_test(); }
NB>    virtual void do_test() = 0;

NB>};

NB>struct Test : Derived
NB>{
NB>    virtual void do_test() {
NB>        std::cout << "ok";
NB>    }
NB>};
NB>Test d;

NB>int main()
NB>{
NB>    d.test();
NB>    return 0;
NB>}
NB>


С gcc 6.3.1 не воспроизводится, а вот на gcc 5.3.0 и у меня падает,
забавно, что "Base() {}" исправляет баг, а "Base() = default;" нет.
Re: gcc 5.3 bug
От: _NN_ www.nemerleweb.com
Дата: 25.02.17 19:12
Оценка:
Здравствуйте, night beast, Вы писали:

Можно попробовать сравнить выхлоп здесь: http://gcc.godbolt.org/
Мельком посмотрел и не заметил проблемы.
Возможно какие-то ключи приводят к багу.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: gcc 5.3 bug
От: night beast СССР  
Дата: 25.02.17 19:43
Оценка:
Здравствуйте, Zhendos, Вы писали:

NB>>Пол дня потратил разбираясь


NB>>Валится:


Z>С gcc 6.3.1 не воспроизводится, а вот на gcc 5.3.0 и у меня падает,

Z>забавно, что "Base() {}" исправляет баг, а "Base() = default;" нет.

одна из причин, почему на новый стандарт долго не перебирался.
Re: gcc 5.3 bug
От: Кодт Россия  
Дата: 26.02.17 13:38
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Пол дня потратил разбираясь


NB>Валится:

NB>
NB>class Base
NB>{
NB>    int m_count = {};
NB>};
NB>

А если там инициализировать чем-то иным? Ну, скажем, m_count=12345 или m_count={12345} ?

Я подозреваю, что компилятор криво сгенерировал конструктор Derived из неявно определённого конструктора Base. Забыл сделать смещение базы (поскольку vfptr обычно размещают в самом начале объекта, жертвуя смещением неполиморфной базы), в результате этот самый 0 (или, как я предлагаю попробовать, 12345) попадает не в m_count, а в vfptr.
Перекуём баги на фичи!
Re[2]: gcc 5.3 bug
От: night beast СССР  
Дата: 26.02.17 17:02
Оценка:
Здравствуйте, Кодт, Вы писали:

NB>>Пол дня потратил разбираясь


К>А если там инициализировать чем-то иным? Ну, скажем, m_count=12345 или m_count={12345} ?


все равно падает.
не падает если сделать переменную локальной;
или инициализировать Test d = {}.

К>Я подозреваю, что компилятор криво сгенерировал конструктор Derived из неявно определённого конструктора Base. Забыл сделать смещение базы (поскольку vfptr обычно размещают в самом начале объекта, жертвуя смещением неполиморфной базы), в результате этот самый 0 (или, как я предлагаю попробовать, 12345) попадает не в m_count, а в vfptr.


нет. m_count инициализируется как надо. vfptr ноль.
ну да и фиг с ним. просто думал что качая в 16г. компилер можно надеяться на стабильную работу с 11 стандартом
Re[3]: gcc 5.3 bug
От: Кодт Россия  
Дата: 26.02.17 22:33
Оценка:
Здравствуйте, night beast, Вы писали:

NB>нет. m_count инициализируется как надо. vfptr ноль.

NB>ну да и фиг с ним. просто думал что качая в 16г. компилер можно надеяться на стабильную работу с 11 стандартом

Ну и не совсем фиг!
В багтрекере у гуся такого бага нет.
искомое слово "virtual" по всем багам для g++5.3.0

Возможно, что это какой-то плавающий баг, и ты первый, кто на него налетел.
Я бы на твоём месте заслал им багрепорт.
Перекуём баги на фичи!
Re[4]: gcc 5.3 bug
От: night beast СССР  
Дата: 27.02.17 06:04
Оценка:
Здравствуйте, Кодт, Вы писали:

NB>>нет. m_count инициализируется как надо. vfptr ноль.

NB>>ну да и фиг с ним. просто думал что качая в 16г. компилер можно надеяться на стабильную работу с 11 стандартом

К>Ну и не совсем фиг!

К>В багтрекере у гуся такого бага нет.
К>искомое слово "virtual" по всем багам для g++5.3.0

как выяснили, уже на 5.4 не воспроизводится.
перешел на 6.1. пока полет нормальный.

К>Возможно, что это какой-то плавающий баг, и ты первый, кто на него налетел.

К>Я бы на твоём месте заслал им багрепорт.

лень был бы актуальный, тогда можно было бы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.