Верите ли вы в волшебство? С логической точки зрения - конечно, нет! Программисты, разработчики - серьезные люди, с хорошим образованием и реалистичным взглядом на мир. Может вы и в детстве не любили сказки? Нет, я не буду больше отвечать за вас. Просто попрошу налить кружечку чая, почистить мандарин, взглянуть на снежинки за окном и только после этого начать читать эту Историю.
Перед вами рассказ о Злобном Баге. О том, как он неоднократно пытался испортить новогодние праздники. Часто ему удавалось воплотить свои коварные замыслы, но, к счастью, в каждой Сказке "злу" противостоит настоящее "добро".
17 декабря 1987 года студент немецкого университета Клаустал-Зеллерфилд, будучи еще совсем молодым программистом, решил оригинально поздравить своих друзей. Он отправил всем близким и дорогим рождественскую ель! Конечно, он не срубил ее в лесу и даже не купил в магазине. Не забывайте, наш герой - программист, поэтому он написал программу на языке REXX для VM/CMS, которая после запуска выводила на экран милую елочку и теплые поздравления.
Рисунок 1 - Программа Christmas Tree - елочка вирус
С благими намерениями и искренним желанием сделать добро писал код наш герой. Но Злобный Баг вклинился в процесс, произошла перегрузка сети и самовоспроизводящаяся программа Christmas на два дня парализовала работу частной почты IBM Vnet (цепочка: университетская сеть - EARN - BitNet - IBM-Vnet) по всему миру. Возникли сомнения: а не является ли герой - антигероем, а трогательное поздравление - вирусом? Доказать злой умысел автора программы Christmas Tree не удалось. Но без влияния Злобного Бага здесь точно не обошлось.
Рождество и Новый год - праздники, на которые принято дарить подарки. Красивые коробки под ёлкой или милые сувениры в рождественских носках, подвешенных у камина, - так выглядят традиционные новогодние подарки. Но особенно приятны сюрпризы.
Amazon - один из первых интернет-сервисов, на котором ежедневно продаются и покупаются десятки тысяч разнообразных товаров. Идеальное место для выбора подарков! Именно этим и занимались пользователи 12 декабря 2014 года. Особый ажиотаж вызвала потрясающая цена на тысячи товаров - всего 1 пенни (источник). Благодаря сервис за великолепный рождественский подарок, люди с особым энтузиазмом занялись покупками. А Злобный Баг ухмылялся в сторонке, ожидая реакции продавцов, еще не знающих о том, что они понесли огромные убытки.
Ошибка закралась в программное обеспечение RepricerExpress, отвечающее за синхронизацию цен в онлайн-магазинах. С его помощью продавцам проще конкурировать на рынке, оперативно реагируя на изменение цен аналогичных товаров.
Что сделал Злобный Баг? Он проник в RepricerExpress еще на этапе проектирования и тестирования, но не заявлял о себе до того момента, пока... Один из поставщиков, закрутившись в предпраздничной суете, случайно установил единую цену на весь свой ассортимент - 1 пенни. Программа приняла это значение за минимальное и снизила цену на товары других продавцов.
Причина такого поведения объясняется тем, что в ходе разработки пользовательского интерфейса не была предусмотрена возможность установки собственной минимальной цены на товар. Кроме того, через определенные временные промежутки происходила автозамена цены. При последующем обновлении баг был исправлен.
Рисунок 2 - Правильный интерфейс системы (появился столбец Your Minimum Price)
День, когда произошла данная ошибка, продавцы Amazon запомнят надолго. Они потеряли тысячи долларов, многие оказались на грани банкротства (источник). Если бы не оперативные меры Amazon, сумевшего аннулировать большую часть заказов, то репутация крупнейшего интернет-магазина была бы совершенно испорчена.
Разработчики RepricerExpress извинились за сбой ПО, опубликовав заявление в своем официальном блоге.
Помните фильм "Гринч - похититель Рождества"? Видимо, Злобный баг вдохновился его сюжетом, решив нанести удар "яблочным" девайсам. В феврале 2016 года владельцы техники Apple обнаружили занятный баг. В социальных сетях зародилась легенда о том, что если установить дату 1 января 1970 года, а затем выполнить перезагрузку устройства, то произойдет полный крах системы, а вместо смартфона или планшета у вас в руках окажется кирпич с эмблемой "яблочко". При этом возможности откатить действие нет. Были сведения о присутствии данной ошибки на устройствах с 64-битным процессором: Apple A7, A8, A8X, A9 и A9X: iPhone 5S и последующие, iPad Air и iPad Mini 2 и новее, а также 6-е поколение iPod Touch. Версия операционной системы значения не имела.
Нашлись ли желающие опытным путем проверить наличие бага? Несомненно! По всему миру прокатилась волна убийств гаджетов Apple. К счастью, умельцы нашли способ вернуть работоспособность "кирпичам". В Apple официальную причину ошибки не озвучили, но заявили о возможности такого бага, при ручной установке на iOS-устройстве дату в мае 1970 года или ранее.
Пользователи провели собственное расследование. В результате сформировалась следующая версия: к ошибке могла привести переменная с отрицательным значением, хранящая в себе время в формате UNIX. Почему это могло произойти?
Вариант 1. По причине того, что время представлено в UNIX-формате, начало отсчета ведется с 1 января 1970 года, т.е. является нулем. При изменении часового пояса, переменная может принять значение меньше нуля.
Вариант 2. Баг характерен для 64-х битных устройств, поэтому возможно, в первую очередь вычисляется 32-х битная метка времени, затем происходит смещение по часовому поясу, метка конвертируется в размер указателя, по этой причине старшие биты заполняются неверно и... Добро пожаловать в XXII век!
Продолжительный сон, не прерываемый звуком будильника, - разве это не мечта большинства из нас? iPhone - не Газпром, но исполняет мечты своих пользователей! Все те, кто хотел бодро начать новый 2013 год и поставил будильник на 1 января, благополучно проспали. Злобный баг явно замыслил ввести огромное количество пользователей в режим "спящей царевны", т.к. вплоть до 3 января будильник на iPhone не работал.
Apple снова решил отмолчаться. Но версия о причинах возникновения ошибки все равно распространилась. Для отображения года используется стандарт ISO week date, он широко применяется в финансовых организациях для удобства формирования отчетного (финансового) года. Его особенность состоит в том, что новый год считается новым только с той недели, которая содержит первый четверг года. Календарь в стандарте ISO week date содержит 52 или 53 недели (364 или 371 день). Таким образом, iPhone жил по старому году, а новый 2013 наступил только 7 января - с новой полной недели года.
Была и альтернативная версия, в которой в качестве Злобного бага выступал сам Стив Джобс. Якобы, основатель Apple любил спать, вот и придумал такую фичу. Конечно, это шутка. А вот последствия у такого, казалось бы, несерьезного бага оказались более чем неприятными: люди проспали работу, потеряли деньги, опоздали на важные встречи (Источник).
Цена ошибки в программном обеспечении - фактор, который разработчики никогда не должны игнорировать. Доказательство - в следующей предновогодней истории о баге.
12 декабря 2014 года в британском центре УВД Национальной службы воздушного движения Великобритании (NATS) произошел программный сбой. Работа части аэропортов, в том числе таких загруженных гигантов, как Хитроу, Гатвик, Станстед, Бирмингем, Кардифф и Глазго была остановлена. Усугубило проблему и время, которое Злобный баг выбрал для атаки - пятница, вторая половина дня, преддверие рождественских праздников.
Сбой длился чуть более получаса - 36 минут, но его последствия свидетельствуют о крайне высокой цене ошибки. Злобный баг постарался на славу:
Подобная ситуация не могла остаться без внимания. Было проведено расследование. Управление гражданской авиации (CAA) и NATS в заключительном отчете описывают баг в программном обеспечении System Flight Server (SFS). Этот сервер отвечает за то, чтобы в систему управления NATS в режиме реального времени поступали данные на контроллер рабочих станций. В системе существует два одинаковых SFS - работающий и запасной. Оба вычисляют одни и те же данные. При отключении основного SFS, в работу вступает запасной. Система работала при аппаратных сбоях, но по каким-то причинам ни на одном из серверов не была предусмотрена защита от программных исключений.
Максимальное количество одновременно функционирующих рабочих станций (мест управления полетами и наблюдения за ними) - 193. Теоретически. Фактически же в коде SFS прописано совершенно другое значение - 151. Поэтому, когда произошла попытка одновременного подключения 153 рабочих станций, началась перезагрузка и последующее "падение" системы. Позже выяснилось, что "скрытая неисправность программного обеспечения" была допущена еще в 1990 году. Удивительно, что она не проявилась раньше.
2000 год был одним из самых ожидаемых. Смена тысячелетия, по мнению ряда экспертов самых разных областей, непременно должна сопровождаться Концом света или, что не менее страшно - восстанием машин.
Чем же аргументировался страх перед Терминаторами? Логикой! Первые компьютеры были медлительны, поэтому, чтобы не тратить столь ценную производительность на пустяки, разработчики приняли решение использовать два знака представления кода в датах. Например, 23 марта 1991 года выглядело как 23.03.91. Визуально такое обозначение не "режет глаз", данный вариант записи даты кажется абсолютно привычным. Но с точки зрения компьютера все не так просто: 2000 год и 1900 получают одинаковое обозначение: 00. Таким образом, при наступлении 2000 года внутренние часы компьютера переведутся на 1900 год.
Последствия подобного сбоя представлялись крайне ужасными: выход из строя программ, самопроизвольный запуск ракет, обрушение финансового рынка. А самые страшные события должны были произойти в России, как в стране, наименее готовой к новому летоисчислению.
Но совсем скоро наступит уже 2017 год, а значит, Конец света не произошел.
Впрочем, некоторые сбои при смене тысячелетия все же произошли:
Некоторые баги были весьма забавны:
Проблема 2000 - это яркий пример того, как СМИ способны воздействовать на человечество. Следующей волны паники по аналогичному поводу стоит ожидать в 2038 году. 19 января 2038 года в 03:14:07 по Гринвичу компьютеры и другие устройства с 32-битной системой не смогут больше верно отсчитывать время. Многие вычислительные устройства отсчитывают системное время с 1 января 1970 года в секундах, используя 32-битное значение, а секунда хранятся в виде signed int (32-битного целого со знаком). В 2038 году наступит 2 147 483 648-я секунда, которую просто не будет возможности записать системой, и тогда счётчик примет отрицательное значение.
Как предотвратить системную ошибку? Заменить все 32-битные процессоры на 64-битные.
По традиции, Добро побеждает Зло, но борьба не прекращается ни на миг. Можно ли истребить всех Злобных багов? Скорее всего, нет, но вполне реально сделать так, чтобы их армия понесла значительный урон. Для этого программисты, сражающиеся за Добро, т.е. качественный код, должны ответственно подойти к выбору вспомогательных средств. Вооружайтесь статическим анализатором PVS-Studio! А также вы можете посмотреть хоррор-короткометражку о том, как Единорог PVS-Studio спасает Пингвина Linux от Злобного бага.
Вдохновились? Тогда предлагаем всем разработчикам помочь Добру! Команда PVS-Studio уже сделала значительный шаг в этом направлении, предложив бесплатную версию анализатора.
Уважаемые программисты, желаем вам удачи в Новом году и пусть ваши истории о Злобных багах всегда заканчиваются победой Добра!