vak: (бэсм-6)
[personal profile] vak
Ситуация как в старом анекдоте. Собранный компилятором Clang, парсер отлично работает, что с оптимизацией, что с отладкой. Собранный GCC в режиме отладки тоже работает. Но если GCC с оптимизацией - большинство тестов падает. Пробовал на Линуксе и на маке - одинаково. Не могу понять почему.

Date: 2025-05-27 05:57 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Все -Wall -Wextra -pedantic добавил? Ещё можно отдельные функции пробовать запрещать оптимизировать через pragma (если чего нового не добавили). Отдельно ради прикола собрать на более старой системе со старым gcc.

Date: 2025-05-27 06:56 (UTC)
From: [personal profile] ichthuss
А если вьінести структуру List из функции? Понятно, что мусор в глобальном неймспейсе, но камон, єто ж си, там такого все равно навалом.

Date: 2025-05-27 09:07 (UTC)
From: [personal profile] ichthuss
Даже если структура присутствует в хедере? Оно на єтапе линковки его вьікидьівает, что ли?

Date: 2025-05-27 23:32 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Что у тебя за GCC? Есть же godbolt.org, на котором можно экспериментировать с разными версиями, разными опциями и пр. мгновенно.

https://godbolt.org/z/ve7sj3MoG

Date: 2025-05-27 23:58 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
А проверять, на какой версии ошибка появилась, и на какой она была исправлена, или проявляется ли ошибка в стандартной поставке, как ты с помощью юнит-тестов будешь?

Ты по ссылке прошел? Увидел, какой ассемблер порождается из твоей функции? Если у тебя другой, то дело не в GCC как таковом.
Edited Date: 2025-05-28 00:00 (UTC)

Date: 2025-05-28 21:09 (UTC)
From: [personal profile] ichthuss
Тут дело немного другое: приведение void* к List* допустимо только в том случае, если ранее этому void* присваивался указатель на List или 0. Иначе - undefined behavior. А это означает, что если компилятор может доказать, что ни при каких условиях фактическим параметром не мог оказаться указатель на List, то !node_ptr не может быть false, а, значит, оставшийся код можно выбросить.

Date: 2025-05-28 22:14 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Так что же мешает компилятору в примере по ссылке на godbolt доказать, что указателем на тип, определённый внутри функции, фактический параметр не может быть в принципе, и соптимизировать эту функцию?

Date: 2025-05-29 19:35 (UTC)
From: [personal profile] ichthuss
Ничего не мешает, но ничто и не обязывает.

Date: 2025-05-29 20:46 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Загадка в том и заключается, чтобы найти разницу между случаем, когда компилятор захотел оптимизировать, и случаем, когда он не захотел.

Date: 2025-05-29 21:17 (UTC)
From: [personal profile] ichthuss
Чисто из спортивного интереса - да, загадка интересная. Но вообще баловаться с undefined behavior - развлечение на любителя.