Ломать ли совместимость в недокументированной области?
От: Michael7 Россия  
Дата: 11.11.10 09:17
Оценка: 40 (9) +1
Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков.

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

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

И вот кто тут прав?

Ситуация невымышленная. Недавно эта история приключилась в Linux.
Подробности можно узнать из этого обсуждения.

Вкратце произошло вот что.

Есть важнейшая системная библиотека glibc (ее разработчики работают в основном в RedHat), в которой содержится сишный рантайм. В ней есть функция memcpy, копирующая память и описанная в документации как:

MEMCPY(3) Linux Programmer's Manual MEMCPY(3)

NAME
memcpy — copy memory area

SYNOPSIS
#include <string.h>

void *memcpy(void *dest, const void *src, size_t n);

DESCRIPTION
The memcpy() function copies n bytes from memory area src to memory
area dest. The memory areas should not overlap. Use memmove(3) if the
memory areas do overlap.


Она копирует из одной области памяти в другую заданное число байт. Специально указывается, что источник и приемник не должны пересекаться, если пересекаются необходимо использовать вместо memcpy функцию memmove. При том такое описание было с весьма древних пор, минимум с 1993-ого года или вообще с самого начала.

Но де-факто, реализация memcpy в glibc позволяла спокойно копировать и пересекающиеся области памяти. И вот разработчики чего-то там оптимизировали для увеличения скорости копирования, после чего в случае пересекающихся областей памяти копироваться они стали неверно.

Это привело к неправильному воспроизведению звука в плагине Adobe Flash player и к сбоям в некоторых других менее известных программах.

Разработчики glibc закрыли сообщение об ошибке по причине, что это не ошибка. Дискуссия развернулась довольно серьезная. В ней даже отметился лично Линус Торвальдс, который отнюдь не считает, что в glibc были правы, и даже ехидно спрашивает, собираются ли они выпустить дистрибутив Fedora 14 с заведомо неработоспособным флеш плеером?

В принципе, ошибка не в glibc, а в прикладных программах и для исправления достаточно банально заменить memcpy(...) на memmove(...) и заново откомпилировать программу. Для OpenSource — это особо не проблема, но в Linux-e работают и проприетарные программы, которые производители могут и не спешить исправлять. Правда Линус предложил способ решить проблему путем использования своей реализации memcpy и подкладывании своей библиотеки для конкретной программы. Но это костыль.

Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.
Re: Ломать ли совместимость в недокументированной области?
От: Aen Sidhe Россия Просто блог
Дата: 11.11.10 09:23
Оценка: +3
Здравствуйте, Michael7, Вы писали:

M>Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.


Есть много денег, как у Майкрософта — лепи костыль для каждого кулхацкера (как, например, поддержка SimCity и прочего). Нет много денег, как обычно, следи, чтобы документированное работало как работало.

В целом, виноваты, кулхацкеры, использовавшие недокументированные фичи.
С уважением, Анатолий Попов.
ICQ: 995-908
Re: Ломать ли совместимость в недокументированной области?
От: DOOM Россия  
Дата: 11.11.10 09:25
Оценка: +13
Здравствуйте, Michael7, Вы писали:

M>Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.


Моя имха, что разработчик здесь прав на все 100%. Если что-то они просят не делать, то это, в частности, и для того, чтобы у них в будущем было пространство для маневра.
Схожий пример — зарезервированные поля в протоколах. Их обычно очень много — и, если вдруг кто-то начнет их использовать, чтобы передавать какие-то свои данные, то ни к чему хорошему это не приведет — потому что рано или поздно авторы протокола найдут применение этим полям.


P.S. Указанная проблема решается путем использования предыдущей версии glibc для пострадавших программ — вполне себе способ, учитывая, что проприетарные программы итак в 90% случаев используют библиотеки с префиксом compat
Re: Ломать ли совместимость в недокументированной области?
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 11.11.10 09:36
Оценка: +3
Здравствуйте, Michael7, Вы писали:

M>Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков.


M>Причем некоторые из разработчиков используют это API не описанным в документации способом или даже прямо там запрещенном (не в юридическом смысле) и никаких проблем от этого до сих пор не возникало, потому что, де-факто, оно работало нужным образом, хотя и не позволенным документацией.




It depends, как говорится. Тут недавно в КУ пролетала история про Microsoft, которая при выпуске я так понимаю 95-й винды затачивала системные библиотеки под конкретные глючившие игрушки и приложения. Со стороны разработчиков, кажется неправильно в системные библиотеки вводить условия, что если пользователь запускает SimCity, то менеджер памяти работает по другому. А со стороны пользователей хорошо, что старые программы работают в новой системе.

Так что вопрос скорее маркетинговый. Конкретно про линукс я думаю, что удобство для программистов, привыкших использовать memcpy недокументированным образом может быть важнее, чем выигрыш нескольких процентов в производительности. Зависит опять же от количества программистов и количества процентов
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re: Ломать ли совместимость в недокументированной области?
От: Мишень-сан  
Дата: 11.11.10 11:06
Оценка:
Здравствуйте, Michael7, Вы писали:

[skipped]

ИМХО, виноваты авторы прикладного ПО. Во всех доках по С API жирными буквами написано не использовать memcpy для пересекающихся регионов. В С/С++ такие штуки караются UB. Если разрабы флеш-плеера не изволють читать доку...
Хотя, конечно, это можно решить элементарно — сделать и memcpy и memmove с проверкой на пересечение регионов, и в зависимости от этого использовать безопасный или небезопасный метод. Сомневаюсь, что несколько лишних инструкций на проверке overlap сделают погоду.
Re: Ломать ли совместимость в недокументированной области?
От: vmpire Россия  
Дата: 11.11.10 11:41
Оценка: 3 (1)
Здравствуйте, Michael7, Вы писали:

M>Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков.


M>Причем некоторые из разработчиков используют это API не описанным в документации способом или даже прямо там запрещенном (не в юридическом смысле) и никаких проблем от этого до сих пор не возникало, потому что, де-факто, оно работало нужным образом, хотя и не позволенным документацией.


M>В один прекрасный момент разработчики чего-то там у себя переписали и внезапно недокументированное поведение функции из API изменилось, что поломало совместимость и привело к ошибкам в работе и возмущениям.


M>И вот кто тут прав?

Вот, к примеру, сбивают сосульки с крыши. Оградили тротуар и написали, "не ходить".
Много раз люди ходили и ничего. Но вот как-то сосулька прилетела кому-то на голову.
И вот кто тут прав?
Re: Ломать ли совместимость в недокументированной области?
От: Anton Batenev Россия https://github.com/abbat
Дата: 11.11.10 11:45
Оценка:
Здравствуйте, Michael7, Вы писали:

M> Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.


ИМХО, разработчики glibc правы в квадрате. Во первых, они действуют в рамках документации, а во вторых, раковые опухоли нужно вырезать, тем более, что особых проблем с открытым кодом это не вызывает, а закрытый — сами себе злобные буратины.
avalon 1.0rc3 rev 365, zlib 1.2.3
Re: Ломать ли совместимость в недокументированной области?
От: mrTwister Россия  
Дата: 11.11.10 12:28
Оценка: +8 :))) :))) :))) :))) :)
Здравствуйте, Michael7, Вы писали:

M>Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков.


M>Причем некоторые из разработчиков используют это API не описанным в документации способом или даже прямо там запрещенном (не в юридическом смысле) и никаких проблем от этого до сих пор не возникало, потому что, де-факто, оно работало нужным образом, хотя и не позволенным документацией.


M>В один прекрасный момент разработчики чего-то там у себя переписали и внезапно недокументированное поведение функции из API изменилось, что поломало совместимость и привело к ошибкам в работе и возмущениям.


M>И вот кто тут прав?


Ответ известен. Если разработчики — это разработчики Linux, значит виноваты те, кто использовал недокументированные возможности, ибо ССЗБ. Если речь идет о Microsoft, то виноват Microsoft, ибо криворукие, не могут обеспечить обратную совместимость.
лэт ми спик фром май харт
Re: Ломать ли совместимость в недокументированной области?
От: IT Россия linq2db.com
Дата: 11.11.10 14:55
Оценка: +7 -14 :))) :))
Здравствуйте, Michael7, Вы писали:

Разработчики glibc не виноватые, они просто козлы. Всё что надо было сделать, чтобы избежать конфликта — это написать новую версию memcpy — memcpy2 или лучше fastmemcpy, и в своей либе перейти на неё, если им нужно.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.11.10 15:07
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Хотя, конечно, это можно решить элементарно — сделать и memcpy и memmove с проверкой на пересечение регионов, и в зависимости от этого использовать безопасный или небезопасный метод. Сомневаюсь, что несколько лишних инструкций на проверке overlap сделают погоду.


Разница в memcpy и memmove как раз в этих нескольких инструкциях. В memmove они есть, а я memcpy их нет.
Re[2]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.11.10 15:09
Оценка: 1 (1) +1
Здравствуйте, IT, Вы писали:

IT>Разработчики glibc не виноватые, они просто козлы. Всё что надо было сделать, чтобы избежать конфликта — это написать новую версию memcpy — memcpy2 или лучше fastmemcpy, и в своей либе перейти на неё, если им нужно.


Представляете, каково это программировать под систему, в которой десяток версий memcpy, и такая же ситуация с другими функциями, причем никто не может внятно объяснить, за давностью лет, чем эти функции различаются?

Если бы разработчики glibc действовали по вашему рецепту, так бы оно и было.
Re[3]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 11.11.10 15:46
Оценка: +5
Здравствуйте, Pzz, Вы писали:

Pzz>Представляете, каково это программировать под систему, в которой десяток версий memcpy, и такая же ситуация с другими функциями, причем никто не может внятно объяснить, за давностью лет, чем эти функции различаются?


Представляете сколько софта использует эту функцию, а сколько софта использует софт, который использует эту функцию? Почему-то, если что-то в совместимости отваливается у MS, то они козлы, а glibs, сцука, д'Артаньяны, борющиеся против злобных кулхацкеров.

Pzz>Если бы разработчики glibc действовали по вашему рецепту, так бы оно и было.


Только не надо демагогии. Ситуация не та. Этой функции 200 лет в обед. Софт который её использует уже давно пережил своих разработчиков. Да и нет никаких десятков версий memcpy. Есть одна, с давно известным, хотя и местами не совсем документированным поведением. Никакие оптимизации не стоят тысяч поломанных из-за них программ. К тому же это не просто поломка из серии вылет с иключением. Это порча памяти! Последствия будут аукаться ещё 200 лет в самые неожиданные моменты.

Ладно, забираю слова обратно. Разработчики glibs не козлы. Они — дебилы. Наверняка это изменение сделал какой-нибудь школяр только вчера допущенный к телу.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.11.10 16:23
Оценка: +2
Здравствуйте, IT, Вы писали:

IT>Представляете сколько софта использует эту функцию, а сколько софта использует софт, который использует эту функцию? Почему-то, если что-то в совместимости отваливается у MS, то они козлы, а glibs, сцука, д'Артаньяны, борющиеся против злобных кулхацкеров.


А представляете, сколько есть недокументированных полезных свойств у разных функций, про которые авторы glibc даже не знают, но которыми кто-нибудь пользуется? Как вы предлагаете девелопить glibc, поддерживая полную совместимость со всеми этими полезными функциями?

Микрософт давно сдался, и просто ставит кучу версий рантайма, чтобы старые программы не ломались при апгрейде рантайма. Только не очень понятно, кто в этом старом рантайме фиксит критические уязвимости. Я подозреваю, что никто.

IT>Только не надо демагогии. Ситуация не та. Этой функции 200 лет в обед. Софт который её использует уже давно пережил своих разработчиков. Да и нет никаких десятков версий memcpy. Есть одна, с давно известным, хотя и местами не совсем документированным поведением. Никакие оптимизации не стоят тысяч поломанных из-за них программ. К тому же это не просто поломка из серии вылет с иключением. Это порча памяти! Последствия будут аукаться ещё 200 лет в самые неожиданные моменты.


Я, вообще-то, еще когда зеленым сосунком писал свою первую программу на Си, знал, что memcpy можно использовать для неперекрывающихся данных, а для перекрывающихся надо использовать memmove().

