Вы неправильно пишете животных

May 14, 2015 18:43

Автор - Milfgard, потащено с хабрахабра.

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

Не знаю, кто писал большую часть птиц, но я хочу обратить внимание на особенность, позволяющую провести инъекцию произвольного яйца в гнездо. Дело в том, что птица проверяет только расположение и количество яиц, но не их хэши. В 20% случаев кукушка, эксплуатирующая этот баг, может внести яйцо с сохранением контрольной суммы, чего вполне достаточно для повышения прав в гнезде.

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

Да, ещё о птицах, чтобы два раза не вставать. У них насквозь кривой модуль распознавания «свой-чужой». Что позволяет провести animal-in-the-middle-атаку с помощью подстановки звука птенца. Всё, что примерно совпадает по размерам и при этом передаёт открытую часть ключа, нужно покормить. Похожий баг есть у некоторых грызунов, что позволяет предположить проблемы с общей библиотечной функцией.

Теперь муравьи. Муравьёв довольно легко зациклить. Навигационный блок у них совмещён с системой приоритетов ОС, поэтому при построении циклического маршрута образуется «спираль смерти», затягивающая всё больше и больше ресурсов муравейника - и всё это зависает на 3-4 дня, пока муравьи не погибнут от истощения или что-то снаружи не поменяет навигацию.



А вот страус - вершина оптимизации. То, как именно в него впихнули пищеварение, вообще достойно войти в «Жемчужины программирования». Чтобы эта птичка нормально переваривала пищу, разработчик придумал заставить его натурально жрать камни. При беге камни трясутся и перемалывают зёрна. Теперь самое весёлое. Чтобы не писать отдельный код для поедания камней, страусу просто взяли и отключили центральный сектор зрения (как зайцу, но там это известный минорный баг). Поэтому когда страус целится в зерно, он попадает только в 30-50% случаев. Что легко позволяет набирать нужное количество камней, да ещё и с запасом. Именно поэтому страусы, запущенные на чистой виртуальной машине в зоопарке, испытывали проблемы с пищеварением до появления поддержки камней на уровне гипервизора. Кстати, коровы тоже жрут гвозди и иногда гравий, но это не в архитектуре, а просто техническая ошибка обратной совместимости.

Да, и ещё. Очень хорошая вещь - повторное использование кода. Часть функционала с камнями потом накатили на крокодила - чтобы ему нырялось лучше. Ныряется действительно лучше.

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

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

Медведь не всегда корректно выходит из hibernate-режима. Это же, кстати, касается некоторых растений, но там баг не так опасен. Растения легко перезапустить. И да, учитесь у тех, кто писал альбатроса. Альбатрос вообще спит в воздухе.

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

Белый медведь - отличный пример работы с солнечной энергией. Медведь прозрачный в УФ по меху и чёрный на коже. Это уже торжество инженера.

Жираф - сплошной костыль. Нет, в целом, понятно, что требования заказчика по высоте кроны несколько раз повышались по мере развития проекта. Но вот то, что вошло в релиз по водопоям и было пропущено на приёмке - это нонсенс. Жираф тупо не достаёт головой до воды(!) в обычном режиме. Ему приходится жутко вывернуться и почти сесть на шпагат, чтобы попить. Ясное дело, анонимусы-хищники этим нагло пользуются. Детёныша вообще пришлось укреплять - он в стабильном релизе падает с полутора метров при рождении.

Морской свинке и ряду рыб косо прописали задержки на прерываниях. Если обычное животное по очереди опрашивает прерывания вроде «нет ли опасности», «не надо ли попить», «не надо ли поесть», «не надо ли начать размножаться», «не надо ли лечь спать» и «не надо ли выполнять нестандартную процедуру» - и всё это без видимого переключения - то морские свинки делают sleep(1000); после каждой операции. Видимо, осталось с отладки и вошло в релиз.

Хорошей идеей было накатить код сборщика мусора в ОЗУ от золотой рыбки на белку - garbage collector с высокой вероятностью очищает и неиспользуемые указатели на места размеченных орехов и семечек. В результате благодаря белке вырастает много новых деревьев.

Вот индийскую кобру точно писал фанат Starcraft. Потому что, задумайтесь, где ещё можно встретить юнита, плюющегося ядом на два с половиной метра точно в глаз террану.

