Re[16]: C++ illegal instruction
От: alpha21264 СССР  
Дата: 13.08.25 10:55
Оценка:
Здравствуйте, Marty, Вы писали:

A>>i не будет существовать после цикла.

A>>Ну и как-то все привыкли. И даже я.

M>Это мелочь. Это было очень давно, когда совокупная кодовая база была не сравнима с текущей


Почему-то тебя это не волнует, когда новый кумпилятор ложит в корку программу, которая нормально работала до этого.

Течёт вода Кубань-реки куда велят большевики.
Re[18]: C++ illegal instruction
От: so5team https://stiffstream.com
Дата: 13.08.25 11:04
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>И да, в ней функции забывают возвращать значения. Это не мешает порождать видео длинной до двух часов.


Такое ощущение, что вы с UB в первый раз столкнулись.

Работа программы с UB внутри -- это из категории "пока". Пока работает. Может быть.
Re[14]: C++ illegal instruction
От: alpha21264 СССР  
Дата: 13.08.25 11:22
Оценка:
Здравствуйте, Marty, Вы писали:

A>>Для этого нужно ввести в стандарт всего одно ключевое слово neconst, и один флаг кумпилятора — как интерпретировать ситуацию, когда не задан ни тот ни другой модификатор. Я бы справился с этой задачей за один рабочий день.


M>И никто им не будет пользоваться, потому что старую кодовую базу никуда не деть, и любой твой новый код всё равно должен сопрягаться со старой кодовой базой


Ну вот я тебе и говорю, как можно было бы сделать мягкий переход не убив старые исходники.

Мне кажется, что со мной разговаривают два разных Marty.
Один говорит, что я должен залезть в стороннюю библиотеку и исправить там все варнинги,
а другой говорит, что не нужно вносить вполне разумное изменение в синтаксис, потому что исходники трогать нельзя.

Течёт вода Кубань-реки куда велят большевики.
Re[17]: C++ illegal instruction
От: rg45 СССР  
Дата: 13.08.25 11:43
Оценка:
Здравствуйте, alpha21264, Вы писали:

S>>Таких как я очень и очень много, судя по количеству const-ов в нормальных кодовых базах и количеству рекомендаций применять const by default от лучших собаководов. Так что нас рать.


A><тролль-мода>

A>Интеллектуальное большинство.
A></тролль-мода>

Ну так-то да, ссылки на авторитеты не хорошо использовать в качестве доказательтсв в спорах. В то же время, нельзя игнорировать то, что вещи, о которых мы говорим, уже на протяжении многих лет являются стандартами по всему миру во многих коллективах разработчиков С++, если не во всех. Для того, чтобы это переломить, нужно предложить что-то по истине революционное. На голых "я не привык", "я не понимаю" вряд ли это сдвинешь.
--
Справедливость выше закона. А человечность выше справедливости.
Re[15]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 13:53
Оценка:
Здравствуйте, rg45, Вы писали:

R>Стопудово свернет. Точно так же, как сгенерирует одинаковый код для ++i и i++. Но это вовсе не означает, что нет проблемы. Ты текст по ссылке-то открой.


Открыл. Я не понял, что ты хотел этой ссылкой сказать.

Насчёт преждевременной пессимизации. Я не стал бы писать так (хотя и видел продуктовый код, где именно такое и написано):

for (i = 0; i < strlen(s); i ++) {
    . . . .
}


Но уж по мелочи подстраивать код под удобство компилятора, ну его.

Спасибо C++-у, компиляторы стали очень умные. С мелочами сами разберутся.
Re[16]: C++ illegal instruction
От: rg45 СССР  
Дата: 13.08.25 14:01
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Открыл. Я не понял, что ты хотел этой ссылкой сказать.


Смысл прост: не стоить без необходимости усложнять код. А использование указателей на функции в надежде на последующую оптимизацию — это неоправданное усложнение, ИМХО. Зачем усложнять работу компилятору и заставлять его оптимизировать то, чего вообще могло бы не быть при прочих равных условиях?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 13.08.2025 14:02 rg45 . Предыдущая версия .
Re[18]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 14:06
Оценка:
Здравствуйте, serg_joker, Вы писали:

Pzz>>Ты не представляешь, сколько раз мне приходилось спорить с коллегами на тему, с какого это такого хрена я оставляю в релизной сборке assert-ы (обычно не либсишные, а самодельные, которые умеют прощальные слова в лог писать, а не куда придётся).

_>С подходом по ассёртам в целом согласен, за исключением того, что в релизе у меня по умолчанию они не сваливают всё-таки программу, а пишут в журнал условие и стек. Ну и можно через переменную окружения настроить поведение (можно полностью отключить, можно вызывать abort). К сожалению, иногда стреляет и в проде. Хотя всё меньше и меньше, но бывает. Изначально у меня тоже abort звало в проде, но была ситуация, когда ассёрт был ошибочным, и раз упавшая программа уже не поднималась, это вызвало реакцию, которую я больше переживать не хочу

Если у программы сработал assert, значит, у неё с головой уже не всё в порядке. Какой смысл продолжать агонию? Всё равно уже непонятно, куда её дальше занесёт.

Критический сервис — ну, на случай его падения должен быть план Б. В диапазоне от "перезапустить" и до "перейти на другой компьютер". На то он и критический, чтобы его падение тоже было штатной ситуацией, из которой предусмотрен выход. В конце концов, он может просто от аппаратной ошибки сломаться, или от сети отвалиться из-за плохого контакта в сетевом разъеме.

P.S. Я как-то работал в конторе, они там изобрели микросервисы. В том смысле, что их программа состояла из нескольких взаимодействующих процессов. Которые поднимались/запускались в определенной последовательности, и в случае падения перезапускались.

Я, как раз, отвечал за перезапускалку (ну и еще кой за чего, что к делу не относятся).

Так вот, у них там какой-то сервис падал на каждом запросе. Узнали они это, когда решили производительность протестировать. А так, перезапускалка работала штатно, падение и перезапуск сервиса было не заметно.

Pzz>><...> я не и делаю отдельных отладочных сборок, зачем мне тестировать и отлаживать дебугную сборку, если пользователю я поставляю релизную?

_>Тут не соглашусь, в дебажной сборке кроме моих ассёртов включаются ещё и внутренние проверки stl/libc всякие там проверки валидности итераторов и прочее. Да и сам я вставляю больше проверок инвариантов, которые в прод. всё-таки слишком дороги с т.з. времени выполнения. Да, отсутствие оптимизаций делает программу другой, но я на практике не сталкивался с тем, чтобы дебаг работал, а релиз — нет именно из-за включившегося оптимизатора, UB с этим связанного и прочего. А вот доп. проверки дебажного варианта stl что-то, было, и ловили.

Мне показывали пальцем на хидер от вендового SDK, там был #ifdef DEBUG ... #endif прямо посреди enum-а. А enum был такой, с автоматически назначаемыми значениями. Т.е., значения этого enum-а были разные для отладочной и релизной сборки.

Ну его нафиг, еще и такие ошибки мне искать.

Кстати, степень въедливости статического анализа что в gcc, что в clang-е зависят от оптимизации. С выключенной оптимизацией он не делает каких-то видов анализа кода, которые ему и для предупреждений нужны, а не только для кодогенерации.

_>И дебаг — с ASAN, тоже в релиз не покладёшь.


ASAN я как-то не осилил. Больно многого они хотят. Например, пересборки библиотек, от которых зависит программа, с ASAN-ом. Это ж полсистемы надо пересобрать да еще как-то бесконфликтно разложить. Нафиг такой инструментарий.

_>А, ну и на дебаг у меня нет -Werror, т.к. по месту, бывает, втыкаю мусорный код для отладки, где nodiscard игнорируется или приведение типа не делается явное или знак/беззнак сравнивается или ещё чего подобное, что недопустимо в коммит, но во времянке можно.


У меня эти времянки иногда по ошибке утекают в коммит. Так что я стараюсь даже и во времянке дичи не писать.

_>Полагаю, что различия в этой части у нас с тобой связаны в различиях между C++ и go инструментариями (на go не писал, могу только предполагать).


Ну я еще и на Си пишу.
Re[17]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 14:12
Оценка: +1
Здравствуйте, rg45, Вы писали:

Pzz>>Открыл. Я не понял, что ты хотел этой ссылкой сказать.


R>Смысл прост: не стоить без необходимости усложнять код. А использование указателей на функции в надежде на последующую оптимизацию — это неоправданное усложнение, ИМХО. Зачем усложнять работу компилятору и заставлять его оптимизировать то, чего вообще могло бы не быть при прочих равных условиях?


Насчёт неусложнения кода без необходимости я полностью согласен. Более того, в некритических по скорости местах (а это — процентов 80 любого проекта) я вполне сознательно могу выбрать сделать проще, а не быстрее. Нет никакой разницы, сколько времени читается конфигурационный файл, одну миллисекунду или две, и если можно написать проще, пусть хоть 5 миллисекунд читается.

Но в данном случае, я считаю, усложнение есть, но не от использования указателей, а от использования нестандартной конструкции, которую, как выясняется, далеко не всякий программист прочтёт, даже и сеньёр-помидор.

Вообще, я считаю, вершина мастерства — выражать сложные вещи таким языком, который без труда поймет даже джун.
Re[17]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 14:18
Оценка:
Здравствуйте, alpha21264, Вы писали:

M>>Это мелочь. Это было очень давно, когда совокупная кодовая база была не сравнима с текущей


A>Почему-то тебя это не волнует, когда новый кумпилятор ложит в корку программу, которая нормально работала до этого.


Если программа нарушает спецификацию языка, имеет полное право класть. Иначе компиляторы станет невозможно разрабатывать.

В данном случае, программа была синтаксически верна, но семантически — UB.

И я сначала было подумал, вот какой вредный компилятор, понимает, что программа — UB, но вредничает и вместо того, чтобы выругаться, бомбу подкладывает. А потом сообразил, он просто на всех выходах из этой функции без явного return-а подкладывает UB2, без какого-либо анализа, может функция выйти через эту дверь или нет.
Re[19]: C++ illegal instruction
От: serg_joker Украина  
Дата: 13.08.25 16:05
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если у программы сработал assert, значит, у неё с головой уже не всё в порядке. Какой смысл продолжать агонию? Всё равно уже непонятно, куда её дальше занесёт.


Pzz>Критический сервис — ну, на случай его падения должен быть план Б. В диапазоне от "перезапустить" и до "перейти на другой компьютер". На то он и критический, чтобы его падение тоже было штатной ситуацией, из которой предусмотрен выход. В конце концов, он может просто от аппаратной ошибки сломаться, или от сети отвалиться из-за плохого контакта в сетевом разъеме.

Всё так, и пререзапускается у нас автоматом. Но была ситуация — при вычитке, разборе, и дальнейшей обработке сообщения из кафки срабатывал неверный ассёрт, ну так вот вышло, моя лажа. И программа падала, не закоммитив это сообщение. А потом поднималась — и вычитывала его опять...
План Б, конечно, был: выгребли руками это сообщение из очереди. Но пока упало, пока осознали, пока до нас (девов) добрались — время. А у нас private LTE core, пока сервис лежит, абоненты не могут звонить и IoT устройства слать ничего не могут. Клиент нервничал, в результате нервничал я, а я этого не люблю, и ещё больше не любит руководство (справедливо).


Pzz>Мне показывали пальцем на хидер от вендового SDK, там был #ifdef DEBUG ... #endif прямо посреди enum-а. А enum был такой, с автоматически назначаемыми значениями. Т.е., значения этого enum-а были разные для отладочной и релизной сборки.

Pzz>Ну его нафиг, еще и такие ошибки мне искать.
Ну неприятно, да... интересно было бы на это глянуть. Но риск такого у меня минимален, т.к. собираю монолит без so, а профит от debug-диагностики реален.

Pzz>Кстати, степень въедливости статического анализа что в gcc, что в clang-е зависят от оптимизации. С выключенной оптимизацией он не делает каких-то видов анализа кода, которые ему и для предупреждений нужны, а не только для кодогенерации.

Не, ну перед коммитом один хрен собирать релиз, да и CI не пропустит билд с предупреждениями. Так что максимум — ну позже починю, чем если бы изначально с релизом работал.

Pzz>ASAN я как-то не осилил. Больно многого они хотят. Например, пересборки библиотек, от которых зависит программа, с ASAN-ом. Это ж полсистемы надо пересобрать да еще как-то бесконфликтно разложить. Нафиг такой инструментарий.

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

Pzz>У меня эти времянки иногда по ошибке утекают в коммит. Так что я стараюсь даже и во времянке дичи не писать.

Худшее — CI обругает ворнингами и билд сломается, не страшно. Совсем дичи я же не пишу.
Re[20]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 16:22
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>Всё так, и пререзапускается у нас автоматом. Но была ситуация — при вычитке, разборе, и дальнейшей обработке сообщения из кафки срабатывал неверный ассёрт, ну так вот вышло, моя лажа. И программа падала, не закоммитив это сообщение. А потом поднималась — и вычитывала его опять...


А если бы там по делу был assert? А программа не падала бы, а продолжала жить инвалидом?

_>План Б, конечно, был: выгребли руками это сообщение из очереди. Но пока упало, пока осознали, пока до нас (девов) добрались — время. А у нас private LTE core, пока сервис лежит, абоненты не могут звонить и IoT устройства слать ничего не могут. Клиент нервничал, в результате нервничал я, а я этого не люблю, и ещё больше не любит руководство (справедливо).


Похоже, в плане Б не хватает действия на случай, если программа падает без какого-либо прогресса.

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

Pzz>>ASAN я как-то не осилил. Больно многого они хотят. Например, пересборки библиотек, от которых зависит программа, с ASAN-ом. Это ж полсистемы надо пересобрать да еще как-то бесконфликтно разложить. Нафиг такой инструментарий.

_>Такого требования, чтобы библиотеки пересобирать, нет. Могут быть сложности, если память выделяетя в библиотеке, а освобождается в прикладном коде, но это само по себе нездорово. У меня библиотеки собираются без ASAN, продукт с ним, и никаких спецэффектов не наблюдал.

А мне питонщики сказали, что есть. Кто из вас неправ?

https://github.com/python/cpython/issues/135774
Re[17]: C++ illegal instruction
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.08.25 16:39
Оценка:
Здравствуйте, alpha21264, Вы писали:


M>>Это мелочь. Это было очень давно, когда совокупная кодовая база была не сравнима с текущей


A>Почему-то тебя это не волнует, когда новый кумпилятор ложит в корку программу, которая нормально работала до этого.


Видишь ли, это у тебя она случайно работала. А у сотен других их программа работала, но малозаметно подгаживала
Маньяк Робокряк колесит по городу
Re[15]: C++ illegal instruction
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.08.25 16:42
Оценка:
Здравствуйте, alpha21264, Вы писали:

M>>И никто им не будет пользоваться, потому что старую кодовую базу никуда не деть, и любой твой новый код всё равно должен сопрягаться со старой кодовой базой


A>Ну вот я тебе и говорю, как можно было бы сделать мягкий переход не убив старые исходники.


Распиши поподробнее, какие шаги ты видишь при этом переходе, а то ничего не понятно


A>Мне кажется, что со мной разговаривают два разных Marty.

A>Один говорит, что я должен залезть в стороннюю библиотеку и исправить там все варнинги,

Нет конечно. Сторонние библиотеки собираются просто с отключением варнингов. Жаль что ты не читаешь или не понимаешь, что тебе пишут


A>а другой говорит, что не нужно вносить вполне разумное изменение в синтаксис, потому что исходники трогать нельзя.


Изменение конечно разумное, но никто им пользоваться не будет
Маньяк Робокряк колесит по городу
Re[17]: C++ illegal instruction
От: rg45 СССР  
Дата: 13.08.25 17:12
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Почему-то тебя это не волнует, когда новый кумпилятор ложит в корку программу, которая нормально работала до этого.


В твоем случае "нормальная" работа программы была всего лишь частным случаем проявления неопределённого поведения. Но суть неопределённого поведения в том-то и состоит, что ни на какое определённое поведение ты рассчитывать не можешь. Вчера она работала так, а сегодня по-другому. UB — оно в Африке UB.
--
Справедливость выше закона. А человечность выше справедливости.
Re[19]: C++ illegal instruction
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.08.25 17:48
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Мне показывали пальцем на хидер от вендового SDK, там был #ifdef DEBUG ... #endif прямо посреди enum-а. А enum был такой, с автоматически назначаемыми значениями. Т.е., значения этого enum-а были разные для отладочной и релизной сборки.


Прям enum? И прям посередине? И автоматический? Можно мне тоже его показать?
Маньяк Робокряк колесит по городу
Re[20]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 17:49
Оценка:
Здравствуйте, Marty, Вы писали:

Pzz>>Мне показывали пальцем на хидер от вендового SDK, там был #ifdef DEBUG ... #endif прямо посреди enum-а. А enum был такой, с автоматически назначаемыми значениями. Т.е., значения этого enum-а были разные для отладочной и релизной сборки.


M>Прям enum? И прям посередине? И автоматический? Можно мне тоже его показать?


Сложно. Много лет прошло. Я уже не помню, где это искать.
Re[19]: C++ illegal instruction
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.08.25 17:51
Оценка:
Здравствуйте, Pzz, Вы писали:


Pzz>У меня эти времянки иногда по ошибке утекают в коммит. Так что я стараюсь даже и во времянке дичи не писать.



Я такое всегда оборачиваю в #ifdef _DEBUG
Маньяк Робокряк колесит по городу
Re[21]: C++ illegal instruction
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 13.08.25 17:54
Оценка:
Здравствуйте, Pzz, Вы писали:


Pzz>А мне питонщики сказали, что есть. Кто из вас неправ?


Pzz>https://github.com/python/cpython/issues/135774


Так это наверное у них просто всё говнецом ровным слоем обмазано


А так — код который собран с санитайзером — будет проверяться, прочий — нет. Как уже сказали, выделение памяти и освобождение, также думаю и прочие парные действия нужно делать в одном модуле
Маньяк Робокряк колесит по городу
Re[22]: C++ illegal instruction
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.08.25 18:00
Оценка:
Здравствуйте, Marty, Вы писали:

Pzz>>А мне питонщики сказали, что есть. Кто из вас неправ?


Pzz>>https://github.com/python/cpython/issues/135774


M>Так это наверное у них просто всё говнецом ровным слоем обмазано


Вообще, я думаю, что питонщики врут. Забыли чего-то проинициализировать, и теперь им лень копать.

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

M>А так — код который собран с санитайзером — будет проверяться, прочий — нет. Как уже сказали, выделение памяти и освобождение, также думаю и прочие парные действия нужно делать в одном модуле


Мой пример не выделяет память и не освобождает, а просто зовёт стандартную функцию из стандартной библиотеки питоньего интерпретатора.
Re[21]: C++ illegal instruction
От: serg_joker Украина  
Дата: 13.08.25 18:13
Оценка:
Здравствуйте, Pzz, Вы писали:

_>>Всё так, и пререзапускается у нас автоматом. Но была ситуация — при вычитке, разборе, и дальнейшей обработке сообщения из кафки срабатывал неверный ассёрт, ну так вот вышло, моя лажа. И программа падала, не закоммитив это сообщение. А потом поднималась — и вычитывала его опять...


Pzz>А если бы там по делу был assert? А программа не падала бы, а продолжала жить инвалидом?

Выбор сложный, мы решили вот так, урон меньше. Хотя мне тоже нравится, когда падает с корой.

Pzz>Похоже, в плане Б не хватает действия на случай, если программа падает без какого-либо прогресса.

Да, и что? Как после смерти программы чем-то внешним понять почему в общем случае она вперёд не двигается?

Pzz>Возможно, правильным действием было бы хранить предыдущую версию и автоматически на неё откатываться, если с новой после обновления всё плохо. Ну и там, письма электрические писать во все стороны, чтобы шуму поднять

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

_>>Такого требования, чтобы библиотеки пересобирать, нет. Могут быть сложности, если память выделяетя в библиотеке, а освобождается в прикладном коде, но это само по себе нездорово. У меня библиотеки собираются без ASAN, продукт с ним, и никаких спецэффектов не наблюдал.

Pzz>А мне питонщики сказали, что есть. Кто из вас неправ?
Это memsan всё-таки, а не asan, там таки есть требование пересобирать всё.
Для ASAN тоже желательно пересобирать всё, но требования такого нет, насколько я в курсе, и я на протяжении многих лет на текущем проекте ни разу не столкнулся с проблемами, связанные с тем, что внешние зависимости собираются без ASAN (и вообще релиз), libxml2 и openssl вообще из системных пакетов берутся, а мой код — с asan и debug. Библиотек немного, до 10-ти. Часть C, часть C++. Header-only я не считаю, конечно.
Могу предположить, что в MSVC будет всё хуже, там debug/release CRT плохо уживается и без ASAN.
Отредактировано 13.08.2025 18:15 serg_joker . Предыдущая версия . Еще …
Отредактировано 13.08.2025 18:14 serg_joker . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.