Вы предлагаете сделать из Си язык для дебилов, неспособных прочитать документацию. Это чудесно, но на чём тогда программировать недебилам, которые знают разницу между этими 2-мя функциями и для которых эта небольшая экономия может быть существенна?
Re[2]: Ломать ли совместимость в недокументированной области
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 11.11.10 16:38
Оценка: 5 (2) +4
Здравствуйте, Sshur, Вы писали:

S>It depends, как говорится. Тут недавно в КУ пролетала история про Microsoft, которая при выпуске я так понимаю 95-й винды затачивала системные библиотеки под конкретные глючившие игрушки и приложения. Со стороны разработчиков, кажется неправильно в системные библиотеки вводить условия, что если пользователь запускает SimCity, то менеджер памяти работает по другому. А со стороны пользователей хорошо, что старые программы работают в новой системе.

Это описывал Джоэл Спольски в своей статье Как Microsoft проиграла битву за API.

"Взгляните с точки зрения покупателя. Вы купили программы X, Y и Z. Затем вы обновились до Windows XP. Теперь ваш компьютер внезапно зависает, и программа Z вообще не работает. Вы скажите своим друзьям: «Не обновляйтесь до Windows XP. Она внезапно зависает и не совместима с программой Z». Будете ли вы дебажить вашу систему, чтобы определить, что программа X причина зависаний, а программа Z не работает, потому что использует недокументированные сообщения Windows? Конечно нет. Вы вернете коробку с Windows XP и получите обратно деньги. (Вы купили программы X, Y и Z несколько месяцев назад. 30-дневный срок возврата уже для них не действует. Единственное, что вы можете вернуть, это Windows XP.)"

Я впервые услышал об этом от одного из разработчиков популярной игры SimCity, который поведал мне о критической ошибке в их программе: она использовала память сразу после ее освобождения. Главное табу, нарушение которого прощалось в DOS, но карается в Windows, где освобожденную память тут же стащит другое работающее приложение. Тестеры в команде разработки Windows протестировали множество популярных приложений, чтобы убедиться, что все работает без сбоев, но SymCity зависала. Они сообщили это разработчикам Windows, которые дизассемблировали SymCity, шаг за шагом в дебаггере найдя ошибку, и добавили специальный код, проверяющий наличие SymCity в памяти и запускающий распределитель памяти в специальном режиме, в котором SymCity разрешается использовать память после ее освобождения.


S>Так что вопрос скорее маркетинговый. Конкретно про линукс я думаю, что удобство для программистов, привыкших использовать memcpy недокументированным образом может быть важнее, чем выигрыш нескольких процентов в производительности. Зависит опять же от количества программистов и количества процентов

Общая мысль в том, что пользователям не нужны именно сами операционные системы, им нужны работающие программы. Отсюда следует, что ответственность разработчиков ОС совершенно иная, нежели ответственность разработчиков программ.
Re[5]: Ломать ли совместимость в недокументированной области
От: hardcase Пират http://nemerle.org
Дата: 11.11.10 16:49
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Вы предлагаете сделать из Си язык для дебилов, неспособных прочитать документацию. Это чудесно, но на чём тогда программировать недебилам, которые знают разницу между этими 2-мя функциями и для которых эта небольшая экономия может быть существенна?


Все это прекрасно и очень правильно при одном условии... Пишется новая программа.
Кто может гарантировать что каждую отдельно взятую старую программу писал не лопух?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.11.10 16:56
Оценка: +2 :))
Здравствуйте, hardcase, Вы писали:

Pzz>>Вы предлагаете сделать из Си язык для дебилов, неспособных прочитать документацию. Это чудесно, но на чём тогда программировать недебилам, которые знают разницу между этими 2-мя функциями и для которых эта небольшая экономия может быть существенна?


H>Все это прекрасно и очень правильно при одном условии... Пишется новая программа.

H>Кто может гарантировать что каждую отдельно взятую старую программу писал не лопух?

Никто. А что делать-то? Си не предназначен для лопухов. Если сделать из Си язык для лопухов, подложив всюду соломки, то нелопухам будет не на чем программировать.
Re[3]: Ломать ли совместимость в недокументированной области
От: Mr.Cat  
Дата: 11.11.10 17:22
Оценка:
Здравствуйте, rsn81, Вы писали:
R>добавили специальный код, проверяющий наличие SymCity в памяти и запускающий распределитель памяти в специальном режиме, в котором SymCity разрешается использовать память после ее освобождения.
Не зная причин, обсуждать принятое решение бессмысленно, но идеологически правильным вариантом мог быть выпуск патча для SimCity и включение его в дистрибутив ОСи.
Re[7]: Ломать ли совместимость в недокументированной области
От: Pavel Dvorkin Россия  
Дата: 11.11.10 17:42
Оценка: +1
Здравствуйте, Pzz, Вы писали:

H>>Кто может гарантировать что каждую отдельно взятую старую программу писал не лопух?


Pzz>Никто. А что делать-то? Си не предназначен для лопухов. Если сделать из Си язык для лопухов, подложив всюду соломки, то нелопухам будет не на чем программировать.


Ты неправ. Если эта старая программа работала многие годы, то можно гарантировать, что писал ее не лопух. Программы, написанные на С лопухами, помирают в младенческом возрасте
With best regards
Pavel Dvorkin
Re[4]: Ломать ли совместимость в недокументированной области
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 11.11.10 18:08
Оценка: +2 -3
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, rsn81, Вы писали:

R>>добавили специальный код, проверяющий наличие SymCity в памяти и запускающий распределитель памяти в специальном режиме, в котором SymCity разрешается использовать память после ее освобождения.
MC>Не зная причин, обсуждать принятое решение бессмысленно, но идеологически правильным вариантом мог быть выпуск патча для SimCity и включение его в дистрибутив ОСи.
Нифига не правильным. Если разработчики SimCity (или другой программы) выпустят обновление? Или свой патч, который будет несвоместим?

Как раз патч в ОС, который сделали разработчики windows — лучшее решение. Сейчас база данных совместимости программ Windows содержит тысячи, таких патчей, для того чтобы программы работали. А вот разработчики glibc положили йух на такую совместимость.
Re[4]: Ломать ли совместимость в недокументированной области
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 11.11.10 18:09
Оценка: +2
Здравствуйте, Mr.Cat, Вы писали:

MC>Не зная причин, обсуждать принятое решение бессмысленно, но идеологически правильным вариантом мог быть выпуск патча для SimCity и включение его в дистрибутив ОСи.

Идеалогически правильный вариант отсрочил бы выпуск ОС на неопределенное время, что вероятно привело бы в неопределенно громадным убыткам.
Re[5]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 11.11.10 18:15
Оценка: -1 :)
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Mr.Cat, Вы писали:


MC>>Не зная причин, обсуждать принятое решение бессмысленно, но идеологически правильным вариантом мог быть выпуск патча для SimCity и включение его в дистрибутив ОСи.

R>Идеалогически правильный вариант отсрочил бы выпуск ОС на неопределенное время, что вероятно привело бы в неопределенно громадным убыткам.
А вот тут-то и появляется самая главная фишка свободного софтам — им-то можно пожертвовать тактической целью ради стратегической.
Ведь за все эти мильоны патчей для кривых приложений все равно кто-то платит, как и за сами кривые приложения — т.е. глобально экономический эффект от таких "шагов навстречу" отрицательный.
Re[3]: Ломать ли совместимость в недокументированной области
От: мыщъх США http://nezumi-lab.org
Дата: 11.11.10 18:23
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Мишень-сан, Вы писали:


МС>>Хотя, конечно, это можно решить элементарно — сделать и memcpy и memmove с проверкой на пересечение регионов, и в зависимости от этого использовать безопасный или небезопасный метод. Сомневаюсь, что несколько лишних инструкций на проверке overlap сделают погоду.


Pzz>Разница в memcpy и memmove как раз в этих нескольких инструкциях. В memmove они есть, а я memcpy их нет.

не совмем так. в первом приближении разница в направлении копирования. во втором приближении начинаются всякие оптимизации. в третьем приближении memmove не такая часто используемая функция чтобы ее оптимизировать и по документации она как раз и используется главным образом для копирования перекрывающихся регионов. и дополнительные проверки ее только затормозят.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[5]: Ломать ли совместимость в недокументированной области
От: Mr.Cat  
Дата: 11.11.10 19:19
Оценка:
Здравствуйте, rsn81, Вы писали:
R>Идеалогически правильный вариант отсрочил бы выпуск ОС на неопределенное время
Я думаю, у тебя по этому вопросу достоверной информации нет.
Re[5]: Ломать ли совместимость в недокументированной области
От: Mr.Cat  
Дата: 11.11.10 19:26
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>Нифига не правильным. Если разработчики SimCity (или другой программы) выпустят обновление? Или свой патч, который будет несвоместим?
Это выдуманная проблема. Сперва откатить патч от MS, потом патчиться/обновляться. Игроки нынче и не такое терпят.

G>Как раз патч в ОС, который сделали разработчики windows — лучшее решение. Сейчас база данных совместимости программ Windows содержит тысячи, таких патчей, для того чтобы программы работали.

По-русски это называется "костыли". А потом пользователи срут кирпичами оттого, что них после установки программы все ломается (была тут недавно история про софт от хуявея).

G>А вот разработчики glibc положили йух на такую совместимость.

Если у них есть такая возможность — за них можно только порадоваться.
Re[6]: Ломать ли совместимость в недокументированной области
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 11.11.10 19:41
Оценка: +1 :)
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, gandjustas, Вы писали:

G>>Нифига не правильным. Если разработчики SimCity (или другой программы) выпустят обновление? Или свой патч, который будет несвоместим?
MC>Это выдуманная проблема. Сперва откатить патч от MS, потом патчиться/обновляться. Игроки нынче и не такое терпят.
Только для MS создание таких патчей непродуктивно.

G>>Как раз патч в ОС, который сделали разработчики windows — лучшее решение. Сейчас база данных совместимости программ Windows содержит тысячи, таких патчей, для того чтобы программы работали.

MC>По-русски это называется "костыли".
Поддерживать совместимость программ это всегда "костыли".

MC>А потом пользователи срут кирпичами оттого, что них после установки программы все ломается (была тут недавно история про софт от хуявея).

Не понял как это относится к разговору.

G>>А вот разработчики glibc положили йух на такую совместимость.

MC>Если у них есть такая возможность — за них можно только порадоваться.
Да в том то и дело что у них нет, а они думают что есть.
Re: Ломать ли совместимость в недокументированной области?
От: dilmah США  
Дата: 11.11.10 19:57
Оценка:
Not a bug.

Please do not reopen!
Re[7]: Ломать ли совместимость в недокументированной области
От: Mr.Cat  
Дата: 11.11.10 20:08
Оценка:
Здравствуйте, gandjustas, Вы писали:
MC>>Это выдуманная проблема. Сперва откатить патч от MS, потом патчиться/обновляться. Игроки нынче и не такое терпят.
G>Только для MS создание таких патчей непродуктивно.
Это твои домыслы.

MC>>А потом пользователи срут кирпичами оттого, что них после установки программы все ломается (была тут недавно история про софт от хуявея).

G>Не понял как это относится к разговору.
До чего доводят костыли.

G>>>А вот разработчики glibc положили йух на такую совместимость.

MC>>Если у них есть такая возможность — за них можно только порадоваться.
G>Да в том то и дело что у них нет, а они думают что есть.
Она у них есть. Из всех программ сломался только флеш плеер. Ну и хуавей с ним.
Re[8]: Ломать ли совместимость в недокументированной области
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 11.11.10 20:11
Оценка: +1
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, gandjustas, Вы писали:

MC>>>Это выдуманная проблема. Сперва откатить патч от MS, потом патчиться/обновляться. Игроки нынче и не такое терпят.
G>>Только для MS создание таких патчей непродуктивно.
MC>Это твои домыслы.
Ну как бы практика показывает что такие хаки в системе позволяют решать целый класс проблем совместимости. А писать патчи для конкретной программы — дико непродуктивно.


G>>>>А вот разработчики glibc положили йух на такую совместимость.

