FreeBSD, GCC, Epic fail

Jan 26, 2013 00:11

Цілий тиждень, починаючи з минулої неділі, я кожного вечора після роботи сідав за комп, логінився через два шелла на віддалений сервер і боровся з багом.
Є у мене один секретний проект який потихеньку починає виходити у люди, і от треба було запустити його на FreeBSD. На лінуксах все працювало нормально і нічого не віщало біди...
hall of shame )

cpp, gcc, freebsd, програмування

Leave a comment

Comments 4

dmytrish January 26 2013, 15:17:02 UTC
Так загальновідомо, що exceptions у мові без збирання сміття важко реалізувати правильно. А в С++ із сотнями підводних каменів і поготів.

Reply

madf January 27 2013, 17:00:15 UTC
Мабуть, не на стільки загальновідомо. Я, наприклад, вперше чую. А в чому, власне, проблема?
А тут скоріше питання у FreeBSD, бо під лінуксами нічого подібного не спостерігається. Хоча я навіть не уявляю чому воно так залежить від ОС, я ж не думаю що у FreeBSD свої власні секретні патчі для компілятора. А розкрутка стека не така вже і низькорівнева штука щоб залежати від ядра.
Чи тут замішана libc?

Reply

dmytrish January 28 2013, 13:58:54 UTC
Проблема в складності визначення місця для звільнення пам’яті. Виключення - це те місце, де абстракція RAII починає протікати: мені якось на співбесіді задавали запитання, що буде, якщо виключення станеться в конструкторі одного з елементів, які створюються в new[] всередині іншого конструктора. Чесно кажучи, досі не знаю відповіді.

А про те, чому баг специфічний для FreeBSD, важко сказати. libc у них справді різна.

Reply

madf January 28 2013, 14:59:41 UTC
З моєї точки зору, exception - це як раз те місце де RAII не просто працює, а і взагалі найважливіша ідіома. Бо вона реалізує семантику транзакції.
Щодо питання - будуть викликані деструктори всіх сконструйованих членів елемента масиву, а потім деструктори всіх елементів масиву які на момент виникнення exception були сконструйовані, і в кінці - деструктори сконструйованих членів об'єкту верхнього рівня. Я зараз не можу вказати параграфів стандарту, але якщо треба - пошукаю ввечері коли буду вдома.
Мені важко навіть уявити яке відношення має libc до розгортки стеку під час обробки exception. Все таки exception - це "фіча" C++. Можливо вони використовують якісь власні патчі, не знаю. Не зміг навіть знайти багтреккеру FreeBSD.

Reply


Leave a comment

Up