written on Thursday, September 27, 2012
Тащуся з інженерного генія писателів libre і захоплююсь тим, як зручно працювати з сішними лібами вообше.
Пишу софтину на libre, дивлюсь значить з коннекшн хендлера в структурку, де лежить розпаршене поле From, і бачу, що там написана абсолютна хуйня. Ні, не так — якби була абсолютна хуйня, можна було б шось інше подумати. А тут хуйня досить правдоподібна.
Замість імені юзера чомусь у from.uri.user торчить цілий рядок адреси "sip:mimimi@hostnamimi", а в полях "хост" і "порт" — вообше щось невразумительне.
Звісно хочеться заплакати і поскаржитись мамі, но не варіант — доводиться лізти в сорси. В сорсах находиться функція uri_decode(), в якій мутний регексп. Витягую регексп з коду і перевіряю — матчиться як треба.
Ну думаю, може тут матчилка регекспів дурна або щось ще довкола криве. Роблю тесткейс — сую свій нерозпаршений адрес в функцію і дивлюсь шо вийде на виході. На виході нормально розпаршена структура. Виявляється я не перший хто додумався парсити адресу і функція працює.
Піднімаюсь на рівень вище і втикаю відладку прямо в лібу, в той кусок який ітерується по хедерам і запускає uri_decode() і сує результат в msg->from.uri. В парсилці хедерів теж все нормально.
Тут вже починаю думати шо шось дивне відбувається — начебто більше ніхто не лізе в msg->from і затерти правильний результат нікому. Однако факти налицо — всередині парсера значення правильне, а зовні вже криве.
Починаю дивитись вже не на дані, а на адресу по якій живе &msg->from. Опать фігня — начало структури msg співпадає, а вказівник на поле — різний ззовні і всередині.
Тут до мене починає доходити шо тесткейс я збирав окремо від дерева самої ліби, тому компілятори різні і вообше десь може підсмоктуватись кривий хедер від системної версії libre. Зношу системну лібу, перевіряю шо хедерів ніде більше нема. Збираю обидва куски коду системним кленгом — один хуй зміщення поля і вообше розмір структури получається різний.
Дивлюсь на флаги компілятора — начебто ніякої магії яка пакує структури не бачу. Дивлюсь на структуру — іфдефів не бачу, коротких полів нема, паддінгів нема. Пишу в хедер магічне #error єпать гдє офсєти поламалі нахуй, і ясно бачу шо і тесткейс і ліба юзають саме його.
Починаю тупо перебирати ключі компілятора. Наперебирав і стало дико смішно, потому шо всю паніку мені наводив -DHAVE_INET6, від включення якого міняється розмір структурок з адресами.
Вообщем класно придумали — всі магічні дефайни виясняти при збірці і не писати ні в який config.h.