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

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

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

30 ответов

22 просмотра

с чего вы взяли, что это 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.

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

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

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

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

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