Семантическая версия: незначительное или значительное изменение?(вторая часть) - PullRequest
1 голос
/ 20 сентября 2019

Некоторое время назад Я спросил , потребует ли добавление полей в struct общей библиотеки значительного или незначительного изменения в строке версии в соответствии с семантическим версионированием.Несколько участников были склонны предлагать серьезные изменения.

Прошли месяцы, и я еще не добавил ни одного поля в свои struct.Но сейчас это может быть подходящее время для этого.

Однако в то же время я также думал о том, как это может нарушить бинарную совместимость с программами, скомпилированными с предыдущими версиями моей библиотеки, и, честно говоря, на столько жекак я думал, я не нашел ни одного возможного сценария, где бинарная совместимость нарушается.

Новые поля добавляются в конец структуры, и тот, кто использует мою библиотеку, обычно не выделяет этот struct ему-/ самой, но получает указатель на него в качестве аргумента функции обратного вызова.Это все, что моя библиотека делает с этим, пользователю никогда не нужно вызывать библиотеку, используя этот struct.

Возможны два сценария, когда старая программа запускается с новой версией библиотеки:

  1. При нормальных обстоятельствах (т. Е. Старая программа получает указатель на этот struct и считывает необходимые поля), теперь моя библиотека будет отправлять указатель на больший struct, ностарая программа не знает об этом и не заботится.
  2. Если старая программа по неизвестным причинам выделяет это struct для себя, она все равно выделяет меньшую структуру (это то, что программаЯ знал, когда это было действительно скомпилировано), но моя библиотека не знает об этом и не заботится, так как ей никогда не нужно получать этот struct от пользователя, он только отправляет его как указатель.

В предыдущем обсуждении кто-то также опубликовал эту цитату из Linux Program Library HOWTO - §3.6.Несовместимые библиотеки :

Когда новая версия библиотеки несовместима со старой в двоичном формате, сонама должна быть изменена.В C есть четыре основные причины, по которым библиотека перестает быть двоично-совместимой:

  1. Поведение функции изменяется так, что она больше не соответствует своей первоначальной спецификации,

  2. Изменение экспортируемых элементов данных (исключение: добавление необязательных элементов к концам структур разрешено, , если эти структуры размещены только в библиотеке ).

  3. Экспортируемая функция удаляется.

  4. Интерфейс экспортируемой функции изменяется.

Случайнет.2, кажется, говорит о непрозрачных структурах.Мой struct не непрозрачен, но ситуация очень похожа.Но реальная суть в том, что, как я уже сказал, мне не удалось найти ни одного сценария, в котором двоичная совместимость будет нарушена после этого изменения.

Таким образом, вопрос остается прежним: это незначительный илиизменение основной версии?

1 Ответ

1 голос
/ 20 сентября 2019

Единственная проблема, которую я вижу, это то, что пользователь делает что-то, что зависит от размера вашей структуры, и тогда неожиданные результаты возникают, когда программа перекомпилируется без обновления кода.Скорее всего, это затронет недвоичный дистрибутив, такой как Gentoo, или, возможно, цепочку сборки Yocto.

Например, если пользователь должен записать содержимое массива этих структур в файл, который он ожидаетчитать в следующий раз, когда программа запускается.Если программа будет перекомпилирована с новой версией библиотеки, возникнут проблемы, если она не узнает об изменении между версиями.Другая проблема может возникнуть, если присутствуют недобросовестные действия, такие как sizeof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...