LINUX.ORG.RU
ФорумTalks

Откуда это «user don't care»?


0

4

Что то в последние годы все чаще стало это проскакивать в качестве аргументации. адоб не прочитал доки и использовал memcpy неправильно - выбегает Линус и говорит «users don't care», и требует вернуть все как было, nvidia использовала какой-то deprecated интерфейс, так что на новых ядрах не заводится, опять куча людей орут «users don't care». Покажите мне этого юзера, не входящего в множество быдла, который бы перекладывал с больной головы на здоровую?

★★★★★

Ну начинать тут, если по-хорошему, нужно издалека, с растановки приоритетов. Для Линуса, как и для большинства разработчиков, приоритетом является usability для пользователей, прочем как для end-users, так и для нижележащих девелоперов. Этот выбор - не аксиома, но если приоритет поставлен по-другому, то последовательным поведением будет молчать в тряпочку по поводу одного процента, отсутствующего софта, несовместимых форматов и далее по списку - как вы относитесь к нижележащим разработчикам, так и они к вам (то есть плюют с высокой колокольни), можете и дальше любоваться своим технически логичным кодом, и вообще вам прямая дорога на hurd. Это некий краеугольный камень. Если с этим все понятно - можно идти дальше.

Любое UB - это совершенно прямая предпосылка к возникновению стандарта де-факто, если это UB в подавляющем большинстве случаев (случаев - в смысле отдельных кейсов приенения, а не продуктов) раскрывается одинаково. К сожалению, все конторы по стандартизации страдают тем же илитизмом, и валандаются со стандартами до бесконечности, после чего иногда вообще выкатывают нечто, что не соответствует существующей действительности. Довольно хороший пример - когда мобильная опера начала реализовывать функции с меткой webkit. Стандарты нужны исключительно для удобства разработки, не являются священной коровой и не имеют ценности сами по себе. Если контора по стандартизации не может вовремя предложить стандарт - он сформируется внутри сообщества, нравится это кому-то или нет. В ГК, например, такая штука называется обычаем делового оборота, и работает в том случае, если в самом ГК конкретная ситуация не обговорена.

В свете вышесказанного позиция users don't care вполне понятна. Юзеру нужно, чтоб работало, причем как конечному пользователю, так и нижестоящему разработчику. Любое _изменение_ должно сохранять работоспособность, иначе не совсем понятно, зачем вообще менять работающее на неработающее. Появление костылей - это печально, но такое появление в первую очередь допускается самим разработчиком, построившим ситуацию вида «сейчас это стабольно работает так, но мы можем в любой момент это поменять». Не можете, потому что являетесь по факту стандартодателем.

stetzen ★★
()
Ответ на: комментарий от edigaryev

Но опять же, зачем? Ведь snprintf специально создана для того, чтобы не переполнить буфер (записывается size-1 символов, и в конце добавляется NULL terminator). А если хочется узнать, записалось ли все что нужно, достаточно проверить что возвращаемое значение меньше size.

Ну вот, за snprintf надо проверить, не обрезала ли она строку. sprintf_s вызовет хендлер и там уж можно решить, что делать. Т.е. если изначально предполагаем, что строка в буфер всегда помещается.

Ну и не snprintf'ом единым, кучу функций же доделали. В strncpy всегда нуль-терминатор теряли, в strncpy_s - исправлено.

AptGet ★★★
()
Последнее исправление: AptGet (всего исправлений: 1)
Ответ на: комментарий от cvs-255

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

xnick
()
Ответ на: комментарий от PolarFox

Реализация, в которой memcpy работает так, как ожидают разработчики adobe, также соответствует стандарту.

Соотвтетствует, но расчитывать именно на нее нельзя

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от crowbar

Потому что «user don't care»

Точно так же можно сказать «developer don't care».

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

xnick
()
Ответ на: комментарий от xnick

Так можно сказать, только

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

crowbar
()
Ответ на: комментарий от Deleted

«You are perfectly free to be an asshole.» (с)

Ггг. И? Что-то эта статейка поменяла в положении вещей? «Критицизм» в духе собаки лают, корован... донт гив а фак.

slackwarrior ★★★★★
()
Ответ на: комментарий от crowbar

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

В конечном итоге - все, вопрос только в длине цепочки. И непосредственные работодатели обычно тоже не будут особо разбираться, кто тут поступил по понятиям, а кто - нет. Сломал - чини.

