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 epta gde offset polomali nahui", и ясно вижу, что тесткейсом и либой юзается именно он.
Начинаю тупо перебирать ключи компилятора. Напереберил и стало дико смешно, потомучто всю панику мне наводил -DHAVE_INET6, от включения которого меняется размер структурок с адресами.
Вобщем классно придумали - все магические дефайны выяснять при сборке и не писать ни в какой config.h.