MC>>>Если у них есть такая возможность — за них можно только порадоваться.
G>>Да в том то и дело что у них нет, а они думают что есть.
MC>Она у них есть. Из всех программ сломался только флеш плеер. Ну и хуавей с ним.
А ниче что это почти 100% пользователей?

Если бы линукс был более массовым для конечных пользователей, то ему бы не простили такие поломки.
Re[2]: Ломать ли совместимость в недокументированной области
От: ononim  
Дата: 11.11.10 20:58
Оценка: +1
IT>Разработчики glibc не виноватые, они просто козлы. Всё что надо было сделать, чтобы избежать конфликта — это написать новую версию memcpy — memcpy2 или лучше fastmemcpy, и в своей либе перейти на неё, если им нужно.
И поломать совместимость на уровне сорсов с соответствующим стандарту софтом, который имеет свои личные memcpy2 и fastmemcpy? Нет уж, это путь микрософта, а в адекватном и здравомыслящем мире пусть страдают быдлокодеры и быдлософтоконторы. А в языке программирования С нету функций memcpy2 и fastmemcpy. Есть только memcpy, и работает она так, как написано в документации.
Как много веселых ребят, и все делают велосипед...
Re[5]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 12.11.10 00:12
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>А представляете, сколько есть недокументированных полезных свойств у разных функций, про которые авторы glibc даже не знают, но которыми кто-нибудь пользуется? Как вы предлагаете девелопить glibc, поддерживая полную совместимость со всеми этими полезными функциями?


Речь не о разных функциях, а о конкретной — memcpy.

Pzz>Микрософт давно сдался, и просто ставит кучу версий рантайма, чтобы старые программы не ломались при апгрейде рантайма. Только не очень понятно, кто в этом старом рантайме фиксит критические уязвимости. Я подозреваю, что никто.


Мысль не понял, ну да ладно.

IT>>Только не надо демагогии. Ситуация не та. Этой функции 200 лет в обед. Софт который её использует уже давно пережил своих разработчиков. Да и нет никаких десятков версий memcpy. Есть одна, с давно известным, хотя и местами не совсем документированным поведением. Никакие оптимизации не стоят тысяч поломанных из-за них программ. К тому же это не просто поломка из серии вылет с иключением. Это порча памяти! Последствия будут аукаться ещё 200 лет в самые неожиданные моменты.


Pzz>Я, вообще-то, еще когда зеленым сосунком писал свою первую программу на Си, знал, что memcpy можно использовать для неперекрывающихся данных, а для перекрывающихся надо использовать memmove().


Как это оправдывает девелоперов glibc?

Pzz>Вы предлагаете сделать из Си язык для дебилов, неспособных прочитать документацию. Это чудесно, но на чём тогда программировать недебилам, которые знают разницу между этими 2-мя функциями и для которых эта небольшая экономия может быть существенна?


Я предлагаю не ломать тонны кода, больше я ничего не предлагаю.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 12.11.10 00:25
Оценка: +1 -1
Здравствуйте, ononim, Вы писали:

IT>>Разработчики glibc не виноватые, они просто козлы. Всё что надо было сделать, чтобы избежать конфликта — это написать новую версию memcpy — memcpy2 или лучше fastmemcpy, и в своей либе перейти на неё, если им нужно.

O>И поломать совместимость на уровне сорсов с соответствующим стандарту софтом, который имеет свои личные memcpy2 и fastmemcpy? Нет уж, это путь микрософта, а в адекватном и здравомыслящем мире пусть страдают быдлокодеры и быдлософтоконторы.

Страдать будут не быдлокодеры, а быдлоюзеры.

O>А в языке программирования С нету функций memcpy2 и fastmemcpy. Есть только memcpy, и работает она так, как написано в документации.


Если бы оно работало так, как написано в документации, то не позволяло бы себя использовать не по назначению.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.11.10 00:30
Оценка:
Здравствуйте, IT, Вы писали:

O>>А в языке программирования С нету функций memcpy2 и fastmemcpy. Есть только memcpy, и работает она так, как написано в документации.


IT>Если бы оно работало так, как написано в документации, то не позволяло бы себя использовать не по назначению.


Это как?
Re[5]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 12.11.10 04:46
Оценка: :)
Здравствуйте, Pzz, Вы писали:

O>>>А в языке программирования С нету функций memcpy2 и fastmemcpy. Есть только memcpy, и работает она так, как написано в документации.


IT>>Если бы оно работало так, как написано в документации, то не позволяло бы себя использовать не по назначению.

Pzz>Это как?

Асёрты, исключения, что там у вас в языке программирования С?
Если нам не помогут, то мы тоже никого не пощадим.
Re: Ломать ли совместимость в недокументированной области?
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.11.10 06:55
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.


Если мне не изменяет память, то аналогичные ситуации возникали и с MFC — люди (и я в их числе) использовали "приватные" детали ее реализации при разработке своего софта (хотя в комментариях к этим самым деталям было четко написано про отсутствие гарантий на будущее). МС эти детали периодически меняет и люди переписывают софт. Полностью солидарен с разработчиками glibc и MFC — если уж написано "не влезай — убьет", значит либо не влезай, либо ССЗБ.

P.S.
С самых первых дней программирования на C/C++, прочитав в чем разница между memcpy() и memmove(), всегда использовал последнюю — ведь "если вы параноик, то это не значит, что ОНИ за вами не гонятся..."
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: Ломать ли совместимость в недокументированной области?
От: vdimas Россия  
Дата: 12.11.10 07:14
Оценка: +1
Здравствуйте, Michael7, Вы писали:

M>Это привело к неправильному воспроизведению звука в плагине Adobe Flash player и к сбоям в некоторых других менее известных программах.


Это лишь означает криворукость тех, кто билдят этот плагин. Ведь можно было вложить в линковку зависимость от жесткого имени файла вместе с версией.


M>Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.


Это не проблема разработчиков библиотеки однозначно.
Re[5]: Ломать ли совместимость в недокументированной области
От: vdimas Россия  
Дата: 12.11.10 07:18
Оценка: +1 :)
Здравствуйте, gandjustas, Вы писали:

G>Как раз патч в ОС, который сделали разработчики windows — лучшее решение. Сейчас база данных совместимости программ Windows содержит тысячи, таких патчей, для того чтобы программы работали.


Через десят лет их могуть быть уже миллионы, что серьезно скажется на скорости запуска приложений.
Re[2]: Ломать ли совместимость в недокументированной области
От: vdimas Россия  
Дата: 12.11.10 07:21
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Разработчики glibc не виноватые, они просто козлы. Всё что надо было сделать, чтобы избежать конфликта — это написать новую версию memcpy — memcpy2 или лучше fastmemcpy, и в своей либе перейти на неё, если им нужно.


Нет, все что им нужно — это проставить новую версию в имени файла и не трогать текущую libc.5.x.x.so. Подозреваю, что они так и сделали. И тогда уже виноваты те, кто линкуется не по жестким ссылкам.
Re[4]: Ломать ли совместимость в недокументированной области
От: vdimas Россия  
Дата: 12.11.10 07:22
Оценка:
Здравствуйте, IT, Вы писали:

IT>Это порча памяти! Последствия будут аукаться ещё 200 лет в самые неожиданные моменты.


В виндах отродясь эта ф-ия была с порчей памяти в случае перекрытия, никто не жалуется.
Re[2]: Ломать ли совместимость в недокументированной области
От: vdimas Россия  
Дата: 12.11.10 07:26
Оценка: +1 -1
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>С самых первых дней программирования на C/C++, прочитав в чем разница между memcpy() и memmove(), всегда использовал последнюю — ведь "если вы параноик, то это не значит, что ОНИ за вами не гонятся..."


Просто memcpy() современные компиляторы инлайнят в пару инструкций процессора, в отличие от memmove(). Так что первая гораздо предпочтительнее в нагрузочных сценариях.
Re[6]: Ломать ли совместимость в недокументированной области
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 12.11.10 07:43
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, gandjustas, Вы писали:


G>>Как раз патч в ОС, который сделали разработчики windows — лучшее решение. Сейчас база данных совместимости программ Windows содержит тысячи, таких патчей, для того чтобы программы работали.


V>Через десят лет их могуть быть уже миллионы, что серьезно скажется на скорости запуска приложений.


Ну скорость запуска не обязана линейно зависеть от количества условий. К тому же от проверок на запуск программ типа симсити под дос можно избавляться со временем.

Повторюсь, тут разница маркетинговая. Разработчики линукса не продают свой продукт, соответственно они могут покласть на неработающие по причине неправильного использования продукты. Microsoft себе позволить такого не может. Если бы у неё половина консамеров былы бы идиотами, которые не знали о различии memmove и memcpy — они были бы вынуждены написать устойчивую к неправильному использованию memcpy.

Причем для этого было бы как минимум 2 причины. Во-первых, если масса пользователей не может нормально (по их мнению) использовать продукт — они не будут покупать его. Это убытки. Во-вторых, саппорт завалили бы бы запросами "почему memcpy глючит при попытке копирования пересекающихся областей". Что тоже убытки, так как тогда потребовалось бы больше ресурсов, либо саппорт был бы перегружен и пострадало качество. Поэтому пропатчить memcpy в таком случае самый экономически эффективный вариант.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[3]: Ломать ли совместимость в недокументированной области
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.11.10 07:44
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Просто memcpy() современные компиляторы инлайнят в пару инструкций процессора, в отличие от memmove(). Так что первая гораздо предпочтительнее в нагрузочных сценариях.


В теории это, безусловно, так, но на практике я проблем с производительностью memmove() не наблюдал даже на девайсах под управлением Windows Mobile 2002. Хотя, безусловно, в каждом конкретном случае нужно делать соответствующие "замеры".
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: Ломать ли совместимость в недокументированной области
От: Jack128  
Дата: 12.11.10 07:45
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>С самых первых дней программирования на C/C++, прочитав в чем разница между memcpy() и memmove(), всегда использовал последнюю — ведь "если вы параноик, то это не значит, что ОНИ за вами не гонятся..."


V>Просто memcpy() современные компиляторы инлайнят в пару инструкций процессора, в отличие от memmove(). Так что первая гораздо предпочтительнее в нагрузочных сценариях.


а что мешает memmove инлайнить?
Re[4]: Ломать ли совместимость в недокументированной области
От: mrTwister Россия  
Дата: 12.11.10 09:50
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Не зная причин, обсуждать принятое решение бессмысленно, но идеологически правильным вариантом мог быть выпуск патча для SimCity и включение его в дистрибутив ОСи.


Создание такого патча как минимум противоречит (99%) лицензионному соглашению SimCity, в котором скорее всего оговорен запрет модификации кода.
лэт ми спик фром май харт
Re[5]: Ломать ли совместимость в недокументированной области
От: _ABC_  
Дата: 12.11.10 10:48
Оценка: +3
Здравствуйте, mrTwister, Вы писали:

T>Создание такого патча как минимум противоречит (99%) лицензионному соглашению SimCity, в котором скорее всего оговорен запрет модификации кода.


Не грузи их мелочами, они стратегию продумывают. (с)
Re: Ломать ли совместимость в недокументированной области?
От: vsb Казахстан  
Дата: 12.11.10 11:02
Оценка:
Правильным было бы по умолчанию использовать быструю версию, но так же включить возможность задания, например, переменной окружения GLIBC_USE_SLOW_MEMCPY, который включает поведение предыдущей версии. Пока есть популярный непропатченный софт, запускать его через врапперы. Через пару лет, когда все пофиксят баги, выбросить эту возможность.

Ну и каким-то образом при компиляции программы без NDEBUG ставить в каждом вызове memcpy assert-ы на проверку перекрытия областей памяти, чтобы помочь новичкам.
Re[5]: Ломать ли совместимость в недокументированной области
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.11.10 11:17
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>А представляете, сколько есть недокументированных полезных свойств у разных функций, про которые авторы glibc даже не знают, но которыми кто-нибудь пользуется? Как вы предлагаете девелопить glibc, поддерживая полную совместимость со всеми этими полезными функциями?


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

Pzz>Микрософт давно сдался, и просто ставит кучу версий рантайма, чтобы старые программы не ломались при апгрейде рантайма.