stetzen ★★
()
Ответ на: комментарий от stetzen

Сломал - чини.

Техзадание, в котором описано, что требуется от моего кода, есть? Новая реализация соответствует? Если да, то с моей стороны все в норме.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от PolarFox

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

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

Если ему хочется чего-то изменить - пускай составляет новое ТЗ, в котором его пожелания будут четко сформулированы

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

То что ты описал, конечно, хорошо и правильно, но в общем-то оно называется итальянская забастовка.

Накатываем патч на glibc, ломается флеш. Значит это плохой патч, даже если он проходит тесты.

PolarFox ★★★★★
()
Ответ на: комментарий от cvs-255

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

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Значит это плохой патч, даже если он проходит тесты.

Нет, это плохой флеш, плюющий на утвержденные стандарты

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от PolarFox

То что ты описал, конечно, хорошо и правильно, но в общем-то оно называется итальянская забастовка.

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

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от PolarFox

Накатываем патч на glibc, ломается флеш. Значит это плохой патч, даже если он проходит тесты.

Это значит, что плохой флэш.

Я написал функцию «константа» вот такого вида

double mathconst(char ** e) {
   if (strcasecmp(e,"zero")==0) return 0;
   if (strcasecmp(e,"e")==0) return 2.7182;
   return 3.1416;
}

и задокументировал её так «возвращает значение затребованной константы, аргумент - имя константы, можеьт быть pi, e или zero»

Программистка Адобася Долбакова решила использовать эту функцию для вычисления длины окружности:

double clen(double rad) {
    return 2*mathconst("pie")*rad;
}

Теперь я решил улучшить свою функцию, и переписал её:

double mathconst(char ** e) {
   if (strcasecmp(e,"zero")==0) return 0;
   if (strcasecmp(e,"e")==0) return 2.7182;
   if (strcasecmp(e,"pi")==0) return 3.1416;
   return -1;
}

Так вот - то, что у Адобаси Долбаковой сломалась её программа - проблема Адобаси Долбаковой. Потому, что воспользовалась UB.

Если malloc выделял память с выравнивание на 32 байта, то можно сделать malloc(16) и записать туда 24 байта. А в следующей версии malloc изменят, и он будет выделять память с выравниванием на 8 байт. И кривая программа сломается или начнет крушить данные. Это не проблема автора malloc, это проблема быдлокодера чья программа нарушает правила.

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

no-dashi ★★★★★
()
Последнее исправление: no-dashi (всего исправлений: 1)
Ответ на: комментарий от cvs-255

ну в общем-то да, должно было быть (char * e)

Давно на низкоуровневом не писал.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Так вот - то, что у Адобаси Долбаковой сломалась её программа - проблема Адобаси Долбаковой. Потому, что воспользовалась UB.

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

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Ну так glibc работает _полностью_корректно_. в ней проблем нет. Что заявлялось, то и реализовано.

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

Вот и весь смысл. А кто там виноват на самом деле, мне посрать. Я всего-то хочу смотреть видео с котейками или бабами обнаженными.

shimon ★★★★★
()
Ответ на: комментарий от no-dashi

Только вот программа Адобаси Долбаковой установлена на каждом втором компьютере, и чтобы ничего не сломалось, тебе по-хорошему стоит теперь добавить константу pie.

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

PolarFox ★★★★★
()
Ответ на: комментарий от cvs-255

Когда флеш на линуксе тормозит, глючит или не работает, то это не флеш плохой, а линукс плохой. И вариант, при котором флеш работает, полностью соответствует стандарту. В си использование значения неинициализированной переменной тоже UB, однако gcc услужливо подставляет нули где можно. Уверен, что если это дело пропатчить обратно на UB, много чего отвалится.

Особенно неудивительно слышать такую фразу от Линуса, он во-первых прагматик, а не идеалист, во-вторых он никогда не делает в ядре изменений, ломающих юзерспейс.

PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)

Оттуда, что идеалисты нежизнеспособны. К счастью.

leave ★★★★★
()
Ответ на: комментарий от PolarFox

В си использование значения неинициализированной переменной тоже UB, однако gcc услужливо подставляет нули где можно.

gcc такого не делает:

~> cat ub.c
#include <stdio.h>

void test1() {
	int a = 10;
	printf("%d\n", a);
}

void test2() {
	int a;
	printf("%d\n", a);
}

