до одной единицы трансляции. Никаких библиотек, кроме буста, в бинарник не включается. UB стабильно проявляется.
При этом посредством хедеров включается еще довольно много шаблонного кода. Посоветуйте, каким способом искать место UB далее? Может прогнать через статический анализатор?
с чего вы взяли, что это UB?
Возможно скажу очевидность но ubsan пробовали?
Под O0 работат, под О2 при вызове виртуального метода segmentation fault.
Это отдельная утилита?
Это -fsanitize=undefined если кланг. https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
У меня gcc. Да, этот флаг включал
Тогда с большой вероятностью это и не уб если код однопоточный и нет обращений к библиотеки
А что это тогда? Поведение определенно не определенное 😁
Другие санитайзеры пробовали? Лучше вообще все одновременно (из тех что не взаимоисключающие)
Имеете ввиду включать флаги в компиляторе?
И с ними потом в гдб ещё
Дебагером?
Под О2 все жутко инлайнится. Если только под ассемблером идти
В GCC есть атрибуты для управления инлайнингом.
Можно попробовать. Но, боюсь, если запретить инлайнинг, то и ошибка скроется.
Попробуй в месте падения проанализировать стек, переменные..
Попробую. Падает всегда перед попыткой вызвать из базового класса виртуальный метод, который переопределен в наследнике. Причем бывает не падает, но метод не вызывается и поток исполнения оказывается вообще непонятно где. Иногда снова на 2 метода назад и тогда зацикливается.
Это скорее всего означает, что вы ранее нагадили по памяти
Ну ты учти что помочь тут никто не сможет, скорее ты сам что-то найдешь, если подумаешь хорошенько
Я уже тебе говорил - ищи проблему в другом месте, самое вероятное - это ты память "портишь", выход за границы.
Быть может в конструкторе производного класса некорректно вызывается конструктор базового класса?
Отладка под ассемблером показала, что во время очередного ret из функции, мы оказываемся черт знает где. То есть, после входа в эту функцию и перед выходом из нее кто-то гадит в стек и портит адрес возврата.
100 раз уже сказали - где то портиться память, ищи в другом месте
У меня были проблемы с виртуальными вызовами, когда я поменял хедер (размер базового класса) и система сборки не все пересобрала, полную пересборку попробуй, если еще не делал
В другом месте? Память портиться после вызова метода. В этом методе происходит вызов виртуальной функции. В функции печать в cout.
Не в этом причина
Вот кстати подтверждаю. Не раз с этим сталкивался. Порефакторишь что то глубоко, собираешь - абсолютно непонятный крах. Делаешь полную пересборку - все ок.
То есть когда метод начинает выполняться, адрес возврата верный? А когда заканчивает и хочет вернуться, уже стек испорчен?
CET не включал? или у тебя не интель?
Интел. А что это?
Обсуждают сегодня