Ну и раз начали о нерациональности - вспомним того же осьминога. Километры нервной ткани просто потому, что кому-то было интересно написать его на brainfuck. Да если использовать эти отдельные модули управления присосками, ту же ткань - может получиться вообще ЦОД на колёсиках.

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

Тлей и других насекомых, а также ряд животных точно писал бешеный фанат рекурсии. Светлая мысль рождать некоторых уже беременными - просто вынос мозга для тестеров. Зато слонёнок деплоится 22 месяца - вот что значит не влезть в кэш процессора.

Кстати, пасхалка с бегемотом получилась смешная. Люди боятся львов, носорогов, змей - но только этот обаятельный толстяк целенаправленно бегает за человеком. И, внезапно, со скоростью до 30 км/ч. То есть догоняет даже велосипедистов.

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

У курицы расслабленная лапа «защёлкнута», поэтому если поставить курицу на ветку, дождаться, пока она уснёт, а потом легко и быстро перевернуть, сработает рефлекс - и у вас будет курица, спящая вниз головой на дереве. Главное - подготовить почву и рассказать всей деревне про вампиров за день до зрелища такого курятника.

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

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

P.S. Обратите внимание, что большая часть описанных уязвимостей до сих пор не исправлена.

Из комментариев:

bioskiller Ждем баглист человека :)

Goodkat Оптические сенсоры прикреплены не той стороной - матрица прикреплена чувствительной частью вовнутрь головы, а чтобы это хоть как-то работало, подложку со всей электроникой сделали прозрачной. Впрочем, в месте прикрепления разъёма для подключения к шине осталось слепое пятно.
Нерв отвечающий за голосовые функции и управление нижней челюстью идёт не напрямик от мозга к горлу, а сперва тянется к сердцу, а потом обратно. Впрочем, этот баг наблюдается у всех млекопитающих - видимо просто прокинули все нервы по одному кабель-каналу, когда проектировали рыб, а когда заказчик потребовал переделать проект под млекопитающих, просто нарастили нужный кабель - у того же жирафа он достигает четырёх метров.
Желудочно-кишечный тракт пересекается с дыхательными путями - в итоге человек может захлебнуться во время приёма пищи, а заказчику продали этот баг как фичу - возможность дышать ртом.
Ну и размещение органов размножения рядом с путями вывода отходов - явная недоработка.

vvzvlad Рядом? Они вообще их совместили! Потом начали добавлять костыли вроде промывки-продувки перед процессор размножения.

commanderxo Их есть у нас!

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

Каждый произносящий вслух слово «костыль» должен помнить, что нервный импульс при этом делает изрядный крюк из-за обратной совместимости с legacy-архитектурой доисторических рыб. У жирафа, с его шеей, длина костыля измеряется метрами.

kraidiky Я каждое утро вижу ребёнка, который точно так же внезапно обнаруживает у себя руку. :)
Это так забавно - видеть этапы обучения нейронной сети.

darthslider Иногда спишь неудобно как-нибудь, просыпаешься и так же обнаруживаешь НАСТОЯЩУЮ НОГУ или РУКУ. Правда шевелится она при этом не важно :D

Zenitchik Угу. И начинается квест с её подключением и устранением аппаратных сбоев

equand Кто писал утконоса?

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

Milfgard Кстати, знакомьтесь, этот человек демонстрировал данный баг in-the-wild без предупреждения сразу на CEO курятника. Атака получила название «Ряд убитых куриц».

image Click to view



hungry_ewok Этот баг у них глубоко в легаси сидит, еще с тех времен когда для предков-рептилий код писался. Похожий баг ушел в ветку земноводных - если лягушку по-турецки ее посадить, прислонив к вертикальной поверхности - так и будет сидеть…

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

mva вы её сначала переверните :)

Wyorma Вспомнилось.
Только для мужиков :)
Природа тоже делает ошибки, а потом топорно исправляет свои косяки.
По каким-то причинам получилось так, что температура созревания сперматозоидов должна быть около тридцати четырех градусов. А природе хочется ещё повысить температуру тела для ускорения метаболизма и получить преимущество в скорости. Ерунда, вынесем семенные железы за пределы тела и снабдим механизмом терморегуляции. Когда нужно убавить температуру, мошонка опускается - температура убавляется, мошонка прижимается к телу - температура поднимается. Всё просто, но возникает другая проблема - теперь мошонку вместе с содержимым легко может оторвать кто угодно. Ерунда, сделаем мошонку очень болезненной и теперь носитель будет трепетно оберегать её. Вуаля, теперь мучайтесь.

Yggaz Какапо обязательно нужно упомянуть.

Его летающие предки, очевидно, жили настолько недавно, что какапо все еще пытается летать, хотя уже не имеет средств, чтобы добиться успеха в этом начинании. По словам бессмертного Дугласа Адамса (в книге Last Chance to See), это чрезвычайно толстая птица. Взрослый какапо весит около шести или семи фунтов, а его крылья годны лишь для того, чтобы помахать ими немного для равновесия, когда ему кажется, что он может обо что-то споткнуться. Но о полете не может быть и речи. К сожалению, он, похоже, не только забыл, как летать, но и забыл, что он забыл, как летать. Сильно взволнованный какапо иногда вскарабкивается на дерево и прыгает оттуда, после чего он летит как кирпич и обрушивается на землю бесформенной грудой.

Похоже, не полностью вычистили код полёта, когда разрабатывали нелёта.

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

Ну и конечно, повторное использование кода. Знаменитый возвратный нерв гортани. Идёт от мозга, иннервирует стенку гортани. У всех млекопитающих проходит через стенку аорты или другой крупной артерии. У жирафа - в том числе (да-да, вниз по шее до аорты и вверх по шее до гортани). Здесь явно не провели рефакторинг вовремя.

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

vvzvlad Он уже раскомментирован, и присутствует в бинарнике. Более того, на это код тратятся ресурсы. Просто не используется.

Int_13h Функция есть, а вызовов нет. Сбой процессора, случайный джамп на неиспользуемый код - и все, крот видит :)

vmarunin Не-не-не. Там какой-то умник что-то понаписал в коде, что оно компилируется, но работать не может. Чуть вызов, так сразу эксепшен летит.
И в репозитории так перезаписали, такого наворотили, что назад уже и не вычистишь.
Но свой кусок памяти отжирает, свои треды запускает и ресурсы тратит. А выкинуть целиком пока не получается, по кусочку отщипывают, лет через 100000 должны дочистить.
Слава богу заказчик не замечает бага этой подсистемы.

kraidiky Вы забыли про куриц. Знаменитый костыль, курица не умеет клевать, она наводится на зерно после чего расслабляет шею и под действием внешнего кода движка голова сама падает куда надо. Главное хорошо прицелиться. Этот баг нефигово доставил космонавтам, которые для экспериментов вывели перепелиные яйца на орбиту и только там после вылупления обнаружили, что что эта пищащая мелочь не способна жрать без постороней помощи. Так до конца экспедиции из консоли и кормили каждого по отдельности. :)

nenastja Если посмотреть код, то неудивительно, что все так глючит, писали явно какие-то индусы, у прокариот еще как-то следят за исходниками, но у эукариот сплошной мусор и закомментированные куски. У млекопитающих зачем-то убрали функции, отвечающие за регенерацию конечностей, зато вот у человека оставили ген CCR5, у которого единственная значимая функция - способствовать проникновению вируса ВИЧ в клетки. Похоже, придется самим патчить.

aml С точки зрения SRE, люди вообще очень сложны в оперировании: документации нет, разработка велась по принципу «тяп-ляп и в продакшн». Багрепорты разработчик игнорирует, исходников не предоставил, фиксы приходится делать для каждого инстанса отдельно и вручную. Архитектура монолитная, интерфейсы между компонентами не специфицированы, замена глючных блоков в рантайме - вообще сплошная боль.

vmarunin Не надо про монолитные интерфейсы!
Лет 50 назад стали заменять комоненты. То основной гидронасос, то фильтры поменяют.
Гидравлическую жидкость можно слить с другого инстанса уже лет 200 как (180 точнее)
Идёт речь про перенос АЛУ+Память+сенсоры
Кое-какие железяки даже научились делать на ЧПУ.


За первоисточником и продолжениями - на habrahabr, я притомилась таскать ))

discovery, хочу всё знать, юмор

Previous post Next post
Up