Такая ситуация как с memcpy приведет к отказу чуть не всех приложений на Виндовсе.

Pzz>Только не очень понятно, кто в этом старом рантайме фиксит критические уязвимости. Я подозреваю, что никто.


Не правильно понимаешь.

Pzz>Вы предлагаете сделать из Си язык для дебилов, неспособных прочитать документацию. Это чудесно, но на чём тогда программировать недебилам, которые знают разницу между этими 2-мя функциями и для которых эта небольшая экономия может быть существенна?


На C#. На крайняк — на Java.
Re[6]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.11.10 12:37
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Pzz>>А представляете, сколько есть недокументированных полезных свойств у разных функций, про которые авторы glibc даже не знают, но которыми кто-нибудь пользуется? Как вы предлагаете девелопить glibc, поддерживая полную совместимость со всеми этими полезными функциями?


I>А не надоо ничего представлять. Девелопить, как девелопили, только проверять свой девелопмент в реальном окружении, как это принято в бизнесе.


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

Pzz>>Микрософт давно сдался, и просто ставит кучу версий рантайма, чтобы старые программы не ломались при апгрейде рантайма.


I>Такая ситуация как с memcpy приведет к отказу чуть не всех приложений на Виндовсе.


Что, виндовсные программисты поголовно не слышали о memmove?

Pzz>>Вы предлагаете сделать из Си язык для дебилов, неспособных прочитать документацию. Это чудесно, но на чём тогда программировать недебилам, которые знают разницу между этими 2-мя функциями и для которых эта небольшая экономия может быть существенна?


I>На C#. На крайняк — на Java.


Дык C# вот и создали для дебилов. Непонятно, что им по прежнему надо от Си
Re[7]: Ломать ли совместимость в недокументированной области
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.11.10 13:16
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Я думаю, что проверяют. Но ошибки случаются. В "реальном окружении" слишком много программ, да и ошибки такие вылазят при достаточно редких обстоятельствах.


Ошибки вроде этой — вылазят всегда при любых обстоятельствах.

I>>Такая ситуация как с memcpy приведет к отказу чуть не всех приложений на Виндовсе.


Pzz>Что, виндовсные программисты поголовно не слышали о memmove?


Микрософт поддерживает совместимость вплоть до багов если либа общего назначения.
Re[8]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.11.10 13:28
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Pzz>>Я думаю, что проверяют. Но ошибки случаются. В "реальном окружении" слишком много программ, да и ошибки такие вылазят при достаточно редких обстоятельствах.


I>Ошибки вроде этой — вылазят всегда при любых обстоятельствах.


Почитайте ветку в багрепорте — она (эта ошибка) отнюдь не всегда вылазит.

I>>>Такая ситуация как с memcpy приведет к отказу чуть не всех приложений на Виндовсе.


Pzz>>Что, виндовсные программисты поголовно не слышали о memmove?


I>Микрософт поддерживает совместимость вплоть до багов если либа общего назначения.


Блажен кто верует
Re[9]: Ломать ли совместимость в недокументированной области
От: Aen Sidhe Россия Просто блог
Дата: 12.11.10 13:29
Оценка: +2
Здравствуйте, Pzz, Вы писали:

I>>Микрософт поддерживает совместимость вплоть до багов если либа общего назначения.


Pzz>Блажен кто верует


Вы не правы.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[4]: Ломать ли совместимость в недокументированной области
От: vdimas Россия  
Дата: 12.11.10 13:32
Оценка:
Здравствуйте, Jack128, Вы писали:

J>а что мешает memmove инлайнить?


Ничего, но там уже не пара инструкций.
Re[9]: Ломать ли совместимость в недокументированной области
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.11.10 14:02
Оценка:
Здравствуйте, Pzz, Вы писали:

I>>Ошибки вроде этой — вылазят всегда при любых обстоятельствах.


Pzz>Почитайте ветку в багрепорте — она (эта ошибка) отнюдь не всегда вылазит.


Ты сам её прочти.

I>>Микрософт поддерживает совместимость вплоть до багов если либа общего назначения.


Pzz>Блажен кто верует


Тут не надо верить, заглядывай иногда в KB.
Re[2]: Ломать ли совместимость в недокументированной области
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.11.10 14:04
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Правильным было бы по умолчанию использовать быструю версию, но так же включить возможность задания, например, переменной окружения GLIBC_USE_SLOW_MEMCPY, который включает поведение предыдущей версии. Пока есть популярный непропатченный софт, запускать его через врапперы. Через пару лет, когда все пофиксят баги, выбросить эту возможность.


vsb>Ну и каким-то образом при компиляции программы без NDEBUG ставить в каждом вызове memcpy assert-ы на проверку перекрытия областей памяти, чтобы помочь новичкам.


Это ж головой надо думать. Куда проще забить на реальное окружение под различными предлогами и пофиксить как взбрело в голову.
Re[5]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 12.11.10 14:04
Оценка:
Здравствуйте, vdimas, Вы писали:

IT>>Это порча памяти! Последствия будут аукаться ещё 200 лет в самые неожиданные моменты.

V>В виндах отродясь эта ф-ия была с порчей памяти в случае перекрытия, никто не жалуется.

Потому её никто и не использует для перекрывающихся областей.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Ломать ли совместимость в недокументированной области?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.11.10 14:06
Оценка:
Здравствуйте, Michael7, Вы писали:

M>В принципе, ошибка не в glibc, а в прикладных программах и для исправления достаточно банально заменить memcpy(...) на memmove(...) и заново откомпилировать программу.


Это вобщем то классический расклад по линуксу и опенсорсу — один д'Артаньян и все канальи вокруг.

Эдак и про Виндовс можно сказать — ошибки не в Виндовсе а в прикладных программах. Каково ?
Re[5]: Ломать ли совместимость в недокументированной области
От: Jack128  
Дата: 12.11.10 14:10
Оценка: -1
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Jack128, Вы писали:


J>>а что мешает memmove инлайнить?


V>Ничего, но там уже не пара инструкций.


а почему не пара то?? если раньше memcpy и memmove делали одно и тоже, то и по идее и инлайнинг работать должен был для них одинаковый результат давать?
Re[2]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 12.11.10 14:42
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Если мне не изменяет память, то аналогичные ситуации возникали и с MFC


Изменяет. Код, использующий недокументированные возможности MFC просто не компилировался.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Ломать ли совместимость в недокументированной области
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.11.10 14:45
Оценка:
Здравствуйте, IT, Вы писали:

IT>Изменяет. Код, использующий недокументированные возможности MFC просто не компилировался.


А, ну да, верно.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[10]: Ломать ли совместимость в недокументированной област
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.11.10 15:57
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Pzz>>Почитайте ветку в багрепорте — она (эта ошибка) отнюдь не всегда вылазит.


I>Ты сам её прочти.


Я прочёл и получил массу удовольствия
Re[9]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 12.11.10 16:14
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>>>А вот разработчики glibc положили йух на такую совместимость.

MC>>>>Если у них есть такая возможность — за них можно только порадоваться.
G>>>Да в том то и дело что у них нет, а они думают что есть.
MC>>Она у них есть. Из всех программ сломался только флеш плеер. Ну и хуавей с ним.
G>А ниче что это почти 100% пользователей?
гм. а вот почему авторов самого говноплаера это не чешет? типа выложили свой говнокод и все, отстрелялись?

G>Если бы линукс был более массовым для конечных пользователей, то ему бы не простили такие поломки.

не в этом тут дело.

В данном вопросе я всеми руками за разработчиков либы.
Re[8]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 12.11.10 16:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Pzz, Вы писали:


H>>>Кто может гарантировать что каждую отдельно взятую старую программу писал не лопух?


Pzz>>Никто. А что делать-то? Си не предназначен для лопухов. Если сделать из Си язык для лопухов, подложив всюду соломки, то нелопухам будет не на чем программировать.


PD>Ты неправ. Если эта старая программа работала многие годы, то можно гарантировать, что писал ее не лопух. Программы, написанные на С лопухами, помирают в младенческом возрасте

то есть, допустим, если изначально при написании программы UB был равен "ничего не случилось", а через 10 лет он вдруг превратился в "process terminated" то виноваты, естественно, разработчики компилятора?
Re[9]: Ломать ли совместимость в недокументированной области
От: Pavel Dvorkin Россия  
Дата: 12.11.10 16:26
Оценка:
Здравствуйте, March_rabbit, Вы писали:

PD>>Ты неправ. Если эта старая программа работала многие годы, то можно гарантировать, что писал ее не лопух. Программы, написанные на С лопухами, помирают в младенческом возрасте

M_>то есть, допустим, если изначально при написании программы UB был равен "ничего не случилось", а через 10 лет он вдруг превратился в "process terminated" то виноваты, естественно, разработчики компилятора?

В огороде бузина, а в Киеве дядька. Я совсем о другом — о том, что, как правило, лопухи не в состоянии написать программу на С++, которая бы то и дело не падала, а посему ей 10 лет не прожить.
With best regards
Pavel Dvorkin
Re[6]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 12.11.10 16:31
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, vdimas, Вы писали:


IT>>>Это порча памяти! Последствия будут аукаться ещё 200 лет в самые неожиданные моменты.

V>>В виндах отродясь эта ф-ия была с порчей памяти в случае перекрытия, никто не жалуется.

IT>Потому её никто и не использует для перекрывающихся областей.

то есть, чтобы научить людей правильно использовать либы и читать документацию надо выкинуть все проверки из системных функций или натыкать ассертов? Чтобы любой неправильный параметр приводил к смерти? Только так? Ведь, выходит, что если сделали обход потенциальной ошибки, то сами и виноваты, что народ плевал на документацию "не падает, значит, крутой код".
Re[6]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 12.11.10 16:32
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Pzz, Вы писали:


O>>>>А в языке программирования С нету функций memcpy2 и fastmemcpy. Есть только memcpy, и работает она так, как написано в документации.


IT>>>Если бы оно работало так, как написано в документации, то не позволяло бы себя использовать не по назначению.

Pzz>>Это как?

IT>Асёрты, исключения, что там у вас в языке программирования С?

согласно доке, она должна портить память. представляю себе такой ассерт
Re[7]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 12.11.10 16:37
Оценка:
Здравствуйте, March_rabbit, Вы писали:

IT>>Асёрты, исключения, что там у вас в языке программирования С?

M_>согласно доке, она должна портить память. представляю себе такой ассерт

А с чем проблемы? С адресной арифметикой?
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Ломать ли совместимость в недокументированной области
От: alexeiz  
Дата: 12.11.10 16:37
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ты неправ. Если эта старая программа работала многие годы, то можно гарантировать, что писал ее не лопух. Программы, написанные на С лопухами, помирают в младенческом возрасте


На моем опыте (большие компании, много закрытого от чужих глаз кода), программы, написанные лопухами на C и других языках, не только не помирают, а живут долго и даже размножаются посредством copy-paste'а. Самому приходилось искоренять такие программы не раз. И хорошо если они еще в младенческом возрасте, таких прибивать легче. Но гораздо чаще это монстры, глубоко пустившие свои корни.
Re[6]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 12.11.10 16:38
Оценка:
Здравствуйте, Jack128, Вы писали:

J>>>а что мешает memmove инлайнить?


V>>Ничего, но там уже не пара инструкций.


J>а почему не пара то?? если раньше memcpy и memmove делали одно и тоже, то и по идее и инлайнинг работать должен был для них одинаковый результат давать?

да ни разу они одно и то же не делали.
например: простое копирование (memcpy) — это *to == *from; ++to; ++from;
Оно и в ассемблере выглядит почти так же (там будет что-то типа to[i] = from[i]; ++i ).
в то же время если это копирование с пересечением (memmove), то по-хорошему, надо еще и направление копирования выбирать, так, чтобы не затереть кусок источника перед тем, как до него дойдет очеред быть скопированным.

Совсем разные алгоритмы. И, если раньше (допустим) memcpy была реализована как косвенный вызов memmove и прощала пересечения, то если сделать все честно — то ошибки будут стрелять.
Re[2]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 12.11.10 16:43
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Michael7, Вы писали:


