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

Поиск UB в большом проекте привел к уменьшению этого проекта

до одной единицы трансляции. Никаких библиотек, кроме буста, в бинарник не включается. UB стабильно проявляется.
При этом посредством хедеров включается еще довольно много шаблонного кода. Посоветуйте, каким способом искать место UB далее? Может прогнать через статический анализатор?

30 ответов

5 просмотров

с чего вы взяли, что это UB?

Возможно скажу очевидность но ubsan пробовали?

d7d1cd- Автор вопроса
Boris Usievich
с чего вы взяли, что это UB?

Под O0 работат, под О2 при вызове виртуального метода segmentation fault.

d7d1cd- Автор вопроса
d7d1cd
Это отдельная утилита?

Это -fsanitize=undefined если кланг. https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

d7d1cd- Автор вопроса
vitrevance
Это -fsanitize=undefined если кланг. https://clang...

У меня gcc. Да, этот флаг включал

Тогда с большой вероятностью это и не уб если код однопоточный и нет обращений к библиотеки

d7d1cd- Автор вопроса
vitrevance
Тогда с большой вероятностью это и не уб если код ...

А что это тогда? Поведение определенно не определенное 😁

d7d1cd
А что это тогда? Поведение определенно не определе...

Другие санитайзеры пробовали? Лучше вообще все одновременно (из тех что не взаимоисключающие)

d7d1cd- Автор вопроса
vitrevance
Другие санитайзеры пробовали? Лучше вообще все одн...

Имеете ввиду включать флаги в компиляторе?

Дебагером?

d7d1cd- Автор вопроса
Egor Kulebyakin
Дебагером?

Под О2 все жутко инлайнится. Если только под ассемблером идти

d7d1cd
Под О2 все жутко инлайнится. Если только под ассем...

В GCC есть атрибуты для управления инлайнингом.

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

Можно попробовать. Но, боюсь, если запретить инлайнинг, то и ошибка скроется.

d7d1cd
Можно попробовать. Но, боюсь, если запретить инла...

Попробуй в месте падения проанализировать стек, переменные..

d7d1cd- Автор вопроса
Ilya Zviagin
Попробуй в месте падения проанализировать стек, пе...

Попробую. Падает всегда перед попыткой вызвать из базового класса виртуальный метод, который переопределен в наследнике. Причем бывает не падает, но метод не вызывается и поток исполнения оказывается вообще непонятно где. Иногда снова на 2 метода назад и тогда зацикливается.

d7d1cd
Попробую. Падает всегда перед попыткой вызвать из ...

Это скорее всего означает, что вы ранее нагадили по памяти

d7d1cd
Попробую. Падает всегда перед попыткой вызвать из ...

Ну ты учти что помочь тут никто не сможет, скорее ты сам что-то найдешь, если подумаешь хорошенько

d7d1cd
Под O0 работат, под О2 при вызове виртуального ме...

Я уже тебе говорил - ищи проблему в другом месте, самое вероятное - это ты память "портишь", выход за границы.

d7d1cd
Под O0 работат, под О2 при вызове виртуального ме...

Быть может в конструкторе производного класса некорректно вызывается конструктор базового класса?

d7d1cd- Автор вопроса
Boris Usievich
Это скорее всего означает, что вы ранее нагадили п...

Отладка под ассемблером показала, что во время очередного ret из функции, мы оказываемся черт знает где. То есть, после входа в эту функцию и перед выходом из нее кто-то гадит в стек и портит адрес возврата.

d7d1cd
Отладка под ассемблером показала, что во время оче...

100 раз уже сказали - где то портиться память, ищи в другом месте

d7d1cd
Попробую. Падает всегда перед попыткой вызвать из ...

У меня были проблемы с виртуальными вызовами, когда я поменял хедер (размер базового класса) и система сборки не все пересобрала, полную пересборку попробуй, если еще не делал

d7d1cd- Автор вопроса
Александр Водянников
100 раз уже сказали - где то портиться память, ищи...

В другом месте? Память портиться после вызова метода. В этом методе происходит вызов виртуальной функции. В функции печать в cout.

d7d1cd- Автор вопроса
Cyan idle
У меня были проблемы с виртуальными вызовами, когд...

Вот кстати подтверждаю. Не раз с этим сталкивался. Порефакторишь что то глубоко, собираешь - абсолютно непонятный крах. Делаешь полную пересборку - все ок.

d7d1cd
В другом месте? Память портиться после вызова мето...

То есть когда метод начинает выполняться, адрес возврата верный? А когда заканчивает и хочет вернуться, уже стек испорчен?

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
Карта сайта