Свежие комментарии

Title Comment
Да, к вопросу об инженерной практике. Проблема в том, что п

Да, к вопросу об инженерной практике.

Проблема в том, что проблемный вызов сделан именно для того, чтобы отвязать время жизни одного объекта (результата обработки RAW) от жизни другого (распаковщика RAW). Распаковщик отстрелил результат и пошел обрабатывать другой файл, например.

То бишь вполне жизненная задача, по заявкам телезрителей сделаная.

И при этом, кстати, fclose() версии 6 обнаружив FILE* версии

И при этом, кстати, fclose() версии 6 обнаружив FILE* версии 7 может склеить ласты, и это будет уже не на этапе линковки, а на рантайме.

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

Да тоже ничего хорошего. fclose() версии 7 должен закрыть р

Да тоже ничего хорошего.

fclose() версии 7 должен закрыть результат fopen() версии 6 или нет? А c версиями наоборот?

То бишь, кроме symbols (т.е. точек входа/функций) надо еще данные версионировать. В-принципе, хорошая идея, только вот боюсь "срыв колпака моментально".

Их конечно несколько. Их даже на одной машине может быть нес

Их конечно несколько. Их даже на одной машине может быть несколько.

Просто механизм динамической линковки другой - тот же free() в рамках процесса будет один. А откуда он взялся, из системной библиотеки, или я jmalloc подсунул для скорости или, наоборот, еще какой *alloc для отладки - это уже другой вопрос.

Уж у malloc/free, по счастью, даже потенциальных проблем с интерфейсом нет в рамках одной битности.

Понятно, что грабли есть и на таком пути - когда вызывающее приложение получает не просто хэндл (FILE* или void* или результат open), а с чем-то вроде stat(), но это лечится версионированием "DLL" и stat все одно будет один (а если два "DLL" просят stat() от разных версий - то не слинкуется).

версионирование экспортируемых символов -- ещё лучше.

версионирование экспортируемых символов -- ещё лучше.

нет, просто есть versioned symbols. Что в glibc, что в соляр

нет, просто есть versioned symbols. Что в glibc, что в солярисе, что в FreeBSD.

Все-таки, я не понимаю, если у меня вот такой вот код: int

Все-таки, я не понимаю, если у меня вот такой вот код:
int someclass::open_file(...)
{
return open(....)
}
То мне потом надо самому это закрыть. ФАЙЛОВЫЙ ХЭНДЛ? Вызывающее приложение close() не может сказать?

Я смирюсь с этим, куда деваться, но это полная херня.

Принципиальной разницы между результатом malloc() (реальный случай) и этим примером - я не вижу.

У этой структуры в последней версии размер изменился, вобщем

У этой структуры в последней версии размер изменился, вобщем что-то дописывают. Вообще стандартная библиотека не совсем стандартная, там куча всего дополнительного и это не только к windows относится, это везде так. Посмотрел в wikipedia - оказывается под unix их наплодили уже несколько.

Не-не. Источники проблем конечно есть, но это все разовые по

Не-не.
Источники проблем конечно есть, но это все разовые понятные акции:

off_t, который был 32 бита, а стал 64. На эту тему все-таки был вялый секс, который впрочем версионированием libc вполне лечится (как оно лечится в Linux - отдельная грустная история, по поводу которой я уже возмущался).

То же самое предстоит с time_t и эти часы уже тикают.

В API которые я видел обычно сразу подобные вещи оговаривают

В API которые я видел обычно сразу подобные вещи оговаривают, поставщик DLL должен четко описать это. Если он дает делать все что угодно и не закрывает интерфейсы памяти и доступ к crt объектам значит он как бы намекает на то что вы должны подстроится под меня и теперь это ваша проблема.

Вот пример из реальной жизни - подобный подход проповедует API AutoCAD, но они выпускают обновления API с заметным опозданием от версий VS. Пришлось поддерживать проект в старой студии, чтобы все это работало.

Мне кажется, при проектировании библиотек лучше сразу решать эту проблему и отказываться от жесткой привязки.

Версионирование DLL/.SO - есть благо, сменил ABI - увеличь н