M>>В принципе, ошибка не в glibc, а в прикладных программах и для исправления достаточно банально заменить memcpy(...) на memmove(...) и заново откомпилировать программу.


I>Это вобщем то классический расклад по линуксу и опенсорсу — один д'Артаньян и все канальи вокруг.

вообще, в данном случае так оно и есть.

I>Эдак и про Виндовс можно сказать — ошибки не в Виндовсе а в прикладных программах. Каково ?

не знаю, кто как, а я года с 2002 так считаю: если после какого-то софта система начинает вести себя неправильно, то винда ни при чем. Ибо практический опыт показывает, что качество кода самой винды будет повыше качества окружающего софта.
Re[7]: Ломать ли совместимость в недокументированной области
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.11.10 19:57
Оценка: -1
Здравствуйте, March_rabbit, Вы писали:

M_>то есть, чтобы научить людей правильно использовать либы и читать документацию надо выкинуть все проверки из системных функций или натыкать ассертов? Чтобы любой неправильный параметр приводил к смерти? Только так? Ведь, выходит, что если сделали обход потенциальной ошибки, то сами и виноваты, что народ плевал на документацию "не падает, значит, крутой код".


Эта функция в libc не выдерживает свои инварианты и сломалась бы на первом юнит-тесте после изменения. Значит, разработчики libc поставляют её "как получилось" или не используют тестирование в своих поделках. Дело тут ведь не в нарушении пользователями документации (это само собой плохо), а в нарушении инвариантов опубликованных функций.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Ломать ли совместимость в недокументированной области?
От: Шахтер Интернет  
Дата: 12.11.10 20:10
Оценка:
Здравствуйте, Michael7, Вы писали:

Смеялся.
Наглядное свидетельство, что Linux пишут малограмотные обормоты.
Разработчик библиотек не должен поощрять чужое ламерство.
Наоборот, дураков надо учить.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[8]: Ломать ли совместимость в недокументированной области
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.11.10 20:10
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Эта функция в libc не выдерживает свои инварианты и сломалась бы на первом юнит-тесте после изменения. Значит, разработчики libc поставляют её "как получилось" или не используют тестирование в своих поделках. Дело тут ведь не в нарушении пользователями документации (это само собой плохо), а в нарушении инвариантов опубликованных функций.


Проверки в рантайме чего-то стоят. Не все пользователи системной библиотеки готовы платить эту цену
Re[9]: Ломать ли совместимость в недокументированной области
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.11.10 20:52
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Проверки в рантайме чего-то стоят. Не все пользователи системной библиотеки готовы платить эту цену


А причем тут пользователи?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[10]: Ломать ли совместимость в недокументированной област
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.11.10 21:20
Оценка:
Здравствуйте, Vi2, Вы писали:

Pzz>>Проверки в рантайме чего-то стоят. Не все пользователи системной библиотеки готовы платить эту цену


Vi2>А причем тут пользователи?


При том, что люди, которые пользуются библиотекой, называются ее пользователями.
Re[8]: Ломать ли совместимость в недокументированной области
От: ononim  
Дата: 12.11.10 21:30
Оценка:
IT>>>Асёрты, исключения, что там у вас в языке программирования С?
M_>>согласно доке, она должна портить память. представляю себе такой ассерт
IT>А с чем проблемы? С адресной арифметикой?
Рантайм проверка — накладные расходы, оставим на скобками их величину, фишка в том что в коде написанном согласно документации а не "как работает" эта проверка не нужна.
А в дебажном рантайме не помешала бы, да.
Как много веселых ребят, и все делают велосипед...
Re[11]: Ломать ли совместимость в недокументированной област
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.11.10 21:31
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>При том, что люди, которые пользуются библиотекой, называются ее пользователями.


Вопрос в том, можно ли было отдавать ту библиотеку пользователям. Это решается без пользователей. Тестерами. А тут получилось, что всё сообщество стало тестерами.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Ломать ли совместимость в недокументированной области
От: ononim  
Дата: 12.11.10 21:34
Оценка:
M>>В принципе, ошибка не в glibc, а в прикладных программах и для исправления достаточно банально заменить memcpy(...) на memmove(...) и заново откомпилировать программу.
I>Это вобщем то классический расклад по линуксу и опенсорсу — один д'Артаньян и все канальи вокруг.
Подход вполне корректный, в том случае если вы и правда д'Артаньян

I>Эдак и про Виндовс можно сказать — ошибки не в Виндовсе а в прикладных программах. Каково ?

разработчики винда могут себе позволить Application Compatilibity Database с многими тысячами хаков для таких случаев.
Как много веселых ребят, и все делают велосипед...
Re[2]: Ломать ли совместимость в недокументированной области
От: ononim  
Дата: 12.11.10 21:35
Оценка:
Ш>Смеялся.
Ш>Наглядное свидетельство, что Linux пишут малограмотные обормоты.
Ш>Разработчик библиотек не должен поощрять чужое ламерство.
Ш>Наоборот, дураков надо учить.
Перечитайте исходный пост еще раз тк вы сами себе противоречите.
Как много веселых ребят, и все делают велосипед...
Re: Ломать ли совместимость в недокументированной области?
От: Шахтер Интернет  
Дата: 12.11.10 21:38
Оценка:
Здравствуйте, Michael7, Вы писали:

Здесь надо добавить ещё вот что. Функция memcpy -- это не просто ещё одна функция. Это функция, семантика которой известна компилятору.
Т.е. компилятор вместо вызова этой функции вправе сгенерировать эквивалентный код по местоу вызова. Что современные компиляторы так и делают, генерируя более эффективный код.
Т.е. замена реализации в библиотеке может и не исправить ситуцию.
Я не думаю, что для того чтобы удовлетворить малограмотного идиота, нужно жертвовать для всех оптимизирующими способностями компилятора.
Пусть ка этот идиот уберет своё дерьмо сам.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Ломать ли совместимость в недокументированной области?
От: Игoрь Украина  
Дата: 12.11.10 22:06
Оценка:
Здравствуйте, Michael7, Вы писали:

Ну здесь проблема скорее из серии маркетинг vs программинг. Без веских причин я бы ничего не менял. Какие были веские причины у разработчиков — хз. Не вижу проблем, почему нельзя было добавить новую функцию.
Re[9]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 13.11.10 04:39
Оценка:
Здравствуйте, ononim, Вы писали:

IT>>А с чем проблемы? С адресной арифметикой?

O>Рантайм проверка — накладные расходы, оставим на скобками их величину, фишка в том что в коде написанном согласно документации а не "как работает" эта проверка не нужна.
Я замечу, что memcpy на ассемблере — это (без учета инициализации регистров) одна инструкция.
Так что накладные расходы на рантайм проверку совершенно неприемлемы.

O>А в дебажном рантайме не помешала бы, да.

Для дебажного рантайма есть более суровые инструменты типа всяких electric fence или Valgrind — так что тут все нормально.
Re[2]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 13.11.10 04:42
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Эдак и про Виндовс можно сказать — ошибки не в Виндовсе а в прикладных программах. Каково ?

Ну ты обычно так и говоришь
Re[2]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 13.11.10 04:44
Оценка:
Здравствуйте, Игoрь, Вы писали:

И>Здравствуйте, Michael7, Вы писали:


И>Ну здесь проблема скорее из серии маркетинг vs программинг. Без веских причин я бы ничего не менял. Какие были веские причины у разработчиков — хз. Не вижу проблем, почему нельзя было добавить новую функцию.

Здесь хорошо сказано почему: http://www.rsdn.ru/forum/philosophy/4036422.aspx
Автор: Шахтер
Дата: 13.11.10
Re[3]: Ломать ли совместимость в недокументированной области
От: Игoрь Украина  
Дата: 13.11.10 08:21
Оценка: +3
Здравствуйте, DOOM, Вы писали:

DOO>Здравствуйте, Игoрь, Вы писали:


И>>Здравствуйте, Michael7, Вы писали:


И>>Ну здесь проблема скорее из серии маркетинг vs программинг. Без веских причин я бы ничего не менял. Какие были веские причины у разработчиков — хз. Не вижу проблем, почему нельзя было добавить новую функцию.

DOO>Здесь хорошо сказано почему: http://www.rsdn.ru/forum/philosophy/4036422.aspx
Автор: Шахтер
Дата: 13.11.10

И что? У людей то проблемы появились только после явного изменения кода. Даже могу развернуть аргумент в обратную сторону: если многие компиляторы так оптимизируют эту функцию, то зачем вообще было менять? Я все же думаю, что компиляторы осторожнее оптимизируют даже стандартную библиотеку и работают с реализацией, а не с названием, какие-то реализации инлайнятся в пару инструкций, какие-то — нет. Вообще, не хочу переходить в сугубо техническую часть, потому что проблема здесь в другом: серьезные изменения были внесены через попу. Нужно было: а) провести анализ и понять как много продуктов валятся, принять взвешенное решение; б) объяснить свою мотивацию пользователям; в) о breaking changes следовало бы информировать заранее.
Re[10]: Ломать ли совместимость в недокументированной област
От: March_rabbit  
Дата: 13.11.10 10:08
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, March_rabbit, Вы писали:


PD>>>Ты неправ. Если эта старая программа работала многие годы, то можно гарантировать, что писал ее не лопух. Программы, написанные на С лопухами, помирают в младенческом возрасте

M_>>то есть, допустим, если изначально при написании программы UB был равен "ничего не случилось", а через 10 лет он вдруг превратился в "process terminated" то виноваты, естественно, разработчики компилятора?

PD>В огороде бузина, а в Киеве дядька. Я совсем о другом — о том, что, как правило, лопухи не в состоянии написать программу на С++, которая бы то и дело не падала, а посему ей 10 лет не прожить.
Re[8]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 13.11.10 10:14
Оценка: +1
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, March_rabbit, Вы писали:


M_>>то есть, чтобы научить людей правильно использовать либы и читать документацию надо выкинуть все проверки из системных функций или натыкать ассертов? Чтобы любой неправильный параметр приводил к смерти? Только так? Ведь, выходит, что если сделали обход потенциальной ошибки, то сами и виноваты, что народ плевал на документацию "не падает, значит, крутой код".


Vi2>Эта функция в libc не выдерживает свои инварианты и сломалась бы на первом юнит-тесте после изменения. Значит, разработчики libc поставляют её "как получилось" или не используют тестирование в своих поделках. Дело тут ведь не в нарушении пользователями документации (это само собой плохо), а в нарушении инвариантов опубликованных функций.

Думаю, скорее всего у них юнит-тесты проверяют документированный интерфейс. Не должна функция memcpy сохранять живым кусок памяти при копировании пересекающихся блоков — не будет на это юнит-теста. Такой юнит-тест будет у функции memmove. И нельзя оправдываться инвариантами, когда речь идет о наружении контракта фукнции (в котором сказано: работаю только с непересекаюшимися блоками памяти).
Re[10]: Ломать ли совместимость в недокументированной област
От: FR  
Дата: 13.11.10 10:38
Оценка:
Здравствуйте, DOOM, Вы писали:


DOO>Я замечу, что memcpy на ассемблере — это (без учета инициализации регистров) одна инструкция.

DOO>Так что накладные расходы на рантайм проверку совершенно неприемлемы.

Современные компиляторы одну не используют, и не всегда инлайнят. Там довольно сложная функция учитывающая кеш, упреждающую выборку и т. п.
Когда длина известна и небольшая обычно несколькими mov обходятся.
Даже эта "одна" инструкция с REP префиксом по сути цикл.
Re[4]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 13.11.10 11:29
Оценка: +1
Здравствуйте, Игoрь, Вы писали:

И>И что? У людей то проблемы появились только после явного изменения кода. Даже могу развернуть аргумент в обратную сторону: если многие компиляторы так оптимизируют эту функцию, то зачем вообще было менять?

Это самый интересный вопрос. Потому что во многих языках подобные функции вообще не являются частью библиотек, а относятся к выражениям самого языка. Здесь сработала низкоуровневость C.

И>проблема здесь в другом: серьезные изменения были внесены через попу. Нужно было: а) провести анализ и понять как много продуктов валятся, принять взвешенное решение;

