Support us

«По колено в идиотах»: путешествие в мир комментариев к коду ОС Windows

Оставить комментарий
«По колено в идиотах»: путешествие в мир комментариев к коду ОС Windows

hextalkЯ думаю, многие уже слышали из новостей про небольшой и забавный скандальчик в мире «больших разработчиков», который (конечно же) не обошелся без участия Microsoft. Один из активных разработчиков Linux Паоло Бонзини обнаружил двусмысленное выражение в коде гипервизора HyperV, которое как оказалось впоследствии, был включёно в ядро Linux усилиями именно Microsoft. Новую константу 0xB16B00B5 для гостевой ОС Linux можно трактовать как слово «B16 B00B5», то есть как фривольное выражение «BIG BOOBS». «Кто-то пытается пошутить, я полагаю?», — провокационно накручивает Linux-публику программер Паоло Бонзини. Вокруг применения этого спорного словосочетания в качестве константы разгорелся острый конфликт, в который вмешались даже воинственные феминистки-разработчики, но, в конце концов, Microsoft принесла свои официальные извинения за этот инцидент: «Мы благодарим сообщество за информацию по этому вопросу и приносим извинения за оскорбляющую строку. Мы отправили патч, который исправляет эту проблему, изменения вступят в силу со следующей версией ядра», — сказано в комментарии Microsoft. На самом деле это пикантное недоразумение вызвало у меня достаточно смешанные чувства: во-первых, все эти словечки и трюки уже давно широко известны своим повальным применением, но никаких обид никому это как-то до сих пор не приносило. Во-вторых, ведь и в самом Linux полным полно ещё более странных выражений в качестве названий переменных и особенно в содержании комментариев к коду этой ОС. Да и в Microsoft подобные слова и даже откровенные ругательства, наравне с проклинанием всего рода человеческого, — не менее обычное дело для её исходных кодов. Дабы в полной мере зафиксировать этот последний момент, я предлагаю совершить быстрый и стремительный набег на исходные коды ОС Windows. Предлагаю оценить общий стиль комментирования и «облико морале» в документировании кода Microsoft уже на её собственной «операционной» территории, прежде чем обвинять её якобы в «неприличных выходках» в стане её заклятого идеологического врага и конкурента — Linux. На всякий случай предупреждаю: несмотря на то, что материал базируется на фактах (или том, что принято называть фактами), этот текст носит отчасти шутливый характер — автор статьи сам является активным и благодарным пользователем разных ОС от Microsoft, равно как и свободных ОС также (прежде всего FreeBSD). Поэтому, создавая этот текст, я не преследовал цель кого-либо как-либо унизить (или напротив — возвеличить), ибо, как уже было мною сказано, дела на обсуждаемом сегодня пикантном фронте в этих двух противостоящих лагерях обстоят более-менее одинаково.

Исходная точка: краткая история утечки

Но прежде чем начать препарацию уже малость задубевшего пациента, позвольте поспешно объяснить, возможно, немного офигевшему читателю, в чьи исходниках мы собственно собрались копаться. Речь идет о широко известной утечке исходного кода ОС Windows 2000 SP1 и NT4 SP6, произошедшей в начале 2004 года. А если говорить ещё точнее — тогда в сеть утекли фрагменты этих двух ОС, впрочем, достаточно большие, чтобы по ним составить своё мнение о специфике комментирования и именования переменных в исходниках этих лидирующих продуктов Microsoft. И, хотя сама MS ещё в те времена сразу опубликовала предупреждение, в котором говорится, что «софтверный гигант вправе инициировать судебное разбирательство против любого, кто попытается найти, загрузить, отправить по почте, опубликовать в интернете или применить в собственных целях исходники её операционных систем», мы рискнули на свой страх и риск заглянуть в этот запретный код буквально только одним глазком, ведомые одним лишь любопытством и при этом подчеркивая, что никаких коммерческих задач при этом не преследуем. Данная утечка в своих разжатых 627 мегабайтах содержит 28782 файлов, аккуратно разложенных специально обученными людьми из Редмонда в 2132-х папках. Сам, до предела ядрёный, кернел покойно лежит в папке \win2k\private\ntos\ke\ и написан в основном на АСМ-е, и там также есть его версии для i386, alpha, apx64, ia64. Кроме того, позже уже вполне легально и открыто были выложены исходники Windows Research Kernel (WRK), которые содержат исходные коды основной части ядра Windows (NTOS), в кои мы также не преминули заглянуть. Напоследок добавлю, что WRK включает в себя большую часть исходных кодов NTOS ядра из последней выпущенной версии Windows на тот момент — то есть это уже родные каждому Windows XP/Server 2003. Ну, вот и всё краткое вступление: оглядевшись среди дивного разнообразия исходных файлов, приступим к их ковырянию.