int main() {
	test1();
	test2();
}
~> ./ub
10
10
AptGet ★★★
()
Последнее исправление: AptGet (всего исправлений: 1)
Ответ на: комментарий от AptGet

Да, про гцц был не прав, с чего-то решил, что он подставляет. Но тем не менее суть ясна. Если на определённый вариант раскрытия UB много чего начинает быть завязано, то этот вариант раскрытия UB стоит считать стандартом.

PolarFox ★★★★★
()
Ответ на: комментарий от edigaryev

я думаю, что постинг на лоре подходит под понятие «вклад в спо»

MyTrooName ★★★★★
()
Ответ на: комментарий от slackwarrior

Это ты сейчас так пишешь. А вот бугурты разработчиков в бложиках показывают обратное :)

Deleted
()

Юзер в такой аргументации как Иисус. Иисус бы не одобрил поломку memcpy!

vasily_pupkin ★★★★★
()
Ответ на: комментарий от cvs-255

Функция как имела UB так и имеет. Где поломка?

Функция не может иметь UB. UB существует только на бумаге, функция ведёт себя каким-то конкретным образом.

Miguel ★★★★★
()

Что то в последние годы все чаще стало это проскакивать в качестве аргументации. адоб не прочитал доки и использовал memcpy неправильно - выбегает Линус и говорит «users don't care», и требует вернуть все как было

users don't care, что ты чудак, на букву «м».

Покажите мне этого юзера, не входящего в множество быдла, который бы перекладывал с больной головы на здоровую?

ну например я не понимаю, как можно быть таким чудаком s/ч/м/

emulek
()
Ответ на: комментарий от Miguel

В конкретной реализации да. Но сама по себе memcpy, которая прописана в стандарте языка C, имеет UB. В этом принципиальное отличие glibc и прочих библиотек языка C от какой-либо другой библиотеки/программы.

memcpy это не просто какая-то функция, это memcpy из стандарта языка.

И программа, использующая memcpy, не может расчитывать на какое либо конкретное поведение memcpy в описываемом случае. Потому, что в системе может оказаться не glibc, а любая другая библиотека C, соответствующая стандарту, с другим поведением при пересекающихся регионах.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Miguel

То есть, сломать обратную совместимость — значит накосячить?

попробуй.

Miguel

OH-SHI~~

emulek
()
Ответ на: комментарий от cvs-255

Функция как имела UB так и имеет. Где поломка?

UB внутри memcpy(3) нужна для скорости. Если тебе не нужна скорость, юзай memmove(3), и не сношай моск себе и окружающим. Но ты хочешь и рыбку съесть, и ****.

emulek
()
Ответ на: комментарий от no-dashi

потмоу что адобы должны были начать рвать волосы на своей жопе и выпустить апдейтнутую версию своего быдлокода как только баг был найден.

ВНЕЗАПНО: у них нет денег на программистов.

emulek
()
Ответ на: комментарий от cvs-255

так как Адобася ушла в запой и пальцем не пошевелит

зачем ты финансируешь её запой?

ты должен вернуть старое поведение.

проще послать адобасю в пешее эротическое путешествие.

emulek
()
Ответ на: комментарий от shimon

Вот и весь смысл. А кто там виноват на самом деле, мне посрать. Я всего-то хочу смотреть видео с котейками или бабами обнаженными.

детка, плати деньги мысы, или красной шапке, которая бекпортит старый жлибц. Там всё работает. (только не путай бесплатный стартер или CentOS с Windows & RHEL).

emulek
()
Ответ на: комментарий от emulek

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

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от AptGet

однако gcc услужливо подставляет нули где можно.

gcc такого не делает

а стек не вставляет. А вот в статические и в глобальные — вставляет, и это не UB, а стандарт.

emulek
()
Ответ на: комментарий от PolarFox

Но тем не менее суть ясна. Если на определённый вариант раскрытия UB много чего начинает быть завязано, то этот вариант раскрытия UB стоит считать стандартом.

тебе пометочку надо: «быдлокодер».

emulek
()
Ответ на: комментарий от cvs-255

memcpy это не просто какая-то функция, это memcpy из стандарта языка.

А теперь вернёмся к вопросу об обратной совместимости. Обратная совместимость НЕ БЫВАЕТ с «функцией из стандарта». Обратная совместимость — это совместимость с ПРЕЖНЕЙ РЕАЛИЗАЦИЕЙ.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.