170 похожих чатов

Давно ищу причину UB в большом проекте. Минимальный пример сделать

не удалось, но сделал не минимальный, в котором воспроизводится "плохое поведение" программы. Там, в частности, происходит виртуальный вызов метода и в этот момент происходит SF. Сборка проекта при этом должна происходить с флагами -fdevirtualize и -finline-small-functions. В противном случае все работает правильно.

Сегодня наткнулся на статью. Там говорится, что нужно избегать слова final, так это может привести к тому, что компилятор ошибется при оптимизации. А у меня тот самый виртуальный метод был как раз помечен как final. Я убрал его и программа отработала правильно 😳.

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

16 ответов

21 просмотр

> Там говорится, что нужно избегать слова final, так это может привести к тому, что компилятор ошибется при оптимизации Где конкретно это написано? Не смог найти

Ну либо компилятор конкретно ваш плохой, либо внутри виртуальной функции меняется динамический тип объекта, либо его втейбл

звучит скорее как баг в компиляторе

d7d1cd- Автор вопроса
Alexander Karaev
> Там говорится, что нужно избегать слова final, т...

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

d7d1cd- Автор вопроса
Kelbon
Ну либо компилятор конкретно ваш плохой, либо внут...

Внутри виртуальной функции просто std::cout

d7d1cd
Сорри за введение в заблуждение. Действительно, та...

Наличие final позволяет сделать чуть больше оптимизаций. Если оптимизации приводят к крашу, значит либо в коде UB (по везению не воспроизводится без оптимизаций), либо баг в компиляторе

d7d1cd- Автор вопроса
Kelbon
ну без кода непонятно

MRE, к сожалению, подготовить не удалось пока.

А уж не из конструктора/деструктора ли вызов делается?

d7d1cd
Нет

А вызов делается через объект final или derived класса? Судя по флагам именно этот вызов должен быть заинлайнен чтобы поломалось. Может оно как то не кастует указатель из derived при инлайне, надо disasm смотреть

d7d1cd- Автор вопроса

Вызов виртуального метода делается из базы, этот метод переопределен в наследнике, где он помечен как final.

d7d1cd
Вызов виртуального метода делается из базы, этот м...

И метод, вызывающий метод, вызывается не из конструктора базы? Просто уточняю, что запрещено вызывать из конструктора не только напрямую, но и с какими-то промежуточными вызовами

d7d1cd
Вызов виртуального метода делается из базы, этот м...

Ну если точно через базу, можно просто смотреть сгенерированный код в месте вызова с final и без, он должен быть идентичен.

d7d1cd- Автор вопроса
Alexander Karaev
И метод, вызывающий метод, вызывается не из констр...

Нет. Создаётся объект на стеке. После этого у него вызывается метод.

d7d1cd
Нет. Создаётся объект на стеке. После этого у него...

Ага, то есть фактически компилятор знает тип и этот вызов может таки быть девиртуализирован.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта