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

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

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

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

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

16 ответов

19 просмотров

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

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта