Все помнят «Проблему 2000 года», когда компьютеры могли «сойти с ума», спутав 1900 с 2000 годом. Угроза нависла из-за того, что для экономии памяти с середины прошлого века многие программы сохраняли дату с помощью двух последних цифр года. Оказывается, вероятность «цифрового апокалипсиса» существует и сейчас. Он может «сбить» компьютерные сети, в том числе системы навигации, медоборудование и банкоматы. О грядущих угрозах в день программиста «Газете.Ru» рассказал директор Центра технологических конкурсов и олимпиад НИТУ МИСИС Даниил Ефимов.
Устраненные сбои
В мире информационных технологий существует понятие «Эра Unix» — это система отсчета времени, которая начинается с 1 января 1970 года 00:00:00 UTC.Такое решение было принято из-за дороговизны памяти компьютера и носителей информации в 1960-х годах. Программистам приходилось экономить на всем, включая хранение данных о времени. Количество секунд, прошедших с этого момента, стало основой для многих операционных систем (таких как Unix и его производные). Это упрощало вычисления, позволяя легко высчитывать промежутки времени. Но в дальнейшем привело к проблемам.
Одним из первых сигналов о возможных сбоях стал феномен, который назвали «Проблемой 2000 года» (или Y2K). В середине прошлого века многие программы сохраняли дату с помощью двух последних цифр года. Это вполне рациональное решение в условиях дефицита памяти. Однако стало ясно, что к 2000 году программы не смогут различить 1900 и 2000 годы. Все это могло привести к сбоям в важных системах, включая банковские, авиационные и медицинские.
Прогнозы о возможных последствиях Y2K звучали катастрофически: от отключения электростанций до поломок в авиации. Правительства по всему миру начали подготовку, создавая специальные комиссии для устранения потенциальных проблем.
«Большая часть этих опасений оказалась преувеличенной. Программисты, особенно специалисты по COBOL (COmmon Business-Oriented Language — один из старейших языков программирования), быстро адаптировали старые программы, увеличив разрядность полей даты и включив в них столетия. В результате «цифрового Армагеддона» удалось избежать. Ситуация показала, как важно своевременно реагировать на подобные вызовы», — рассказал «Газете.Ru» директор Центра технологических конкурсов и олимпиад НИТУ МИСИС Даниил Ефимов.
Новое тысячелетие, новые проблемы
В 2010-ом возникла похожая проблема — «Y2K+10».
«Произошла путаница между двоично-десятичным (BCD) и шестнадцатеричным кодированием чисел. Оба кодируют цифры от нуля до девяти как 0x0–0x9. А вот число 10 по-разному: BCD как 0x10, шестнадцатеричное кодирование — 0x0A, а 0x10 по нему представляет число 16. Некоторые системы неправильно распознавали 2010 год и отображали его как 2016», — объясняет Даниил Ефимов.
В результате некоторые sms-сообщения приходили с некорректной датой: вместо 2010 года указывался 2016-й. Сильнее всего сбои коснулись немецких банков, где у 20 миллионов карт перестали идентифицироваться чипы. У проблемы с картами было два пути решения: перенастройка терминалов и банкоматов по всей стране либо выдача новых карт с корректными чипами. Последний требовал много ресурсов, поэтому решили обновить ПО на десятках тысяч терминалов и банкоматов. Это заняло несколько недель.
Но впереди еще одна проблема, которая, как считают программисты, может заявить о себе в 2038 году.
«Проблема 2038 года касается 32-разрядных процессоров, которые могут хранить значение времени до определенного предела — 2147483647 секунд с начала «Эры Unix». Этот предел будет достигнут 19 января 2038 года в 03:14:07 (UTC), а потом системы, использующие 32-битные счетчики времени, вернутся к началу отсчета и начнут отображать отрицательные значения», — говорит Ефимов.
Это может привести к сбоям в работе банкоматов, медицинского оборудования, систем навигации и других важных устройств.
Впрочем, программисты уже придумали, как не допустить сбоя в 2038-м. Переход на 64-разрядные системы позволяет хранить большие значения времени — до 9223372036854775807 секунд. Это эквивалентно более чем 292 миллиардам лет.
Судные дни и невисокосный год
Еще одна проблема будущего связана с так называемыми «Днями 32,768 и 65,536». Программы, которые хранят даты как количество дней, прошедших с определенного времени (например, с 1 января 1900 года), подвержены переполнению при использовании 16-битных значений.
«В системах с 16-битными знаковыми (когда запоминается отрицательное или положительное число) числами переполнение происходит через 32,768 дней (2 в 15 степени, так как первый знак используется для хранения знака), что приводит к отрицательным значениям. Например, в некоторых системах это вызвало сбои 18 сентября 1989 года, когда отрицательные значения дней вызвали ошибки. Аналогично, 16-битные беззнаковые (то есть 2 в 16 степени, так как первый знак также используется для хранения числа) переменные могут переполняться через 65,536 дней, что приведет к обнулению значений», — объясняет Даниил Ефимов.
Для программ, которые отсчитывают дни с 1 января 1900 года, это произойдет 6 июня 2079 года, что может привести к сбоям в системах, использующих подобный способ хранения времени. Это тоже день возможного «цифрового апокалипсиса».
Есть и еще одна проблема, связанная также с вычислением времени. Она может возникнуть в 2100 году, который, вопреки ожиданиям, не будет високосным.
«Согласно правилам календаря, годы, кратные 100, не являются високосными, если не делятся на 400. Многие программные системы, использующие упрощенные алгоритмы для расчета високосных годов, могут неправильно рассчитать дату, добавив 29 февраля 2100 года, вместо того чтобы перейти на 1 марта», — считает Ефимов.
Это может вызвать сбои в операционных системах, календарях, финансовых системах и других сервисах, зависящих от правильного учета времени.
Невидимый фронт
С каждым годом программное и аппаратное обеспечение становится все сложнее, так как новые технологии требуют интеграции с уже существующими системами. Человечество продолжает использовать системы, созданные десятилетия назад, а их разработчики часто уже не принимают участие в их поддержке и модернизации.
Поэтому инженерам и программистам приходится не только поддерживать работу этих старых систем, но и ежедневно решать проблемы, которые изначально не были учтены при их создании, или которые оставались нерешенными из-за технологических ограничений того времени.
Одна из таких проблем — подсчет времени, от корректности которого зависят все автоматизированные системы в мире. Тем не менее программистам пока удается находить способы поддерживать стабильность и работоспособность всех этих систем.