«Мы все идиоты»

Итак, ругательные слова (например, такие, как «fucks», «shits» и сотни вхождений «craps» и т. д.) в комментариях кода Windows встречаются довольно часто. Не буду засорять статью подобными цитатами непотребств и проклятий из самых недр исходников этой ОС, попеременно взывающих в самый разный адрес. Приведу лишь одно, самое известное и забавное вхождение одного из этих слов, содержащееся в файле из системы дневной пересборки системы: Цитата из файла: private\windows\media\avi\verinfo.16\verinfo.h: *        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *  !!!!!!! IF YOU CHANGE TABS TO SPACES, YOU WILL BE KILLED!!!!!!! *        !!!!!!!!!!!!!! DOING SO FUCKS THE BUILD PROCESS!!!!!!!!!!!!!!!! *        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Знаю, не я один противник табуляций, тем более таких провокационно-ассиметричных, но makefile обычно ломается без всего этого. Там табуляция — по стандарту положена, поэтому проглотим «это» и продолжим. Кроме проклятий и хитроумной системы сборки, в упомянутых исходниках встречается множество ссылок на неких «идиотов», и даже не побоюсь этого слова, — «конченных придурков»: по комментариям понятно, что они чаще всего олицетворяют некие внешние силы по отношению к самой Microsoft, но встречаются и их внутренние разновидности — работающие в параллельных к данной команде разработчиков. Например, послания этого типа могут принимать такую форму (цитирую комментарии из файла private\ntos\rtl\heap.c, который, судя по его дате, последний раз редактировался аж в далеком 1989 году): //  The specific idiot in this case is Office95, which likes //  to free a random pointer when you start Word95 from a desktop //  shortcut. Упоминаний об «идиотах вокруг нас» в исходниках так много, что я могу самозабвенно цитировать эти примеры до бесконечности, но я ограничусь лишь несколькими: Цитата из файла: private\ntos\w32\ntuser\kernel\swp.c *  for idiots like MS-Access 2.0 who SetWindowPos (SWP_BOZO *  and blow away themselves on the shell, then lets *  just ignore their plea to be removed from the tray Или: Цитата из файла: private\shell\ext\ftp\ftpdrop.cpp: *  We have to do this only because Exchange is a moron. Как видим, придурки очень плотным внешним кольцом окружают разработчиков Microsoft, но, что еще хуже, они уже затесались изнутри и в сам dev.team Windows 2000: приведу ещё парочку примеров этого: Цитата из файла: private\genx\shell\inc\prsht.w: // we are such morons. Wiz97 underwent a redesign between IE4 and IE5 Цитата из файла: private\shell\shdoc401\unicpp\desktop.cpp: // We are morons. We changed the IDeskTray interface between IE4 Цитата из файла: private\shell\browseui\itbar.cpp: // should be fixed in the apps themselves. Morons!

Забота о психическом здоровье коллег

