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

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

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

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

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

16 ответов

6 просмотров

> Там говорится, что нужно избегать слова 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
Нет. Создаётся объект на стеке. После этого у него...

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

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
52
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
я не понимаю mov [r11+8],rcx и прочие. мы записываем значение из rcx, куда?
Bor
15
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
А какие расширения активно используются в промышленности? Именно идейные, по типу гадт, а не всякие оверлоадедстрингс
Степан
11
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
Карта сайта