флаг -fdevirtualize и происходит SF. Подскажите, проблему точно стоит искать в виртуальных методах/их вызовах или же в силу подлой сущности UB проблема может быть где угодно?
где угодно плюс-минус
Ну так берете отладчик и смотрите. Оно же падает в конкретном месте, вот и проверяйте что происходит именно там
Попробовал сначала запуск под valgrind. Он говорит: ==19389== Use of uninitialised value of size 8 ==19389== at 0x40BB08: ... Под ассемблером нашел этот адрес:: 40bb08: c3 retq И да, именно при попытке возврата исполнение попадет черт знает куда. Выяснил, что на фрейме этой функции есть две инструкции sub $8,%rsp и только одна add $8,%rsp. Как будто компилятор забыл это сделать...
Ну, размер 8, виртуальные функции... Вполне вероятно, что тебе затирает таблицу виртуальных методов какого то класса
Код бы увидеть)
Допустим, что это так. Но тогда почему в бинаре нет строкового литерала, который в исходнике печатается в консоль?
Он должен быть там где константы вроде же
Не могу знать, А как это связано с твоей проблемой?
ну так берете этот TU и изучаете
Выкиньте половину кода, проверьте, падает ли, и повторяйте, пока не получите достаточно маленький пример
Я предполагаю, что уже на этапе компиляции из-за UB компилятор понял, что печататься этот литерал не будет и выкинул его.
Я сократил проект до одной TU. Как ее изучать? Какие варианты накините?
Так и делаю. На текущем этапе небольшое изменение кода скрывает UB, хотя при этом проект все еще достаточно большой.
gcc/clang ubsan не помогает?
Когда компилишь с UBsan-ом, UB сразу пропадает )
посмотрите, во что превращается функция, в которой этот литерал используется
В этой функции 3 строки: печать до вызова виртуального метода, вызов этого метода и печать после вызова. Вот то, что до вызова - печатается, то что в самом виртуальном методе тоже. И все. Больше ничего не печается.
Так может там в какой-нибудь printf что-то неправильно передаётся?
Там просто std::cout << "text" << std::endl;
Видимо вы путаетесь вызвать виртуальную функцию, которой нет :)
Тогда как она вызывается в дебаг режиме? Если ее нет )
Можно и ассемблер посмотреть куда джампаешь
Уже смотрел. На инструкции ret мы улетаем в никуда, потому что адрес возврата хрен пойми какой.
Теперь найди что адрес возврата перезаписало
А его не перезаписало. Там просто... Вот тут описано.
Если у тебя -O1 работает сравни выхлоп
Начни с проверки всех лайфтаймов. Внимание к delete, указателям и особенно ссылкам. Они меньше всего в глаза бросаются и чаще всего там и находятся проблемы.
Обсуждают сегодня