Разработчики Windows 2000 очень трогательны в своём стремлении предупредить и обезопасить своих коллег по разработке от… собственной дури. Давайте посмотрим, какие удивительно информативные послания, полные боли и душевного страдания за несовершенство нашего мира, они оставляют друг другу прямо в комментариях к своему же коду. Я насчитал всего около 4000 различных предупреждений и призывов быть осторожным, ещё совсем немного «БЫТЬ ОЧЕНЬ ОСТОРОЖНЫМ», а также пару упоминаний-просьб быть по-возможности хотя бы снисходительным к автору откомментированного кода. И вот лишь некоторые примеры из них. Цитата из файла: private\inet\mshtml\src\core\cdbase\baseprop.cxx: // HACK! HACK! HACK! (MohanB) In order to fix #64710 at this very late Цитата из файла: private\inet\mshtml\src\core\cdutil\genutil.cxx: // HACK HACK HACK. REMOVE THIS ONCE MARLETT IS AROUND Marlett, конечно, опасен, но есть вещи и поинтересней, например, повсеместное использование нерукопожатного Goto в нутрях Windows: Цитата из файла: private\inet\mshtml\src\other\moniker\resprot.cxx: // goto EndHack; // Цитата из файла: private\inet\mshtml\src\site\layout\flowlyt.cxx: // God, I hate this hack… Цитата из файла: private\inet\wininet\urlcache\cachecfg.cxx: // Dumb hack for back compat. *sigh* Цитата из файла: private\inet\wininet\urlcache\filemgr.cxx: // ACHTUNG!!! this is a special hack for IBM antivirus software Если позволит читатель, я не буду цитировать больше ничего из подсистемы inet, которая, безусловно, является рекордсменом на количество goto-хаков и ругательств в исходниках Windows 2000. Я просто приведу фотографию разработчиков этой подсистемы именно для этой версии Windows 2000/IE 7: developers Поймите меня правильно: я не имею ничего против Индии, страны, которая уже на протяжении последних восьми лет демонстрирует один из самых быстрых в мире темпов роста зарплат в своей ИТ-сфере. Просто иногда, посмотрев на код, вы найдете чрезвычайно полезной возможность посмотреть прямо в глаза человеку, его писавшему (что само по себе может отмести 80% потенциальных к нему вопросов). В силу этого я приветствую разработки подобно этой (или аналог оной для Windows). Ну да, прогулявшись по внешним ссылкам, вернемся к другим примерам посланий о хаках в других местах Windows. Цитата из файла: private\ispu\pkitrust\trustui\acuictl.cpp: // HACK ALERT, believe it or not there is no way to get the height of the current // HACK ON TOP OF HACK ALERT! Цитата из файла: private\ntos\udfs\devctrl.c: // Add the hack-o-ramma to fix formats. Цитата из файла: private\shell\shdoc401\unicpp\sendto.cpp: // Mondo hackitude-o-rama. Цитата из файла: private\ntos\w32\ntcon\server\link.c: // HUGE, HUGE hack-o-rama to get NTSD started on this process! Хакодром имеет место быть во всех подсистемах Windows, если верить этим комментариям. Но вот выборочные примеры особенно пронзительных предупреждений: Цитата из файла: private\shell\lib\util.cpp: // TERRIBLE HORRIBLE NO GOOD VERY BAD & UGLY HACK Цитата из файла: private\ntos\w32\ntuser\client\dlgmgr.c: // HACK OF DEATH: no one survives here Цитата из файла: private\ntos\w32\ntuser\client\nt6\user.h: * The magnitude of this hack compares favorably with that of the national USA debt. Там же замечательный библейский комментарий, который открывает упомянутый файл: // Abandon all hope, ye who enter here. А также такое описание к коду ошибки, задокументированной там же и, надо полагать, вполне уместной для всех Windows-систем: // Impossible Happened И текст вывода сообщения рядом гласит: // «Fatal error: Bad Magic» Так вот откуда берутся известные своей неудобоваримостью ошибки Windows вроде этих: error Интересно, что я не нашел в исходниках ни расистских намеков, ни упоминаний Билла Гейтса или самой Windows. Правда, порой встречаются весьма странные, я бы даже сказал, наркотические комментарии — вот как этот, например: Цитата из файла: private\shell\ext\tweakui\genthunk.c: *  CallProc32W is insane. It’s a variadic function that uses *  the pascal calling convention. (It probably makes more sense *  when you’re stoned.)

Жертвы хаков и недокументированности