Я приводил сравнение с протоколами. Сколько сегодня существует реализаций того же TCP — никто никогда не скажет. Если завтра потребуется наконец-то использовать какое-то зарезервированное поле TCP заголовка, то что делать? Никакой хоть сколько-то адекватный анализ провести невозможно. Для glibc это корректное сравнение — она ведь черт знает где используется, никто даже всех дистрибутивов линукса перечислить не сможет.

И>б) объяснить свою мотивацию пользователям; в) о breaking changes следовало бы информировать заранее.

А может это и было сделано?
Вообще, конечно, стоило бы.
Re: Ломать ли совместимость в недокументированной области?
От: GarryIV  
Дата: 13.11.10 15:01
Оценка: +1 -1
Здравствуйте, Michael7, Вы писали:

M>Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков.


M>Причем некоторые из разработчиков используют это API не описанным в документации способом или даже прямо там запрещенном (не в юридическом смысле) и никаких проблем от этого до сих пор не возникало, потому что, де-факто, оно работало нужным образом, хотя и не позволенным документацией.


M>В один прекрасный момент разработчики чего-то там у себя переписали и внезапно недокументированное поведение функции из API изменилось, что поломало совместимость и привело к ошибкам в работе и возмущениям.


M>И вот кто тут прав?


Для программистов лучше забить на совместимость, для менеджеров важнее customer satisfaction.
Собственно никто не прав или все правы.

Больше влияние менеджеров — больше внимания на такие штуки. Собственно ситуация MS vs Linux.
WBR, Igor Evgrafov
Re[7]: Ломать ли совместимость в недокументированной области
От: vdimas Россия  
Дата: 13.11.10 15:04
Оценка:
Здравствуйте, March_rabbit, Вы писали:

M_>Оно и в ассемблере выглядит почти так же (там будет что-то типа to[i] = from[i]; ++i ).


Нет, там будет одна инструкция ассемблера по копированию блока памяти.


M_>в то же время если это копирование с пересечением (memmove), то по-хорошему, надо еще и направление копирования выбирать, так, чтобы не затереть кусок источника перед тем, как до него дойдет очеред быть скопированным.


Да, а тут разветвление.
Re[2]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 13.11.10 18:46
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Пусть ка этот идиот уберет своё дерьмо сам.


Абсолютно согласен. Только в случае с идиотами, разрабатывающими glibc 17 лет назад, во-первых, этих идиотов уже может и не быть, во-вторых, от их дерьма появилось уже много производного дерьма, которое они если и начнут убирать, то очень быстро в нём захлебнутся.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Ломать ли совместимость в недокументированной области
От: Vi2 Удмуртия http://www.adem.ru
Дата: 13.11.10 19:20
Оценка: -1
Здравствуйте, March_rabbit, Вы писали:

M_>Думаю, скорее всего у них юнит-тесты проверяют документированный интерфейс. Не должна функция memcpy сохранять живым кусок памяти при копировании пересекающихся блоков — не будет на это юнит-теста. Такой юнит-тест будет у функции memmove. И нельзя оправдываться инвариантами, когда речь идет о наружении контракта фукнции (в котором сказано: работаю только с непересекаюшимися блоками памяти).


После отработки тестов на правильных и неправильных данных они просигнализируют, что изменения сделаны критические. К тому же, и у memcpy, и у memmove будут одинаковые тесты.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Ломать ли совместимость в недокументированной области
От: Шахтер Интернет  
Дата: 13.11.10 20:39
Оценка: :)
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Шахтер, Вы писали:


Ш>>Пусть ка этот идиот уберет своё дерьмо сам.


IT>Абсолютно согласен. Только в случае с идиотами, разрабатывающими glibc 17 лет назад, во-первых, этих идиотов уже может и не быть, во-вторых, от их дерьма появилось уже много производного дерьма, которое они если и начнут убирать, то очень быстро в нём захлебнутся.


Ты не понял смысла написанного.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 13.11.10 21:50
Оценка: +2
Здравствуйте, Шахтер, Вы писали:

IT>>Абсолютно согласен. Только в случае с идиотами, разрабатывающими glibc 17 лет назад, во-первых, этих идиотов уже может и не быть, во-вторых, от их дерьма появилось уже много производного дерьма, которое они если и начнут убирать, то очень быстро в нём захлебнутся.


Ш>Ты не понял смысла написанного.


Я то как раз понял. А ты видимо не совсем. Могу разжевать. Первое дерьмо появилось в 1993 году в функции, которая позволяла себя использовать не по назначению. Дальше это дерьмо всего лишь расползлось по другим приложениям. Я с тобой абсолютно согласен — каждый должен убирать за собой сам. Вот только боюсь, что с тем количеством кала, которое породило решение 1993-го года разработчикам glibc уже не справиться.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 14.11.10 03:00
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я то как раз понял. А ты видимо не совсем. Могу разжевать. Первое дерьмо появилось в 1993 году в функции, которая позволяла себя использовать не по назначению.

Тут уж мильон раз говорили, что нельзя добавлять такую проверку в функцию, которая реализуется одной инструкцией процессора.
Re[5]: Ломать ли совместимость в недокументированной области
От: Шахтер Интернет  
Дата: 14.11.10 03:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Шахтер, Вы писали:


IT>>>Абсолютно согласен. Только в случае с идиотами, разрабатывающими glibc 17 лет назад, во-первых, этих идиотов уже может и не быть, во-вторых, от их дерьма появилось уже много производного дерьма, которое они если и начнут убирать, то очень быстро в нём захлебнутся.


Ш>>Ты не понял смысла написанного.


IT>Я то как раз понял. А ты видимо не совсем. Могу разжевать.


IT>Первое дерьмо появилось в 1993 году в функции, которая позволяла себя использовать не по назначению.


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

IT>Дальше это дерьмо всего лишь расползлось по другим приложениям.


Разработчики библиотеки не несут ответственности за то, что программисты пишут код, нарушая правила языка.
Это первое. Второе, изменение библиотеки под нужды говнокодеров в данном случае, как я объяснил выше, не исправит ситуацию.

Что-то последнее время на RSDN е день тупка какой-то.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[6]: Ломать ли совместимость в недокументированной области
От: Шахтер Интернет  
Дата: 14.11.10 03:45
Оценка: +1
Здравствуйте, DOOM, Вы писали:

DOO>Здравствуйте, IT, Вы писали:


IT>>Я то как раз понял. А ты видимо не совсем. Могу разжевать. Первое дерьмо появилось в 1993 году в функции, которая позволяла себя использовать не по назначению.

DOO>Тут уж мильон раз говорили, что нельзя добавлять такую проверку в функцию, которая реализуется одной инструкцией процессора.

Тут дело даже не в этом. Человек пишет код. У него есть требования на реализацию, кроме того, он должен написать данную функцию максимально эффективно.
Как при этом будет работать данная функция, если её неправильно используют, его волновать не должно совершенно. Как получится, поведение не определено в этом случае.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[6]: Ломать ли совместимость в недокументированной области
От: IT Россия linq2db.com
Дата: 14.11.10 04:25
Оценка: :)
Здравствуйте, Шахтер, Вы писали:

IT>>Первое дерьмо появилось в 1993 году в функции, которая позволяла себя использовать не по назначению.

Ш>Нет здесь дерьма. Есть функция, поведение которой удовлетворяет требованиям стандарта. Как она работает за пределами своей области определения -- не важно.

Очень даже важно. По исходным кодам библиотке C/C++ компиляторов лично я учился программировать.

Ш>Разработчик не обязан за этимм следить. Нечего по этому поводу разводить дискуссию.


Согласен. Ты, как разработчик не должен. Разработчики glibc обязаны.

IT>>Дальше это дерьмо всего лишь расползлось по другим приложениям.

Ш>Разработчики библиотеки не несут ответственности за то, что программисты пишут код, нарушая правила языка.

Плох тот язык правила которого так легко нарушить.

Ш>Это первое. Второе, изменение библиотеки под нужды говнокодеров в данном случае, как я объяснил выше, не исправит ситуацию.


Говнокодеры в 1993 году написали код, который породил других говнокодеров. Говнокодеры в 2010-ом пытаются из овна слепить другое овно. Лепили бы пулю, было бы понятно. А так...

Ш>Что-то последнее время на RSDN е день тупка какой-то.


Смени сайт, может тупка пройдёт.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Ломать ли совместимость в недокументированной области
От: DOOM Россия  
Дата: 14.11.10 04:58
Оценка:
Здравствуйте, IT, Вы писали:

IT>Плох тот язык правила которого так легко нарушить.

Ну не надо ставить в один ряд управляемые языки и C — его какбы и делали для того, чтобы сохранить свободу на уровне ассемблера, но упростить рутинные операции.
Если ты помнишь времена Borland C 3.1, то там, например, можно было фактически все — управляемость линкера и компилятора была просто поразительной.
А кому надо жесткие ограничения — добро пожаловать в мир управляемых языков со всеми вытекающими ограничениями.
Re[6]: Ломать ли совместимость в недокументированной области
От: FR  
Дата: 14.11.10 07:41
Оценка:
Здравствуйте, DOOM, Вы писали:

IT>>Я то как раз понял. А ты видимо не совсем. Могу разжевать. Первое дерьмо появилось в 1993 году в функции, которая позволяла себя использовать не по назначению.

DOO>Тут уж мильон раз говорили, что нельзя добавлять такую проверку в функцию, которая реализуется одной инструкцией процессора.

http://www.rsdn.ru/forum/philosophy/4036954.1.aspx
Автор: FR
Дата: 13.11.10
Re[7]: Ломать ли совместимость в недокументированной области
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 15.11.10 07:27
Оценка: +3 -1
Здравствуйте, Шахтер, Вы писали:

Ш>Тут дело даже не в этом. Человек пишет код. У него есть требования на реализацию, кроме того, он должен написать данную функцию максимально эффективно.

Ш>Как при этом будет работать данная функция, если её неправильно используют, его волновать не должно совершенно. Как получится, поведение не определено в этом случае.

Разработчики пишут не для себя, а для пользователей/других разработчиков. Если вдруг де-факто оказалось, что недокументированные возможности использует большое количество пользователей, то это повод либо ничего не менять, либо даже ввести недокументированное поведение в стандарт.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[11]: Ломать ли совместимость в недокументированной област
От: vdimas Россия  
Дата: 15.11.10 08:31
Оценка:
Здравствуйте, FR, Вы писали:

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

FR>Когда длина известна и небольшая обычно несколькими mov обходятся.
FR>Даже эта "одна" инструкция с REP префиксом по сути цикл.

Давай конкретней, про какие компиляторы речь. А то для MS VC всё что ты написал — неверно.
Re[3]: Ломать ли совместимость в недокументированной области
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.11.10 08:37
Оценка:
Здравствуйте, DOOM, Вы писали:

I>>Эдак и про Виндовс можно сказать — ошибки не в Виндовсе а в прикладных программах. Каково ?

DOO>Ну ты обычно так и говоришь

Гонишь ведь.
Re[10]: Ломать ли совместимость в недокументированной област
От: March_rabbit  
Дата: 15.11.10 10:40
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, March_rabbit, Вы писали:


M_>>Думаю, скорее всего у них юнит-тесты проверяют документированный интерфейс. Не должна функция memcpy сохранять живым кусок памяти при копировании пересекающихся блоков — не будет на это юнит-теста. Такой юнит-тест будет у функции memmove. И нельзя оправдываться инвариантами, когда речь идет о наружении контракта фукнции (в котором сказано: работаю только с непересекаюшимися блоками памяти).


Vi2>К тому же, и у memcpy, и у memmove будут одинаковые тесты.

почему? Точнее, зачем в тесты для memcpy совать тест на правильную обработку пересекающихся областей? А потом еще проверять, чтобы он сломался? Ибо он может сломаться, а может и не сломаться (ибо в контракте не оговорено, что должно произойти).
Re[8]: Ломать ли совместимость в недокументированной области
От: March_rabbit  
Дата: 15.11.10 10:43
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, March_rabbit, Вы писали:


M_>>Оно и в ассемблере выглядит почти так же (там будет что-то типа to[i] = from[i]; ++i ).


V>Нет, там будет одна инструкция ассемблера по копированию блока памяти.

ну да. примерно такой цикл она и будет выполнять, только со счетом от значения ECX до 0. Если со времен 386 процессора не появилось принципиально новых команд в основной линейке. Я со времен универа ассемблером не осень занимаюсь.
Re[12]: Ломать ли совместимость в недокументированной област
От: FR  
Дата: 15.11.10 14:51
Оценка: 8 (1)
Здравствуйте, vdimas, Вы писали:

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

FR>>Когда длина известна и небольшая обычно несколькими mov обходятся.
FR>>Даже эта "одна" инструкция с REP префиксом по сути цикл.

V>Давай конкретней, про какие компиляторы речь. А то для MS VC всё что ты написал — неверно.


Как раз для VC все справедливо, находишь memcpy.asm практически я ее выше и описал.

Вот такой код:

#include <stdio.h>
#include <memory.h>
#include <string>
#include <vector>

int main()
{
wchar_t Dst[10];

// Для фиксированной небольшой длины.
wchar_t *a0 = L"Test";
memcpy(Dst, a0, 5 * sizeof(wchar_t));
printf("%S\n", Dst);

// Неизвестная при компиляции длина
std::wstring a1 = L"TesT";
memcpy(Dst, a1.c_str(), (a1.size() + 1) * sizeof(wchar_t));
printf("%S\n", Dst);
}


для VC 2009 c /O2 дает такой выхлоп:

_main    PROC                        ; COMDAT

; 7    : {

    sub    esp, 52                    ; 00000034H
    mov    eax, DWORD PTR ___security_cookie
    xor    eax, esp
    mov    DWORD PTR __$ArrayPad$[esp+52], eax

; 8    : wchar_t Dst[10];
; 9    : 
; 10   : // Для фиксированной небольшой длины.
; 11   : wchar_t *a0 = L"Test";
; 12   : memcpy(Dst, a0, 5 * sizeof(wchar_t));

    mov    eax, DWORD PTR ??_C@_19FNGKFHMA@?$AAT?$AAe?$AAs?$AAt?$AA?$AA@
    mov    ecx, DWORD PTR ??_C@_19FNGKFHMA@?$AAT?$AAe?$AAs?$AAt?$AA?$AA@+4
    mov    dx, WORD PTR ??_C@_19FNGKFHMA@?$AAT?$AAe?$AAs?$AAt?$AA?$AA@+8
    mov    DWORD PTR _Dst$[esp+52], eax
    push    esi

; 13   : printf("%S\n", Dst);

    lea    eax, DWORD PTR _Dst$[esp+56]
    push    eax
    push    OFFSET ??_C@_03NNECAHIM@?$CFS?6?$AA@
    mov    DWORD PTR _Dst$[esp+68], ecx
    mov    WORD PTR _Dst$[esp+72], dx
    call    _printf

; 14   : 
; 15   : // Неизвестная при компиляции длина
; 16   : std::wstring a1 = L"TesT";

    xor    ecx, ecx
    add    esp, 8
    lea    eax, DWORD PTR [ecx+4]
    lea    esi, DWORD PTR _a1$[esp+56]
    mov    DWORD PTR _a1$[esp+80], 7
    mov    DWORD PTR _a1$[esp+76], 0
    mov    WORD PTR _a1$[esp+60], cx
    call    ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign

; 17   : memcpy(Dst, a1.c_str(), (a1.size() + 1) * sizeof(wchar_t));

    mov    eax, DWORD PTR _a1$[esp+60]
    mov    esi, 8
    cmp    DWORD PTR _a1$[esp+80], esi
    jae    SHORT $LN49@main
    lea    eax, DWORD PTR _a1$[esp+60]
$LN49@main:
    mov    edx, DWORD PTR _a1$[esp+76]
    lea    ecx, DWORD PTR [edx+edx+2]
    push    ecx
    push    eax
    lea    edx, DWORD PTR _Dst$[esp+64]
    push    edx
    call    _memcpy

; 18   : printf("%S\n", Dst);

    lea    eax, DWORD PTR _Dst$[esp+68]
    push    eax
    push    OFFSET ??_C@_03NNECAHIM@?$CFS?6?$AA@
    call    _printf
    add    esp, 20                    ; 00000014H

; 19   : }

    cmp    DWORD PTR _a1$[esp+80], esi
    pop    esi
    jb    SHORT $LN78@main
    mov    ecx, DWORD PTR _a1$[esp+56]
    push    ecx
    call    ??3@YAXPAX@Z                ; operator delete
    add    esp, 4
$LN78@main:
    mov    ecx, DWORD PTR __$ArrayPad$[esp+52]
    xor    ecx, esp
    xor    eax, eax
    call    @__security_check_cookie@4
    add    esp, 52                    ; 00000034H
    ret    0
_main    ENDP


В общем все как я и говорил.
Re[5]: Ломать ли совместимость в недокументированной области
От: Игoрь Украина  
Дата: 15.11.10 22:53
Оценка:
Здравствуйте, DOOM, Вы писали:

DOO>Это самый интересный вопрос. Потому что во многих языках подобные функции вообще не являются частью библиотек, а относятся к выражениям самого языка. Здесь сработала низкоуровневость C.

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


DOO>Я приводил сравнение с протоколами. Сколько сегодня существует реализаций того же TCP — никто никогда не скажет. Если завтра потребуется наконец-то использовать какое-то зарезервированное поле TCP заголовка, то что делать? Никакой хоть сколько-то адекватный анализ провести невозможно. Для glibc это корректное сравнение — она ведь черт знает где используется, никто даже всех дистрибутивов линукса перечислить не сможет.

Да, для полноты картины только аналогий с tcp не хватало. В следующий раз пусть ко мне обращаются, я им происследую без проблем

И>>б) объяснить свою мотивацию пользователям; в) о breaking changes следовало бы информировать заранее.

DOO>А может это и было сделано?
DOO>Вообще, конечно, стоило бы.
Хз, но судя по первому сообщению не похоже.
Re: Ломать ли совместимость в недокументированной области?
От: Donz Россия http://donz-ru.livejournal.com
Дата: 16.11.10 08:26
Оценка: +5 -1
Здравствуйте, Michael7, Вы писали:

M>Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков.

M>Причем некоторые из разработчиков используют это API не описанным в документации способом или даже прямо там запрещенном (не в юридическом смысле) и никаких проблем от этого до сих пор не возникало, потому что, де-факто, оно работало нужным образом, хотя и не позволенным документацией.
M>В один прекрасный момент разработчики чего-то там у себя переписали и внезапно недокументированное поведение функции из API изменилось, что поломало совместимость и привело к ошибкам в работе и возмущениям.
M>И вот кто тут прав?

Разработчики, которые использовали функцию, нарушая контракт, однозначно долбодолбы. Но исправлять ситуацию все равно придется разработчикам glibc. Как бы ни хотелось поставить дебилов на место, но суровая реальность такова, что ПО создается для конечных пользователей. И не важно по каким причинам оно перестанет работать, в мозгах отложится "Новый линукс не совместим со флешем". Заставить сонмище говнокодеров следовать спецификациям и переписать свои поделки за неделю нереально.
Re[2]: Ломать ли совместимость в недокументированной области
От: COFF  
Дата: 16.11.10 10:10
Оценка: +3
Здравствуйте, Donz, Вы писали:

D>Разработчики, которые использовали функцию, нарушая контракт, однозначно долбодолбы.


Вас можно поздравить — судя по всему Вы давно забыли о том, что такое баги и разогнали отдел тестирования? ))
На самом же деле это чистая статистика. Если есть возможность использовать что-то неправильно, и это что-то используется достаточно широко, то оно будет использовано неправильно. Даже не по злой воле неких долбодолбов, а просто потому, что человеку свойственно ошибаться.
Re: Ломать ли совместимость в недокументированной области?
От: Кодёнок  
Дата: 16.11.10 10:43
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Такая вот любопытная дилемма получается. С одной стороны как бы разработчик не обязан обеспечивать совместимость за пределами документированного поведения, с другой стороны, вроде и поломка чужих важных программ после такого не есть хорошо.


Единственный косяк со стороны glibc — отсутствие предупреждения о внесении ломающих изменений. Впрочем, они не майкрософт, у них нет целого отдела, тестирующего на совместимость — могли просто не знать. В остальном, разработчики ПО сами себе продемонстрировали свою же поговорку: “читайте доки, они рулез”
Re[2]: Ломать ли совместимость в недокументированной области
От: Кодёнок  
Дата: 16.11.10 10:45
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Единственный косяк со стороны glibc — отсутствие предупреждения о внесении ломающих изменений. Впрочем, они не майкрософт, у них нет целого отдела, тестирующего на совместимость — могли просто не знать. В остальном, разработчики ПО сами себе продемонстрировали свою же поговорку: “читайте доки, они рулез”


Хотя если подумать, еще дебажная версия memcpy могла бы проверять контракт, на всякий случай.
Re[2]: Ломать ли совместимость в недокументированной области
От: COFF  
Дата: 16.11.10 12:29
Оценка: 1 (1) +2
Здравствуйте, Кодёнок, Вы писали:

Кё>В остальном, разработчики ПО сами себе продемонстрировали свою же поговорку: “читайте доки, они рулез”


Все здесь такие непогрешимые, что я даже удивляюсь, зачем вообще такая профессия как тестер нужна? Казалось бы, проще некуда — прочитали доки и написали софт ))
Re[3]: Ломать ли совместимость в недокументированной области
От: Donz Россия http://donz-ru.livejournal.com
Дата: 16.11.10 15:54
Оценка:
Здравствуйте, COFF, Вы писали:

D>>Разработчики, которые использовали функцию, нарушая контракт, однозначно долбодолбы.

COF>Вас можно поздравить — судя по всему Вы давно забыли о том, что такое баги и разогнали отдел тестирования? ))

Не понял связи. Баги надо исправлять, а не обвинять разработчиков core API, что они вовремя не отшлепали тех, кому плевать на явное указание в документации, что таким способом функцию использовать нельзя.

COF>На самом же деле это чистая статистика. Если есть возможность использовать что-то неправильно, и это что-то используется достаточно широко, то оно будет использовано неправильно. Даже не по злой воле неких долбодолбов, а просто потому, что человеку свойственно ошибаться.


То есть запрещаем молотки только потому, что есть некоторые люди, которые будут бить им по пальцам, а не по гвоздям?
Я так понимаю, это был намек, что разработчики glibc должны были сделать проверку правильности аргументов. А вот теперь вопрос: должны ли разработчики одной из основных функций ядра максимально ее оптимизировать, или же они должны позаботиться об особо одаренных, кто не в состоянии понять документацию, и добавить все возможные проверки (учти, что данный конфликт учитывает только один из возможных неправильных вариантов значений аргументов)?
И еще вопрос: как бы вы оценивали ситуацию, если бы разработчики Flash'а в свое время прочитали бы документацию и с новой версией glibc не было проблем? Вам не кажется, что вопроса то не было бы, а всех остальных просто отправили бы выпускать новые версии своего ПО под новую версию glibc, как это делает Микрософт со многими продуктами?
Re[4]: Ломать ли совместимость в недокументированной области
От: COFF  
Дата: 16.11.10 21:50
Оценка: +5
Здравствуйте, Donz, Вы писали:

D>То есть запрещаем молотки только потому, что есть некоторые люди, которые будут бить им по пальцам, а не по гвоздям?

D>Я так понимаю, это был намек, что разработчики glibc должны были сделать проверку правильности аргументов. А вот теперь вопрос: должны ли разработчики одной из основных функций ядра максимально ее оптимизировать, или же они должны позаботиться об особо одаренных, кто не в состоянии понять документацию, и добавить все возможные проверки (учти, что данный конфликт учитывает только один из возможных неправильных вариантов значений аргументов)?

