В полночь первого января 1970 года началась «Эпоха Unix». В Unix и других POSIX-совместимых ОС приняли систему описания моментов времени. Но одновременно с новой эпохой у инженеров и разработчиков возникли новые проблемы. Одна из них — «Проблема 2038 года». Рассказываем, что это такое и ждёт ли нас «Апокалипсис» через 18 лет.
Минутка истории
Ошибка Y2K заключалась в следующем. В 1950-х и 60-х годах, когда создавался софт для первых компьютеров, разработчики отображали год в дате двумя последними цифрами. Для экономии ресурсов. Поэтому они переживали, что 1 января 2000 года компьютеры, отображающие новую дату «00», ошибочно решат, что это 1900 год.
Это звучало правдоподобно, и многие люди сделали бизнес на консультациях по этому вопросу. Вырос спрос на COBOL-разработчиков — им приходилось исправлять старые приложения. По мере приближения Миллениума люди готовились к глупым коммунальным платежам, гаснущим фонарям и падающим самолётам
В конце концов, появились Y2K-совместимые системы, и 2000 год начался почти без шума. Но «проблема 2038 года» немного сложнее.
Время Unix — это количество секунд, начиная с полуночи 1 января 1970 года. Отсчёт начался с 0, и любое значение времени или даты выражается числом секунд, следующих за 0. Так, значение 919642718 равно 919 642 718 секундам после 00:00:00 часов 1 января 1970 года. То есть воскресенью 16:18:38 21 февраля 1999 года.
Это удобный формат, потому что если вы вычтете любые два значения, то получите количество секунд — то есть разницу во времени — между ними. Так можно определить, сколько минут, часов, дней, месяцев или лет прошло между двумя любыми датами.
Старые 32-разрядные процессоры способны считать только до 2 147 483 647. Таким образом, 19 января 2038 года в 03:14:07 по Всемирному времени (UTC) они достигнут максимальной мощности.
Проблема 2038 года приведёт к тому, что часы на некоторых устройствах перестанут работать. По одной из теорий, время обернётся назад к «началу» и будет храниться в виде отрицательных чисел. И из-за того, как написан код, компьютеры будут интерпретировать это время как происходящее 13 декабря 1901 года, а не 19 января.
Всё не так плохо
Большинство компьютеров и смартфонов, сделанных в последнее время, 64-разрядные и могут содержать числа размером 9 223 372 036 854 775 807. То есть будут отсчитывать время до 292 277 026 596 года. Так что их основная часть (за исключением действительно старых) не пострадает.
Что касается банкоматов, медицинской и военной техники и прочего, то к 2038 году, вполне вероятно, большинство (если не все) 32-битных устройств не будут использовать. Им на замену придут более современные системы, которые не нужно исправлять. Главной головной болью может стать модернизация оборудования. Но инженеров есть ещё 18 лет, чтобы с ней справиться.
Не бейте копилочку!
Оплачивайте покупки частями без первого взноса с Minipay
Более 20 лет назад весь мир стоял на ушах в преддверии 2000 года. Наступали новый век и очередное тысячелетие — события из ряда вон выходящие сами по себе, символизирующие начало другой эпохи. Ощущения были необычные, хотя для истории и течения времени нет никакого значения, что там за цифры на выдуманных человеком календарях.
Millennium bug
В новостях тогда активно обсуждали новый феномен, не характерный для прошлого, — проблему 2000 года. В интернете, на телевидении и даже в газетах пугали грядущим цифровым апокалипсисом: все компьютеры после наступления нового года превратятся в тыкву. А заодно — и электроника, которая хоть как-то умеет считать время. Странно, но все было завязано на то, как компьютеры записывают дату — или, вернее, год. Для его обозначения использовалось всего две цифры: например, 97, 98, 99 и, наконец, 00. Это позволяло сократить объем хранимых данных, да и смысла в четырех символах не было.
Но для компьютера два нуля вовсе не означало 2000 год: он мог «подумать», что наступает 1900-й или просто 0-й. Так могли появиться очень «старые» дети, которым сразу после рождения стукнуло 100 лет, банки путались бы в платежах, а самолеты летели бы в непонятном направлении — опасались этого и всего чего угодно еще.
На решение проблемы, которую обрисовали задолго до ее наступления, якобы направили сотни миллиардов долларов (точной цифры никто не знает). Гипотетический (отчасти, потому что сбои все же наблюдались) баг смогли обойти, и никакого апокалипсиса не настало. Одни говорили, что все было потрачено не зря и что в противном случае мир перестал бы существовать. Другие указывали на то, что огромное количество электроники не было затронуто мероприятиями по обеспечению «поддержки 2000 года», но на ее работе это никак не сказалось.
С тех пор прошло более 20 лет, уже меньше отделяет нас от аналогичной напасти — проблемы 2038 года. Она отчасти походит на свою предшественницу тем, что вновь компьютерам может не хватить символов для записи дат и прошедшего времени, которое чаще считается машинами в секундах. Только говорят, что теперь все серьезнее. Так ли это на самом деле?
На заре современного компьютеростроения речь шла о 16-битных системах, способных хранить в своей памяти всего 65 536 значений. Это теперь компьютеры управляют практически всеми аспектами нашей жизни, а тогда они не были тесно интегрированы в нее. Позже распространение получили 32-битные системы, которые остались всерьез и надолго, однако не навсегда.
Время пойдет вспять после отметки 03:14:08.
Если говорить о подсчете времени, в распоряжении условного 32-битного «Скайнета» находится лишь 2 147 483 647 секунд, еще столько же — со знаком минус, но ими обычно нельзя воспользоваться. И вот эти секунды «закончатся» в 2038 году, так как отсчет ведется с 1970-го (со временем отсчета — «эпохами» — есть нюансы, так как «обычные» ПК, например, часто отсчитывают время с 1980 года; есть и другие исключения, продлевающие или укорачивающие время «жизни»). То есть 2 147 483 647 — максимальное число, которое умещается в 32-разрядной системе без «твиков».
Помните, в 2012 году отовсюду звучала песня Gangnam Style южнокорейского артиста PSY? Спустя пару лет композиция стала первой набравшей на YouTube более 2 млрд просмотров. И тогда проявился баг, напомнивший об ограниченных возможностях существующих систем (когда видеосервис только стартовал, казалось, что 32-битного поля более чем достаточно для счетчика просмотров).
В конце 2014 года оказалось, что счетчика не хватает. В начале декабря СМИ пестрели заголовками: «Хит Gangnam Style сломал YouTube». На самом деле все было не так, однако небольшой лаг в подсчетах все же случился — какие-то 5 млн просмотров. Само собой, в YouTube прогнозировали события, поэтому начали модернизировать систему заранее, переведя ее на платформу с поддержкой 64-битных типов данных. Над этим команда инженеров начала работать еще осенью 2014 года, увеличив максимально возможное количество просмотров до 9,22 квинтильона.
История с Gangnam Style — наглядный пример того, чем грозит 2038 год, если не предпринимать хотя бы минимальных усилий. 64-битные процессоры и соответствующее программное обеспечение для него стали мейнстримом давно: даже Windows XP успела перейти на 64 бита, а с 2011 года аналогичным путем двинулась Apple с ее настольной ОС. Однако в строю остается немало систем, не отвечающих новым требованиям, да и наверняка к тому времени останется кучка пользователей «древней» электроники.
Какие конкретно есть угрозы
GPS
Чаще всего вспоминают системы GPS, которые полностью завязаны на время и транслируют его. Существует миф, что спутники и управляющие системы в 2038 году могут выйти из строя, потянув за собой все остальное. Да, отсчет времени для GPS ведется как раз с 1980 года, однако он происходит по неделям и секундам в каждой из них. Более того, каждые 19,7 года (или 1024 недели) наступает событие GPS week number rollover, когда отсчет начинается заново: 10-битного значения достаточно для хранения информации только о 1023 неделях. Следующий сброс запланирован как раз на 2038 год (а прошлый состоялся в 2019-м).
Более того, современные устройства перешли на более совершенную систему, которая использует для хранения информации о неделях 13 бит, что позволяет считать недели без каких-либо проблем до 2137 года. Что касается конечного оборудования, здесь все кроется в своевременном обновлении ПО, а это зависит от его поставщиков и производителей. Ранее из-за запоздавшей реакции пострадали некоторые аэропорты, научное оборудование, системы слежения за погодой, бытовые GPS-навигаторы и даже старые iPhone и iPad. То есть основная проблема кроется в неправильной обработке данных о времени на конечном устройстве.
Для ГЛОНАСС эта проблема вовсе не характерна, а у других спутниковых систем «запас» времени иссякнет нескоро — лет через 50.
Компьютеры, смартфоны, базы данных и ПО
Сейчас сложнее найти новое устройство, которое работало бы на 32-битных платформах: все давно переходят на 64-битные, не остаются в стороне и мобильные девайсы.
Однако проблема не столько кроется в железе и операционных системах (отдельные 32-битные, которые могут использовать 64-битный тип данных для хранения времени, либо беззнаковые 32-битные, где это возможно), сколько касается прикладного ПО, встраиваемых систем, коммуникационных протоколов (NTP, например), баз данных, файловых систем, драйверов и остального. На условном 64-битном компьютере можно запускать 32-битное приложение, не совместимое с проблемой 2038 года, да и 64-битная программа может быть собрана «криво».
Теперь популярна и концепция интернета вещей, которая может стать одним из слабых звеньев цепи, если разработчики не предусмотрят все нюансы. Не исключено, что их пока будут частично игнорировать из-за желания сэкономить, снизив затраты на разработку и комплектующие. Так что в 2038-м «кое-какие» проблемы все же будут.
Для обхода может использоваться адаптация «несовместимого» кода. Это касается, например, баз данных, в которых возможно записывать даты в «правильном» формате — просто потребуется немного работы инженеров и больше дискового пространства (в четыре раза больше, если быть точнее). В прошлом это было серьезным ограничением, однако ныне это уже менее актуально.
ПО можно перекомпилировать (если, конечно, не утеряны исходники оригинального кода), остается и вопрос внутренней совместимости. Доступен переход на новые решения, но в некоторых случаях потребуется время. Представьте, как компания с 10 тыс. сотрудников запускает новый почтовый сервер с новым клиентом: надо все перенести, «отформатировать», как полагается, и объяснить, как с этим работать. Или системы видеонаблюдения с десятками тысяч камер и гигабайтами логов…
Проблема 2038 года считается реальной, однако лишь в случае бездействия. Аналогия — здоровье, которое пошатнулось от неправильного образа жизни, поддающегося корректировке. Наибольшие опасения у некоторых специалистов вызывают именно встраиваемые системы. Это касается автомобильных компьютеров, кондиционеров, систем видеонаблюдения, роутеров, да даже холодильников, электроника которых должна работать все время их существования.
Часть профессионального сообщества считает Y2K bug более серьезным, нежели грядущий в 2038-м — потому что тогда решение не было столь очевидным. В то же время через 17 лет компьютеры будут распространены куда шире, чем 21 год назад, и их будет в разы больше. Поэтому другая часть ждет восстания машин.
Читайте также:
- Кто кого? Ноутбук MagicBook View 14 против MacBook на M1
- Омикрон создали биохакеры, «непонятные» лаборатории и мыши? Что сейчас известно о новом штамме коронавируса
Наш канал в Telegram. Присоединяйтесь!
Есть о чем рассказать? Пишите в наш телеграм-бот. Это анонимно и быстро
Перепечатка текста и фотографий Onlíner без разрешения редакции запрещена. ng@onliner.by
From Wikipedia, the free encyclopedia
An animated visual of the bug in action. The overflow error will occur at 03:14:08 UTC on 19 January 2038.
The year 2038 problem (also known as Y2038,[1] Y2K38, Y2K38 superbug or the Epochalypse[2][3]) is a time formatting bug in computer systems with representing times after 03:14:07 UTC on 19 January 2038.
The problem exists in systems which measure Unix time – the number of seconds elapsed since the Unix epoch (00:00:00 UTC on 1 January 1970) – and store it in a signed 32-bit integer. The data type is only capable of representing integers between −(231) and 231 − 1, meaning the latest time that can be properly encoded is 231 − 1 seconds after epoch (03:14:07 UTC on 19 January 2038). Attempting to increment to the following second (03:14:08) will cause the integer to overflow, setting its value to −(231) which systems will interpret as 231 seconds before epoch (20:45:52 UTC on 13 December 1901). The problem is similar in nature to the year 2000 problem.
Computer systems that use time for critical computations may encounter fatal errors if the Y2038 problem is not addressed. Some applications that use future dates have already encountered the bug. The most vulnerable systems are those which are infrequently or never updated, such as legacy and embedded systems. There is no universal solution to the problem, though many modern systems have been upgraded to measure Unix time with signed 64-bit integers which will not overflow for 292 billion years—approximately 21 times the estimated age of the universe.
Cause[edit]
Many computer systems measure time and date as Unix time, an international standard for digital timekeeping. Unix time is defined as the number of seconds elapsed since 00:00:00 UTC on 1 January 1970 (an arbitrarily chosen time), which has been dubbed the Unix epoch.[4]
Unix time has historically been encoded as a signed 32-bit integer, a data type composed of 32 binary digits (bits) which represent an integer value, with ‘signed’ meaning that the number is stored in Two’s complement format. Thus, a signed 32-bit integer can only represent integer values from −(231) to 231 − 1 inclusive. Consequently, if a signed 32-bit integer is used to store Unix time, the latest time that can be stored is 231 − 1 (2,147,483,647) seconds after epoch, which is 03:14:07 on Tuesday, 19 January 2038.[5] Systems that attempt to increment this value by one more second to 231 seconds after epoch (03:14:08) will suffer integer overflow, inadvertently flipping the sign bit to indicate a negative number. This changes the integer value to −(231), or 231 seconds before epoch rather than after, which systems will interpret as 20:45:52 on Friday, 13 December 1901. From here, systems will continue to count up, toward zero, and then up through the positive integers again. As many computer systems use time computations to run critical functions, the bug may introduce fatal errors.
Vulnerable systems[edit]
Any system using data structures with 32-bit time representations has an inherent risk to fail. A full list of these data structures is virtually impossible to derive, but there are well-known data structures that have the Unix time problem:
- File systems (many file systems use only 32 bits to represent times in inodes)
- Binary file formats (that use 32-bit time fields)
- Databases (that have 32-bit time fields)
- Database query languages (such as SQL) that have
UNIX_TIMESTAMP()
-like commands
Embedded systems[edit]
Embedded systems that use dates for either computation or diagnostic logging are most likely to be affected by the Y2038 problem.[1] Despite the modern 18–24 month generational update in computer systems technology, embedded systems are designed to last the lifetime of the machine in which they are a component. It is conceivable that some of these systems may still be in use in 2038. It may be impractical or, in some cases, impossible to upgrade the software running these systems, ultimately requiring replacement if the 32-bit limitations are to be corrected.
Many transportation systems from flight to automobiles use embedded systems extensively. In automotive systems, this may include anti-lock braking system (ABS), electronic stability control (ESC/ESP), traction control (TCS) and automatic four-wheel drive; aircraft may use inertial guidance systems and GPS receivers.[a] Another major use of embedded systems is in communications devices, including cell phones and Internet-enabled appliances (e.g. routers, wireless access points, IP cameras) which rely on storing an accurate time and date and are increasingly based on Unix-like operating systems. For example, the Y2038 problem makes some devices running 32-bit Android crash and not restart when the time is changed to that date.[6]
However, this does not imply that all embedded systems will suffer from the Y2038 problem, since many such systems do not require access to dates. For those that do, those systems which only track the difference between times/dates and not absolute times/dates will, by the nature of the calculation, not experience a major problem. This is the case for automotive diagnostics based on legislated standards such as CARB (California Air Resources Board).[7]
Early problems[edit]
In May 2006, reports surfaced of an early manifestation of the Y2038 problem in the AOLserver software. The software was designed with a kludge to handle a database request that should «never» time out. Rather than specifically handling this special case, the initial design simply specified an arbitrary time-out date in the future. The default configuration for the server specified that the request should time out after one billion seconds. One billion seconds (just over 31 years, 251 days, 1 hour, 46 minutes and 40 seconds) after 01:27:28 UTC on 13 May 2006 is beyond the 2038 cutoff date. Thus, after this time, the time-out calculation overflowed and returned a date that was actually in the past, causing the software to crash. When the problem was discovered, AOLServer operators had to edit the configuration file and set the time-out to a lower value.[8][9]
Solutions [edit]
There is no universal solution for the Year 2038 problem. For example, in the C language, any change to the definition of the time_t
data type would result in code-compatibility problems in any application in which date and time representations are dependent on the nature of the signed 32-bit time_t
integer. For example, changing time_t
to an unsigned 32-bit integer, which would extend the range to 2106 (specifically, 06:28:15 UTC on Sunday, 7 February 2106), would adversely affect programs that store, retrieve, or manipulate dates prior to 1970, as such dates are represented by negative numbers. Increasing the size of the time_t
type to 64 bits in an existing system would cause incompatible changes to the layout of structures and the binary interface of functions.
Most operating systems designed to run on 64-bit hardware already use signed 64-bit time_t
integers. Using a signed 64-bit value introduces a new wraparound date that is over twenty times greater than the estimated age of the universe: approximately 292 billion years from now.[10] The ability to make computations on dates is limited by the fact that tm_year
uses a signed 32-bit integer value starting at 1900 for the year. This limits the year to a maximum of 2,147,485,547 (2,147,483,647 + 1900).[11]
Alternative proposals have been made (some of which are already in use), such as storing either milliseconds or microseconds since an epoch (typically either 1 January 1970 or 1 January 2000) in a signed 64-bit integer, providing a minimum range of 300,000 years at microsecond resolution.[12][13] In particular, Java’s use of 64-bit long integers everywhere to represent time as «milliseconds since 1 January 1970» will work correctly for the next 292 million years. Other proposals for new time representations provide different precisions, ranges, and sizes (almost always wider than 32 bits), as well as solving other related problems, such as the handling of leap seconds. In particular, TAI64[14] is an implementation of the International Atomic Time (TAI) standard, the current international real-time standard for defining a second and frame of reference.
Implemented solutions[edit]
- Starting with Ruby version 1.9.2, the bug with year 2038 is fixed,[15] by re-implementing time to have no minimum or maximum.[16]
- Starting with NetBSD version 6.0 (released in October 2012), the NetBSD operating system uses a 64-bit
time_t
for both 32-bit and 64-bit architectures. Applications that were compiled for an older NetBSD release with 32-bittime_t
are supported via a binary compatibility layer, but such older applications will still suffer from the Y2038 problem.[17] - OpenBSD since version 5.5, released in May 2014, also uses a 64-bit
time_t
for both 32-bit and 64-bit architectures. In contrast to NetBSD, there is no binary compatibility layer. Therefore, applications expecting a 32-bittime_t
and applications using anything different fromtime_t
to store time values may break.[18] - Linux originally used a 64-bit
time_t
for 64-bit architectures only; the pure 32-bit ABI was not changed due to backward compatibility.[19] Starting with version 5.6 of 2020, 64-bittime_t
is supported on 32-bit architectures, too. This was done primarily for the sake of embedded Linux systems.[20] - FreeBSD uses 64-bit
time_t
for all 32-bit and 64-bit architectures except 32-bit i386, which uses signed 32-bittime_t
instead.[21] - The x32 ABI for Linux (which defines an environment for programs with 32-bit addresses but running the processor in 64-bit mode) uses a 64-bit
time_t
. Since it was a new environment, there was no need for special compatibility precautions.[19] - Network File System version 4 has defined its time fields as
struct nfstime4 {int64_t seconds; uint32_t nseconds;}
since December 2000.[22] Values greater than zero for the seconds field denote dates after the 0-hour, January 1, 1970. Values less than zero for the seconds field denote dates before the 0-hour, January 1, 1970. In both cases, the nseconds (nanoseconds) field is to be added to the seconds field for the final time representation. - The ext4 filesystem, when used with inode sizes larger than 128 bytes, has an extra 32-bit field per timestamp, of which 30 bits are used for the nanoseconds part of the timestamp, and the other 2 bits are used to extend the timestamp range to the year 2446.[23]
- The XFS filesystem, starting with Linux 5.10, has an optional «big timestamps» feature which extends the timestamp range to the year 2486.[24]
- While the native APIs of OpenVMS can support timestamps up to 31 July 31086,[25] the C runtime library (CRTL) uses 32-bit integers for
time_t
.[26] As part of Y2K compliance work that was carried out in 1998, the CRTL was modified to use unsigned 32-bit integers to represent time; extending the range oftime_t
up to 7 February 2106.[27] - As of MySQL 8.0.28, the functions
FROM_UNIXTIME()
,UNIX_TIMESTAMP()
, andCONVERT_TZ()
handle 64-bit values on platforms that support them. This includes 64-bit versions of Linux, MacOS, and Windows.[28] In relational database versions prior to August 2021, built-in functions likeUNIX_TIMESTAMP()
will return 0 after 03:14:07 UTC on 19 January 2038.[29]
See also[edit]
- Year 2000 problem, a similar problem that occurred with a rollover in years
- Time formatting and storage bugs lists other similar problems, often caused by rollover similar to the cause of this year 2038 problem.
- A GPS week number rollover will coincidentally happen later in 2038, for a different reason than this year 2038 problem.
Notes[edit]
- ^ GPS suffers its own time counter overflow problem known as GPS Week Number Rollover.
References[edit]
- ^ a b «Is the Year 2038 problem the new Y2K bug?». The Guardian. 17 December 2014. Retrieved 11 October 2018.
- ^ Bergmann, Arnd (6 February 2020). «The end of an Era». Linaro.
- ^ Wagenseil, Paul (28 July 2017). «Digital ‘Epochalypse’ Could Bring World to Grinding Halt». Tom’s Guide.
- ^ «Epoch Time». unixtutoria. Retrieved 13 April 2023.
- ^ Diomidis Spinellis (2006). Code quality: the open source perspective. Effective software development series in Safari Books Online (illustrated ed.). Adobe Press. p. 49. ISBN 978-0-321-16607-4.
- ^ «ZTE Blade running Android 2.2 has 2038 problems». Retrieved 20 November 2018.
- ^ «ARB Test Methods / Procedures». ARB.ca.gov. California Air Resources Board. Archived from the original on 18 November 2016. Retrieved 12 September 2013.
- ^ «The Future Lies Ahead». 28 June 2006. Retrieved 19 November 2006.
- ^ Weird «memory leak» problem in AOLserver 3.4.2/3.x 12 May 2006
- ^ «When does the 64-bit Unix time_t really end?». Retrieved 24 September 2022.
- ^ Felts, Bob (17 April 2010). «The End of Time». Stablecross.com. Retrieved 19 March 2012.
- ^ «Unununium Time». Archived from the original on 8 April 2006. Retrieved 19 November 2006.
- ^ Sun Microsystems. «Java API documentation for System.currentTimeMillis()». Retrieved 29 September 2017.
- ^ «TAI64».
- ^ «Ruby 1.9.2 is released». 18 August 2010. Retrieved 1 April 2022.
- ^ «Ruby 1.9.2 preview 1 released». www.ruby-lang.org. Retrieved 22 March 2023.
- ^ «Announcing NetBSD 6.0». 17 October 2012. Retrieved 18 January 2016.
- ^ «OpenBSD 5.5 released (May 1, 2014)». 1 May 2014. Retrieved 18 January 2016.
- ^ a b Jonathan Corbet (14 August 2013). «Pondering 2038». LWN.net. Archived from the original on 4 March 2016. Retrieved 9 March 2016.
- ^ «LKML: Arnd Bergmann: [GIT PULL] y2038: core, driver and file system changes». lkml.org. Retrieved 30 January 2020.
- ^ «arch». www.freebsd.org.
- ^ Haynes, Thomas; Noveck, David, eds. (March 2015). «Structured Data Types». Network File System (NFS) Version 4 Protocol. sec. 2.2. doi:10.17487/RFC7530. RFC 7530.
- ^ «ext4 Data Structures and Algorithms». Retrieved 13 September 2022.
- ^ Michael Larabel (15 October 2020). «XFS File-System With Linux 5.10 Punts Year 2038 Problem To The Year 2486». Phoronix. Retrieved 13 September 2022.
- ^ «Why is Wednesday, November 17, 1858 the base time for OpenVMS (VAX VMS)?». Stanford University. 24 July 1997. Archived from the original on 24 July 1997. Retrieved 8 January 2020.
- ^ «VSI C Run-Time Library Reference Manual for OpenVMS Systems» (PDF). VSI. November 2020. Retrieved 17 April 2021.
- ^ «OpenVMS and the year 2038». HP. Retrieved 17 April 2021.
- ^ «What Is New in MySQL 8.0». dev.mysql.com.
- ^ «MySQL Bugs: #12654: 64-bit unix timestamp is not supported in MySQL functions». bugs.mysql.com.
External links[edit]
- Y2038 Proofness Design glibc Wiki
- Entry in How Stuff Works
- The Project 2038 Frequently Asked Questions
- Critical and Significant Dates 2038
- A 2038-safe replacement for time.h on 32 bit systems
- Baraniuk, Chris (5 May 2015). «The number glitch that can lead to catastrophe». BBC Future.
- Clewett, James. «2,147,483,647 – The End of Time [Unix]». Numberphile. Brady Haran. Archived from the original on 22 May 2017. Retrieved 7 April 2013.
Проблема 2038 года, ее еще называют Unix Millennium bug или Y2K38. Что это такое и почему она возникнет?
Смотрите видео, посвященное проблеме 2038 года
19 января 2038 года или на кануне этой даты могут произойти сбои в различном программном обеспечении.
Почему
Время и дату в компьютерных программах можно хранить по разному. Один из способов хранения даты — это использование стандарта POSIX (UNIX timestamp, Unix epoch).
В стандарте POSIX время записывается как количество секунд, прошедших с 0 часов 0 минут 0 секунд 1 января 1970 года по Всемирному времени (UTC). Для Unix-подобных операционных систем — это стандарт представления времени.
Дата в таком формате записывается как обычное целое число — число секунд. Очевидно, что чем позднее дата от даты 1 января 1970, тем больше секунд прошло с этой даты. Значит тем большее значение нужно сохранять в программах, использующие даты.
Например:
Для 01.01.1970 00:00:05 это число +5 (сек).
Для 31.08.1970 12:10:33 это число +20952633 (сек).
Для 19.01.2038 00:00:00 это число +2147472000 (сек).
Для 19.01.2038 03:14:07 это число +2147483647 (сек).
В старых программах (а иногда даже в новых) дата часто хранится в целочисленном 32-х битном знаковом формате — signed int. Это означает, что под число выделяется 32 бита:
00000000 00000000 00000000 00000000
- Первый бит (выделен красным), служит для определения знака числа. Значение 0 соответствует +, а значение 1 соответствует —).
- 31 бит (выделены синим) для хранения значения самого числа.
Максимальное число, которое можно сохранить, используя 31 бит, это число 2147483647. В 32-х битном знаковом целочисленном формате записывается оно следующим образом:
01111111 11111111 11111111 11111111
В POSIX это число соответствует дате 19.01.2038 03:14:07. Как видим, это и есть «роковое» 19 января 2038 года.
Что произойдет 19 января 2038
Могут произойти сбои программного обеспечения различной степени серьезности, могут произойти потери данных, программы могут начать работать не так, как ожидается.
Что будет внутри программ
Рассмотрим, что именно произойдет внутри программ. Числа больше 2147483647 не влезают в 31-бит.
Например, для числа 2147483647+1= 2147483648 нужно уже 32 бита. Это число записывается в двоичной системе, как единица в старшем разряде и 31 ноль:
10000000 00000000 00000000 00000000
Для 32-х битного типа signed integer — это число соответствует числу: −2147483648. Как было сказано выше, 1 в первом разряде обозначает отрицательное число.
Получается, что числа больше 2147483647 уже нельзя записать в 31 бит, но так как у нас есть еще один бит для хранения знака, программа запишет эти числа в память, но в программе они будут трактоваться как отрицательные числа.
Происходит как бы зацикливание числа. Если говорить о количестве секунд, увеличивающихся на 1, то они достигают значения 2147483647, а потом переходят в отрицательную область: −2147483648, −2147483647, −2147483646 и т.д. В программах такие числа будут трактоваться как 1970-й или 1901-й год (зависит от реализации).
Как это повлияет на работу программ
Все зависит от того, насколько дата и время важны в конкретной программе. Если работа программы зависит от времени, то скорее всего могут произойти сбои в работе программы или потери данных.
Например, если в табличных данных используется сортировка по времени, а для новых данных оно будет трактоваться, как отрицательное число, то эти данные будут трактоваться как старые данные, и сортировка будет нарушена.
Или, например, если программа очищает, какие-нибудь данные спустя определенное время, то при неверной трактовки времени, могут быть удалены еще актуальные данные.
Получается, что, чем больше работа программа зависит от времени, хранимого 32-х битном типе signed integer, то тем серьезнее могут быть последствия.
Так ли все серьезно
И да и нет. На самом деле — да!
Современные 64-х разрядные системы не подвержены данное проблеме, поэтому на них она никак не повлияет.
Для существующих 32-разрядных программ и систем уже выпущено множество патчей для исправления данной проблемы. Например, Microsoft, как он утверждает, уже обнаружил и исправил проблемы в 32-х разрядных версиях Windows.
Но все программы не исправить, поэтому многие из них остаются в зоне риска. Более того, даже сейчас выпускается множество 32-х битных систем, особенно встраиваемых.
Наибольшую опасность здесь представляет программное обеспечение, которое используется в промышленных областях. Для управления станками, машинами, отвечает за работу заводов, электростанций, медицинских приборов, военных устройств и других важных объектов.
Поэтому, если не предпринимать никаких действий, то последствия проблемы 2038 года могут от смешных до катастрофических.
Конечно, до 2038 года еще много времени и многие из них будут заменены на новые. Но все мы знаем, как быстро идет время, поэтому расслабляться не стоит. Более того, есть программы, которые уже сейчас могут использовать даты в будущем. Проблемы в таких программах могут начаться намного раньше.
Время на прочтение
4 мин
Количество просмотров 41K
Порой кажется, что на фронте борьбы с проблемой 2038 года наступило относительное затишье. Однако время идет, и тот день, когда 32-битные значения типа time_t больше не смогут корректно отображать даты, наступит уже меньше чем через 21 год. Этот срок может показаться большим, однако сравнительно долгий жизненный цикл многих встраиваемых систем подразумевает, что некоторые из них, будучи введенными в строй в наше время, все еще будут работать, когда наступит критический момент. Арнд Бергманн — один из основных разработчиков, занимающихся этой проблемой. На конференции Linaro Connect 2017 он поделился новостями о текущем положении дел в этой области.
Согласно Бергманну, работа ведется сразу в трех независимых направлениях, первое из которых — само ядро Linux. В течение последних пяти лет он искал способы подготовить ядро к 2038 году. Значительная часть этой работы подразумевает конвертирование 32-битных меток времени (timestamps) в 64-битные значения — даже на 32-битных системах. Некоторые 32-битные метки времени также используются в пользовательских API, что значительно усложняет проблему. У Бергманна есть план по улучшению таких API за счет приспособленных к 2038 году версий проблемных системных вызовов, но эти изменения еще не были применены, за исключением недавно добавленного системного вызова statx() в версии 4.11, которыйзаменит семейство вызовов stat(). В то же время остается немало других системных вызовов, нуждающихся в такой замене.
Дипа Динамани также занимается решением проблем, связанных с ядром. Она начинала в качестве стажера по программе Outreachy и по окончании стажировки продолжила работать над этой задачей. Динамани решила одну из самых сложных проблем, разработав собственный набор патчей для прослойки виртуальной файловой системы, и также планирует заняться другими системными вызовами. Вызов setsockopt(), среди прочих, может представлять особую трудность: его не так-то легко поправить или эмулировать на уровне glibc. Заметный прогресс есть в работе по созданию патчей для модуля device mapper и подсистемы ввода. Бергманн также написал патч для подсистемы video4linux, но он был отклонён и требует другого подхода. Примерно так же обстоят дела со звуковой подсистемой. Другими проблемными компонентами ядра являются система управления ключами и часы реального времени.
Некоторые системные вызовы не получат замены, поскольку для них лучшим решением оказывается эмуляция в библиотеках C — это второе направление в подготовке к 2038 году. Бергманн отметил, что сообщество glibc проделало особенно большую работу в этой области. На уровне библиотек планируется обеспечить полную обратную совместимость. Это означает, что можно будет собирать программы как с 32-битными, так и с 64-битными метками времени, при этом последние можно использовать даже в старых версиях ядра. Другими словами, разработчики glibc ищут решения, которые бы работали на всех платформах и с минимальными искажениями. (Подробности можно узнать из черновика проекта).
Третье направление связано со сборками дистрибутивов, причем настоящий прогресс здесь возможен только после того, как будут решены первые две задачи. По мнению Бергманна, маловероятно, что авторы дистрибутивов все еще будут поддерживать 32-битные системы в 2038 году, так что у них нет причин для беспокойства. Единственным исключением может стать дистрибутив Debian, авторы которого, похоже, заинтересованы в продолжении поддержки, даже несмотря на очевидную трудоемкость этого процесса. В какой-то момент может потребоваться полная пересборка, что едва ли обрадует как авторов, так и пользователей, но это решение, по крайней мере, гарантированно работает. В такой системе ключевым условием является обеспечение совместимости; сейчас в эксплуатацию вводится код, который может быть не приспособлен к наступлению 2038 года, но хочется, чтобы он, по возможности, работал и дальше.
Автомобильные системы — еще одна большая проблемная область. Многие устройства, например мобильные телефоны, перестанут работать к 2038 году по многим другим причинам, так что нет смысла готовить их к его наступлению. Однако автомобили находятся в эксплуатации гораздо дольше. В ходу по-прежнему могут быть камеры, и очень вероятно, что будет существовать множество тесно интегрируемых систем, например, в инфраструктуре зданий. Некоторые из таких систем подвергнутся сбоям в 2038 году. Вот почему так важно решить проблему как можно скорее.
В то же время с исправлением некоторых компонентов возникнут трудности, даже когда задачи по подготовке ядра, библиотек C и дистрибутивов будут в основном решены. Многие из этих трудностей связаны с использованием 32-битных значений типа time_t в форматах файлов. Например, cpio сломается, что вызовет определенные проблемы, так как он используется в формате RPM-пакетов. В файловых системах NFSv3, ext3 и XFS тоже будут наблюдаться сбои из-за использования 32-битных меток времени. Первые две системы, вероятно, выйдут из употребления задолго до начала 2038 года, а для XFS уже разрабатываются варианты решений. Наконец, есть множество приложений, пока не попавших в поле зрения разработчиков, а также корпоративных систем, к которым у сообщества нет доступа.
Когда Бергманна спросили, какими инструментами он пользуется в своей работе, он ответил, что основной подход заключается в сборке ядра с полностью удаленными 32-битными типами, отвечающими за представление времени: так можно сразу выявить места, подлежащие правке. В остальном же исправления осуществляются по большей части вручную. Предполагается, что плагины для sparse или GCC могут помочь в решении этой задачи.
В конце выступления Джон Шульц спросил, могут ли наработки сообщества BSD, которое (в некоторых версиях) уже решило проблему 2038 года, помочь Linux. Бергманн ответил, что помощь будет «незначительной». У BSD-дистрибутивов есть то преимущество, что они могут пересобраться с нуля, так что у них нет необходимости поддерживать совместимость с пользовательскими ABI тем же способом. Их опыт по подготовке приложений к 2038 году не лишен ценности, но неизвестно, насколько полезным он окажется для сообщества Linux.
Примечание команды PVS-Studio. Нас заинтересовала эта проблема и мы планируем реализовать в анализаторе PVS-Studio диагностику, которая будет предупреждать об использовании 32-битных переменных типа time_t. Оригинал данной статьи был опубликован на сайте lwn.net (CC-SA license).