Отдельная тема — это поддержка ошибок поддержки других ошибок, особенно когда ошибка в поддержки другой ошибки допускается в известных продуктах третьих фирм и в результате Microsoft вынуждена обеспечивать работоспособность подобных ошибок и в следующих версиях (что превращает её уже в фичу), даже когда всё было найдено и исправлено позже. Если вы ничего не поняли из написанного — не пугайтесь, это просто неизбежные издержки любой БОЛЬШОЙ разработки, просто расслабьтесь и забудьте о том, что ранее читали в умных книгах. Очень показательный случай вышеописанного, подробно изложенный в комментарии в исходниках Windows, — это поддержка некоторых продуктов от Borland, в частности JBuilder Professional. Ниже описана реализация взаимодействия с особенностями компилятора Borland, который весьма своеобразно обрабатывает ошибку в MS Windows с помощью подхода «brute force», которая впоследствии была всё-таки исправлена в MS, и поэтому теперь необходимо насущно решить новую проблему… эээ, ну как бы её эмуляции, чтобы всё работало, как работало и прежде. Взято из filenew.cpp ////////////////////////////////////////////////////////////////////////// // //      CFileOpenBrowser: ResetDialogHeight // //      ------------------------------------------------- //      These guys relied on a bug in Win95/NT4's Comdlg32 that we fixed in IE4. //      So instead of reintroducing the bug, we detect that they are relying //      on the bug and hack around their stupidity. // //      These guys do a SetWindowLong (GWL_STYLE) on the dialog box and //      then reparent it! Unfortunately, they didn’t quite get their //      bookkeeping right: They forgot to do a RedrawWindow after removing //      the WS_CAPTION style. You see, just editing the style doesn’t do //      anything — the style changes don’t take effect until the next //      RedrawWindow. When they scratched their heads («Hey, why is //      the caption still there?»), they decided to brute-force the //      solution: They slide the window so the caption goes «off the screen». // //      Problem: We fixed a bug for IE4 where ResetDialogHeight would screw //      up and not resize the dialog when it should’ve, if the app did a //      SetWindowPos on the window to change its vertical position downward //      by more than the amount we needed to grow. // //      So now when we resize it properly, this generates an internal //      RedrawWindow, which means that Borland’s brute-force hack tries //      to fix a problem that no longer exists! // //      Therefore, ResetDialogHeight now checks if the app has // //            1. Changed the dialog window style, //            2. Moved the dialog downward by more than we needed to grow, //            3. Forgotten to call RedrawWindow. // //      If so, then we temporarily restore the original dialog window style, //      do the (correct) resize, then restore the window style. Reverting //      the window style means that all the non-client stuff retains its old //       (incorrect, but what the app is expecting) size. // ////////////////////////////////////////////////////////////////////////// Второе интересное направление всех этих замысловатых для внешнего наблюдателя «хаков на базе других хаков» — это активное использование недокументированных особенностей, как в других продуктах, так и в самой Windows, что, как видно ниже, иногда приводит к аналогичным шаблонным ситуациям: «для поддержки старого недокументированного вызова API, который уже не существует, создадим обёртку-переходник для его эмуляции на базе нового недокументированного вызова, дабы всё продолжало работать и далее». Что будет со всем этим, когда со временем исчезнет и «новый недокументированный API-вызов»? Спросите об этом того, кто написал всё это (если он еще не вышел на пенсию). Цитата из файла: private\mvdm\wow32\wcntl32.c: // These undocumented messages are used by Excel 5.0 Цитата из файла: private\mvdm\wow32\wgdi31.c: // InquireVisRgn is an undocumented Win 3.1 API. This code has been // suggested by ChuckWh. If this does not fix the s 2.0 // problem, then ChuckWh would be providing us with an private entry // point. Цитата из файла: private\mvdm\wow32\wgfont.c: *  This thunk implements the undocumented Win3.0 and Win3.1 API *  GetCurLogFont (GDI.411). Symantec QA4.0 uses it. *  To implement this undocumented API we will use the NT undocumented API В некоторых случаях, читая подобные комментарии, нельзя не заметить, как сами разработчики пугаются, как малые дети, некоторых следствий из подобных ранее непродуманных решений, с которыми им пришлось неожиданно столкнуться через какое-то время. Иногда они философски озадачены этим, а иногда просто в бешенстве — приведу лишь пару примеров этого: Цитата из файла: private\ntos\w32\ntuser\kernel\mnpopup.c: // Set the GlobalPopupMenu variable so that EndMenu works for popupmenus so // that WinWart II people can continue to abuse undocumented functions. Цитата из файла: private\windows\shell\accesory\hypertrm\emu\minitel.c: // Guess what? Latent background color is always adopted for mosaics. // This is a major undocumented find… Цитата из файла: private\windows\shell\accesory\hypertrm\emu\minitelf.c: // Ah, the life of the undocumented. The documentation says // that this guys does not validate, colors, act as a delimiter // and fills with spaces. Wrong. It does validate the color. // As such its a delimiter. If… Союз «If» обрывается здесь глубокомысленным многоточием: теперь мы так никогда и не узнаем, к чему всё это может привести… По всему видно, что с этими исходниками работает множество людей, поэтому они активно комментируют друг друга, иногда восхищенно записывают свои диковинные находки, найденные в чужом коде, — то, что их лично зацепило. Иногда эта какофония из разных голосов напоминает своего рода шизофрению. В исходниках Windows также можно найти много мест, где некий программист задает в зияющую пустоту свои вопросы, терпеливо и с надеждой вопрошая, как правило, это типичное unde malum «ну почему же всё устроено именно так?». В полном соответствии с жанром большинство подобных вопросов остаются без ответа, впрочем, изредка видны куцые комментарии-ответы в стиле stackoverflow.com, которые, судя по смыслу, были дописаны какое-то время спустя, — это откликнулся коллега, дабы внести недостающую ясность в умы тех, кто последует по стопам этой дискуссии. Нагромождения из текстов-комментариев в виде множества версий-догадок иногда имеют протяженность в два-три экрана, что смахивает скорее на хроники, чем на документ с кодом большой программы.

Субъективное заключение

Исходный код подобной большой системы — как живой организм: это большой муравейник. Он слишком большой и разнородный, чтобы требовать от него какой-то четкой системы, которой следовали бы все разработчики без исключения. Поэтому все комментарии оформляются по-разному, никакой единой системы нет и в помине: равно встречаются как благословления и остроумные имена переменных, так и личные проклятия в адрес своих заклятых недругов. Кстати, лично мои субъективные впечатления от быстрого просмотра кода этой системы очень даже неплохие. По крайней мере относительно Microsoft’а у меня всегда было своё личное предубеждение, сформированное ещё ранее, когда у меня была возможность увидеть исходники некоторых её других продуктов рангом поменьше, которые, надо сразу признать, из-за недостатка времени я просматривал примерно также, как и сегодня рассмотренные, — в общем-то, что называется, «по диагонали». Но тогда даже такого беглого просмотра было достаточно, чтобы понять, как своеобразно соблюдаются «coding guidelines» в Microsoft, в продуктах которой некоторые методы могут содержать тело из кода в сотню экранов, а сам файл с их исходником — «весить» больше мегабайта. В коде Windows 2000 нет этого и в помине, и хотя потроха этой «Винды» и производят впечатление гигантского и многосложного механизма, пронизанного тончайшими капиллярами смысла, безумная сложность аккуратно расфасована по файлам, содержащих не только холодную логику кода, но и вдоволь чисто человеческого навеса, в котором комментирует, рефлексирует, болезненно обвиняя себя и других, часто заочно оппонируя своим коллегам, а порой просто шутит, в том числе применяя пикантные названия для констант и переменных, всё тот же маленький человек, который таким образом находит способ хоть как-то заявить о себе, не обязательно со злым умыслом, как это привиделось горячим финским (и не только) последователям Linux-религии. И напоследок предлагаю вам взглянуть на фрагмент исходников от Windows Vista, который опубликовал 1 апреля журнал PC World: надо признаться, что тут есть над чем задуматься: vista

Место солидарности беларусского ИТ-комьюнити

Далучайся!

Читайте также
10 курсов по C++ (июнь 2023)
10 курсов по C++ (июнь 2023)
10 курсов по C++ (июнь 2023)
С++, несмотря на свой солидный возраст, остается одним из основных языков программирования, который применется очень широко: от разработки ПО до создания игр. В сети много ресурсов, которые помогут освоить этот язык. Советуем обратить внимаение на подборку команды Digitaldefynd, котрую мы дополнили. В ней как платные, так и бесплатные ресурсы для людей с разным уровнем подготовки и знаний С++.
1 комментарий
DataCamp открывает безлимитный доступ к курсам за €69 в год
DataCamp открывает безлимитный доступ к курсам за €69 в год
DataCamp открывает безлимитный доступ к курсам за €69 в год
Windows 11 безнадёжно повреждает файлы на компьютерах с современными процессорами
Windows 11 безнадёжно повреждает файлы на компьютерах с современными процессорами
Windows 11 безнадёжно повреждает файлы на компьютерах с современными процессорами
2 комментария
Хуже Windows. Linux стала рекордсменом по росту числа вредоносов
Хуже Windows. Linux стала рекордсменом по росту числа вредоносов
Хуже Windows. Linux стала рекордсменом по росту числа вредоносов

Хотите сообщить важную новость? Пишите в Telegram-бот

Главные события и полезные ссылки в нашем Telegram-канале

Обсуждение
Комментируйте без ограничений

Релоцировались? Теперь вы можете комментировать без верификации аккаунта.

Комментариев пока нет.