Почему все сводится к пониманию документации? Я могу прекрасно знать, что в memcpy нельзя передавать пересекающиеся области памяти, но я могу банально пропустить ситуацию, когда две области все-таки пересекаются, хотя мне кажется совсем иначе. Найти и исправить эту ошибку практически невозможно. А так как продолжалась эта ситуация достаточно долго, то и вероятность того, что эта ошибка проявится была высокой. Кстати, именно во Flash'е она проявилась только потому, что его много кто использует, а не потому, что он плохо написан. Наверняка она есть и во многих других местах, просто пока ее не нашли. Виноваты в этом только разработчики glibc — это классическая ситуация типа "мы в ответе за тех, кого приручили". По моему, они поступили абсолютно безответственно. Почему, например, нельзя было ввести какой-то define типа FAST_MEMCPY и вызывать старую или новую функцию в зависимости от него? Кому надо, тот его поставит, а старый код работал бы без изменений.
Re: Еще раз подтверждает, что линупсоиды - воинственные дроч
От: пыщьх http://rsdn_user.livejournal.com
Дата: 16.11.10 21:57
Оценка: 2 (1) +10
Типичный догматичный за@б линупсоидов — поставить раком собственных юзеров из-за того, что индокодеры священные маны не читали.
Что бы сделал пыщьх? Элементарно:
1. На уровне молока матери билд-системы разделение на DEBUG и RELEASE билды, вместо самописных велосипедов в половине make-файлов.
2. За год до изменения модифицируем debug-версию memcpy(), чтобы там вылетал ASSERT() в случае пересекаюшихся буферов.
3. Даем девелоперам год на фикс. Пишем об этом явно и везде.
4. Спустя год, меняем release-реализацию.

Но, почему-то, в сообществе красноглазиков думать о юзабилити не принято. Так что, слушайте, Василий Иванович, ваши валенки...
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[5]: Ломать ли совместимость в недокументированной области
От: Donz Россия http://donz-ru.livejournal.com
Дата: 17.11.10 09:32
Оценка: :)
Здравствуйте, COFF, Вы писали:

COF>Почему все сводится к пониманию документации? Я могу прекрасно знать, что в memcpy нельзя передавать пересекающиеся области памяти, но я могу банально пропустить ситуацию, когда две области все-таки пересекаются, хотя мне кажется совсем иначе.


Давно не писал на ся, так что малость не в курсе современных методик разработки. Но судя по форумам и применяя здравый смысл, могу предположить, что как минимум можно сделать свою обертку над memcpy, где и проводить свою проверку непересечения областей. Эту обертку можно обложить юнит-тестами.
Насколько я знаю, немало сишных проектов, где присутствует свой менеджер памяти как раз для того, чтобы не огрести проблем. Разработчики из Адоба этим не озаботились.
Так что, извините за грубость, им можно сказать только одно: "Не можешь срать — не мучай жопу". В смысле, если не в состоянии грамотно писать на си и уследить за памятью, то переквалифицируйся на сишарп или яву, там таких проблем с не будет (хотя могут быть другие, и если избегать нормального процесса тестирования, они будут).

COF>Кстати, именно во Flash'е она проявилась только потому, что его много кто использует, а не потому, что он плохо написан. Наверняка она есть и во многих других местах, просто

пока ее не нашли. Виноваты в этом только разработчики glibc — это классическая ситуация типа "мы в ответе за тех, кого приручили". По моему, они поступили абсолютно безответственно.

Это называется перекладывание ответственности. "Меня не научили", "мне не сказали", "я про это не читал". Как уже писал выше, конечные разработчики ПО вполне могли создать свои обертки над системными вызовами, где и проводить все проверки.

COF>Почему, например, нельзя было ввести какой-то define типа FAST_MEMCPY и вызывать старую или новую функцию в зависимости от него? Кому надо, тот его поставит, а старый код работал бы без изменений.


Подозреваю, так и сделают.
Re[6]: Ломать ли совместимость в недокументированной области
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 17.11.10 09:37
Оценка: +1
Здравствуйте, Donz, Вы писали:


COF>>Кстати, именно во Flash'е она проявилась только потому, что его много кто использует, а не потому, что он плохо написан. Наверняка она есть и во многих других местах, просто пока ее не нашли. Виноваты в этом только разработчики glibc — это классическая ситуация типа "мы в ответе за тех, кого приручили". По моему, они поступили абсолютно безответственно.


D>Это называется перекладывание ответственности. "Меня не научили", "мне не сказали", "я про это не читал". Как уже писал выше, конечные разработчики ПО вполне могли создать свои обертки над системными вызовами, где и проводить все проверки.


Не понял. По вашему, надо каждый системный вызов обертывать и параноидально проверять на возможность некорректного использования?
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[7]: Ломать ли совместимость в недокументированной области
От: Donz Россия http://donz-ru.livejournal.com
Дата: 17.11.10 10:22
Оценка:
Здравствуйте, Sshur, Вы писали:

D>>Это называется перекладывание ответственности. "Меня не научили", "мне не сказали", "я про это не читал". Как уже писал выше, конечные разработчики ПО вполне могли создать свои обертки над системными вызовами, где и проводить все проверки.


S>Не понял. По вашему, надо каждый системный вызов обертывать и параноидально проверять на возможность некорректного использования?


Нет, я описал возможное решение проблемы, когда разработчики не могут уследить за использованием памяти. А вы предлагаете в каждом системном вызове делать всевозможные проверки, предполагая что разработчик, который их использует, не в состоянии отследить некорректные значения сам?
Re[5]: Документацию читают только ламеры
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.11.10 11:29
Оценка: -1
Здравствуйте, Pzz, Вы писали:

Конечно шутка, но в каждой шутке... Ну нельзя требовать от людей постоянно помнить кучу деталей. В конце концов можно банально спутать эти две функции. Помнить, что они разные, но вот попутал бес и был уверен, что наоборот. А по названию тут хрен догадаешься. Или не подумал (думал о другом). Опять же, кроме чтения документации можно глянуть исходник.

Гуманнее надо быть к людям и прощать их ошибки. Тем более, когда это ничего не стоит.
Re[8]: Ломать ли совместимость в недокументированной области
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 17.11.10 11:34
Оценка:
Здравствуйте, Donz, Вы писали:

D>Нет, я описал возможное решение проблемы, когда разработчики не могут уследить за использованием памяти. А вы предлагаете в каждом системном вызове делать всевозможные проверки, предполагая что разработчик, который их использует, не в состоянии отследить некорректные значения сам?


Я ничего не предлагаю, я не понял вашу идею. Собственные менеджеры памяти пишут совсем не для того, чтобы ошибки в системных вызовах отлавливать.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[7]: Ломать ли совместимость в недокументированной области
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.11.10 11:46
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Не понял. По вашему, надо каждый системный вызов обертывать и параноидально проверять на возможность некорректного использования?


Скорее речь идет об отладочной версии glibc, где предусмотреть создание лога предупреждений.
Re[8]: Ломать ли совместимость в недокументированной области
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 17.11.10 11:54
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, Sshur, Вы писали:


S>>Не понял. По вашему, надо каждый системный вызов обертывать и параноидально проверять на возможность некорректного использования?


M>Скорее речь идет об отладочной версии glibc, где предусмотреть создание лога предупреждений.


Я понял Донца, что пользователи сами должны делать себе такие версии glibc и прочего. А это ИМХО перебор
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re: Ломать ли совместимость в недокументированной области?
От: minorlogic Украина  
Дата: 20.11.10 08:40
Оценка:
Я не понмаю проблемы .

Пофиксили поведение функции только в новых версиях системы , зачем же ее ставить прямо сразу. Пройдет определенное время и пофиксят совместимости . Вот и все. Я чего то не понимаю ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[10]: Ломать ли совместимость в недокументированной област
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.12.10 14:54
Оценка: +1
Здравствуйте, DOOM, Вы писали:

DOO>Я замечу, что memcpy на ассемблере — это (без учета инициализации регистров) одна инструкция.

DOO>Так что накладные расходы на рантайм проверку совершенно неприемлемы.
К сожалению, уже лет 10 как попытка сделать "memcpy на ассемблере" в одну инструкцию породит больше накладных расходов, чем в несколько. Все приличные компиляторы выполняют развёртку цикла, и она работает быстрее, чем rep movsd.
Крайне не рекомендую учить матчасть в 2010 году по книге "ассемблер 386 для профессионалов".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Ломать ли совместимость в недокументированной области
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.12.10 14:55
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Нет, там будет одна инструкция ассемблера по копированию блока памяти.

Нет. Там будет довольно много инструкций.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Ломать ли совместимость в недокументированной области
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.12.10 14:57
Оценка:
Здравствуйте, March_rabbit, Вы писали:
V>>Нет, там будет одна инструкция ассемблера по копированию блока памяти.
M_>ну да. примерно такой цикл она и будет выполнять, только со счетом от значения ECX до 0. Если со времен 386 процессора не появилось принципиально новых команд в основной линейке. Я со времен универа ассемблером не осень занимаюсь.
Дело не в новых командах, а в новой архитектуре. И во времена твоего универа rep movs* была ничуть не быстрее по тактам, чем ручное написание цикла. А сейчас развёртывание цикла позволяет существенно сэкономить. Современные компиляторы практически никогда не используют префикс rep.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Ломать ли совместимость в недокументированной области?
От: shasa  
Дата: 11.01.11 06:01
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Предположим есть некий давно присутствующий на рынке программный продукт, с API, которое использует огромное число разработчиков...


Я считаю что в данном случае виноваты разработчики API, в частности реализовавшие memcpy, правильно работающей и с перекрывающимися блоками, т.к. это расходится с документацией, но вызов требует больших затрат времени ЦПУ чем простое копирование, т.к. требует дополнительных проверок. Следовательно, если это свойство широко используется, значит его нужно сохранить. А подобное поведение разработчиков glibc похоже вызвано тем что они чувствуют себя пупом земли. Думаю если это продолжится, или всплывут другие такиеже случаи, то glibc будет иметь альтернативные сборки.
Re[8]: Ломать ли совместимость в недокументированной области
От: Sharowarsheg  
Дата: 11.01.11 06:18
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

G>>>>А вот разработчики glibc положили йух на такую совместимость.

MC>>>Если у них есть такая возможность — за них можно только порадоваться.
G>>Да в том то и дело что у них нет, а они думают что есть.
MC>Она у них есть. Из всех программ сломался только флеш плеер. Ну и хуавей с ним.

И после этого кто-то агитирует за линукс на десктопе в реальной жизни. В следующий раз сломают гуй и скажут, "ну и гуй с ним".
Re[2]: Ломать ли совместимость в недокументированной области
От: Michael7 Россия  
Дата: 20.01.11 21:26
Оценка:
Здравствуйте, shasa, Вы писали:

S>Я считаю что в данном случае виноваты разработчики API, в частности реализовавшие memcpy, правильно работающей и с перекрывающимися блоками, т.к. это расходится с документацией, но вызов требует больших затрат времени ЦПУ чем простое копирование, т.к. требует дополнительных проверок.


Дополнительных проверок как раз не было, они просто тупо mov-или, продвигаясь сверху вниз по адресам. А потом им пришло в голову использовать векторные инструкции процессора для ускорения.

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

S> Следовательно, если это свойство широко используется, значит его нужно сохранить.


Вот это и есть камень преткновения: стоит или нет. Как видно, имеются доводы и за и против. С одной стороны, такое поведение де-факто похоже с самых первых версий линукса, с другой стороны — все-таки никто не обещал правильного поведения во всех случаях.

S> А подобное поведение разработчиков glibc похоже вызвано тем что они чувствуют себя пупом земли. Думаю если это продолжится, или всплывут другие такиеже случаи, то glibc будет иметь альтернативные сборки.


А и так уже были или есть.
Re[2]: Ломать ли совместимость в недокументированной области
От: WinterMute Россия http://yarrr.ru
Дата: 31.03.11 12:27
Оценка:
IT>Разработчики glibc не виноватые, они просто козлы. Всё что надо было сделать, чтобы избежать конфликта — это написать новую версию memcpy — memcpy2 или лучше fastmemcpy, и в своей либе перейти на неё, если им нужно.

Или realmemcpy(), и, по необходимости, добавить absolutely_real_memcpy_read_documentation_before_use().
В крайнем случае понадобится добавить absolutely_real_memcpy_read_documentation_TWICE_before_use() и почти наверняка не будет проблем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.