Я думаю, многие уже слышали из новостей про небольшой и забавный скандальчик в мире «больших разработчиков», который (конечно же) не обошелся без участия 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: Поймите меня правильно: я не имею ничего против Индии, страны, которая уже на протяжении последних восьми лет демонстрирует один из самых быстрых в мире темпов роста зарплат в своей ИТ-сфере. Просто иногда, посмотрев на код, вы найдете чрезвычайно полезной возможность посмотреть прямо в глаза человеку, его писавшему (что само по себе может отмести 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 вроде этих: Интересно, что я не нашел в исходниках ни расистских намеков, ни упоминаний Билла Гейтса или самой 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: надо признаться, что тут есть над чем задуматься:
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.