Версионирование DLL/.SO - есть благо, сменил ABI - увеличь номерок. А программа, без дополнительных ужимок со стороны программиста, должна линковаться только со своим major version number (а minor - типа багфиксы с сохранением ABI)

Оно должно быть не 100% жестким, должен быть механизм ручного оверрайда (чтобы ту же отладочную библиотеку аллокации подсунуть), но по дефолту обязано работать.

источник проблем при смене версии libc я видел ровно один ра

источник проблем при смене версии libc я видел ровно один раз. Но это была Oracle которая сама себя высекла. Они там в процессе инсталляции перелинковывали приложение из объектников. А тут при смене версии о совместимости по объектникам никто не позаботился - старые слинкованные бинарники работают, старые исходники после компиляции работают и ладно.

А зачем ее менять? Языку 40 лет, чему там меняться? Внутренн

А зачем ее менять? Языку 40 лет, чему там меняться? Внутреннюю реализацию можно оптимизировать, но API-то неизменен.

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

Что удивительно, Microsoft на протяжении четверти века поддерживала стандартный API MS-DOS. И все прекрасно работало. И новые возможности добавлялись (сеть, длинные имена файлов) и работать старым программам это не мешало.
А здесь - не хотят.

Но другого выхода просто нет. Именно поэтому сейчас winsxs з

Но другого выхода просто нет. Именно поэтому сейчас winsxs занимает например у меня почти 5 gb, но там конечно не только crt.

Даже с .net они вынуждены менять версию, но там сделали хитро - они CLR (низкий уровень) меняли всего один раз - в версии 2.0 добавили generics, а .net 3, 3.5 и 4 это добавление новых классов, а старые они видимо не трогают.

Не, ничего она такого особенного с собой не тянет, всякий li

Не, ничего она такого особенного с собой не тянет, всякий libc уж точно системный.

Вот мне удивительно, что общеупотребительные объекты, вроде

Вот мне удивительно, что общеупотребительные объекты, вроде того же FILE* - несовместимы между собой.

Непривычный я к этому.

Вот с этим согласен - бесит именно то что линкуется и потом

Вот с этим согласен - бесит именно то что линкуется и потом не работает.

А магически заменить одну библиотеку на новую версию, чтобы все было идеально - это утопия и источник проблем, правильно что сделали четкое связывание по версиям.

> У меня под FreeBSD8/x64 работает антиспам, собранный (со в

> У меня под FreeBSD8/x64 работает антиспам, собранный (со всеми .so/dll) под FreeBSD5/x32 и отлично же работает.....

Я не очень понял - речь идет о программе собранной для bsd5 32-бита, она тянет с собой все необходимые библиотеки. Ты ее копируешь на 64-битную более новую систему и она тоже работает. Верно? Ну так она все необходимое с собой несет. Вот если ты откроешь в 32-битной системе состояние процесса и посмотришь список подключенных модулей и версии и тоже проделаешь в 64-битной системе - ты увидишь отличия?

Про твой пример с зависимостями: app -> libtiff app -> libjp

Про твой пример с зависимостями:
app -> libtiff
app -> libjpeg
app -> msvcrt10
libtiff -> msvcrt6
libjpeg -> msvcrt8

Все будет работать, каждый со своей библиотекой. А если начнете работать с объектами crt одной версии (объекты кучи, FILE* и пр.) из другой все рухнет. Задача разработчика библиотеки, которую он выпускает во внешний мир обеспечить безопасный интерфейс и описать правила как этого добиться.

Разработчик дает тебе: module.dll, module.lib, module.h mod

Разработчик дает тебе: module.dll, module.lib, module.h

module.dll зависит от crt_ver1.dll и это ты не изменишь, нельзя и не правильно подменять версии библиотек, т.к. они отличаются.

Другой вариант - он вообще может статически с ней слинковаться, тогда crt_ver1.dll не должна присутствовать в системе, но это так уже почти никто не делает.

Далее, если module.dll сделал выделение памяти и дал тебе указатель, а твоя crt имеет другую версию, то куча у тебя другая и при освобождении памяти будет падение.

Не, внутри *моего* проекта проблем как бы нет. Речь идет о

Не, внутри *моего* проекта проблем как бы нет.

Речь идет о том, как должен себя вести поставщик DLL.

Ну то есть понятно - сам породил, так сам и убивай, но если это убивай состоит из free(), то обидно как-то.

<i>а есть ли альтернативы этому, чтобы всё работало и не кус

а есть ли альтернативы этому, чтобы всё работало и не кусало друг друга?

Меня бесит ситуация, когда линкуется и не работает. Пусть уж лучше не линкуется (в смысле - динамическим линкером, на рантайме).

FILE* часть crt и она должна быть скрыта. Если такого слишко

FILE* часть crt и она должна быть скрыта. Если такого слишком много, то наверное правильно требовать совпадения crt. Мне кажется зачастую можно обойтись без открытия наружу FILE* - ведь речь идет о взаимодействии библиотеки и пользователя. Внутри вашего проекта отдельные модули конечно лучше согласовать, чтобы о подобном не думать, а снаружи давать доступ без подобных вольностей.

Если внутри есть модуль который развивается кем-то как-то параллельно, то лучше минимизировать его интерфейс.

Но это конечно общие слова, но в принципе о подобном приходится рано или поздно задумываться. Это понимаешь мир native кода со всеми перелестями.

Не, ну я последние лет 15 или около того, как разделямые биб

Не, ну я последние лет 15 или около того, как разделямые библиотеки в Linux/FreeBSD появились, собираю все с зависимостями от того что на машине есть, потом эти зависимости апгрейдю (в рамках сохранения ABI, естественно, там есть понятные грабли вроде "размер структуры поменялся") по одной - и не жужжу.

То бишь описанные вверху грабли - для меня внове.

верно, я и говорю, что _сменили_ ) Просто получается, что од

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

Другой вопрос - а есть ли альтернативы этому, чтобы всё работало и не кусало друг друга?... похоже, что нет...

Я не понимаю. Вот есть разработчик библиотеки, он дает мне

Я не понимаю. Вот есть разработчик библиотеки, он дает мне DLL + .H (+lib, естественно), как-то он его скомпилировал.

Либо нужно все это версионирование DLL/библиотек энфорсить и просто не давать скомпилироваться (слинковаться) не с тем рантаймом, либо все должно работать.

А как сейчас - и не энфорсят и не работает.

Если у меня есть libtiff, собранный VC6 (и зависимый от того рантайма), плюс libjpeg, собранный VC8 (и зависимый от другого рантайма), то я правильно понимаю, что VC2010 мое приложение с ними слинкует, будет зависимость от третьего рантайма, а работать оно будет, скорее всего, ужасающе?

У меня под FreeBSD8/x64 работает антиспам, собранный (со всеми .so/dll) под FreeBSD5/x32 и отлично же работает.....

Я не могу ничего сказать о unix, но это странно очень. Видим

Я не могу ничего сказать о unix, но это странно очень. Видимо libc там просто заморожена и почти не меняется. Любая сложная система при малейшей замене компоненты требует смены версии, гарантировать работу очень сложно, только если это довольно простой набор функций.

Не, ну это же усраться. Кроме аллокатора есть же и другие

Не, ну это же усраться.

Кроме аллокатора есть же и другие объекты, ну там файловые хэндлы (которые int) или FILE*

И че, если какая-то DLL-ка вернула мне результат fopen() чтобы я с ним покувыркался, то не факт что у меня оттуда fread() получится.

Йобнуться можно.

Как тут уже написали, libc - часть системы. Есть всегда. То

Как тут уже написали, libc - часть системы. Есть всегда.
То бишь, free() всегда один, а если не один - это бардак и катастрофа.

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

Вот с stdc++ бывает веселее и со всякими темплейтами - тоже.

Насчет веревок и ноги не понял? При разработке принято изол

Насчет веревок и ноги не понял?

При разработке принято изолировать код на модули - это просто архитектура и дизайн. Естественно в рамках одного большого проекта модули скорее всего будут поддерживаться параллельно и везде все будет на одной crt и нативно юзать классы как хотят. Но какие-то проекты могут быть сторонними или по каким-то иным причинам быть в другом окружении - вот тут надо думать обо всех этих проблемах. Плохо что сама среда c++/с никак тут не помогает. В managed языках я думаю такой проблемы быть не должно в принципе - нет совместимости нет компиляции.

Pages

Subscribe to comments_recent_new