微软exchangeserver中的bug( 三 )


千年虫导致新生儿被登记为百岁老人 。丹麦的第一名“千禧婴儿”刚刚降生就被医院计算机登记为百岁老人 。德国德意志歌剧院的计算机系统在2000年1月1日将日期跳转回1900年 , 导致所有员工及其子女的年龄都发生了巨大变化 。1990年出生的小朋友瞬间迎来90岁高龄 , 并导致不少员工无法正常收取由政府直接在工资中发放的儿童抚育补贴 。
完全没用、又不能退货的“千年虫生存包” 。借着全球各地对千年虫大灾难的恐惧心理 , 不少公司提前几个月推出了一系列“千年虫生存包” 。这个业务很快催生出价值数百万美元的市场 , 其中一家名为PreparednessResources的公司甚至通过推销包含脱水食品、净水器、无电池手电筒、毯子和防水火柴的生存工具套装赚到1600万美元 。头脑清醒的总裁ScottSperry还一早就定下了“售出不退”的强硬政策 。
“一夜暴富”的惊喜体验 。千年虫让德国的某个男子在新世纪的第一天突然体验了把当富豪的感觉 。当天 , 他的银行账户中随机存入约600万美元 , 交易日期为1899年12月30日 。当时的官员并不确定这笔异常转账跟千年虫有没有关系 , 唯一可以肯定的是这个男子不会真的一夜暴富 。
虽然从现在的角度来看 , 当初全世界对于千年虫问题的恐慌似乎没啥必要 , 但这主要归功于各国提前几年投入数千亿美元进行bug修复 。
比尔·盖茨在采访中就曾强调 , 千年虫“之所以最终没有掀起什么波澜 , 是因为各方真的不遗余力全力修复 。如果没有这样的付出 , 全世界一定会受到巨大影响 。”
“千年虫”能躲开吗?
早在1999年之前 , 世界各地的政府和企业就一直在努力寻找Y2K的修复方案 。但千年虫问题至今还不能有效避免 , 千年虫还可能再次现身 。
和千年虫问题类似 , 32位的Unix操作系统和Linux操作系统时间溢出问题又称为“2038年问题” , 所有使用POSIX时间表示时间的程序都将受到影响 。这个问题是由用来写Unix/Linux的C语言引起的 。
C语言中用time_t来代表时间和日期 , 用来记载从1970年1月1日到2000年所经历的秒数 , 并以32位存储 。第一位是符号位 , 其余31位用来存数字 , 这31位数字可存储的最大数字为2147483647 , 最多可以用到2038年01月19日03时14分07秒 。
到这个时间后 , 数字不会自动增加 , 而会变为-2147483648 , 即1901年12月13日20时45分52秒 。这会导致很多的程序出现问题 , 甚至崩溃 。
2038年问题不仅比千年虫更隐蔽 , 而且比之前千年虫问题更具有破坏力 。千年虫问题只会导致应用层的程序出现问题 , 比如信用卡支付系统或管理系统 。而“2038年问题”的bug , 将会影响系统最底层的时间控制的功能 。
2020年2月发布的Linuxkernel5.6声称解决了这个问题 , 因此32位系统也可以运行到2038年后 。Linux开发人员ArndBergmann表示 , 使用GNUCLibrary2.32和Musllibc1.2在64位time_t上构建用户时间 。
【微软exchangeserver中的bug】虽然“2038年问题”这样的系统性问题可能需要长时间探索解决 , 像微软这种类似千年虫的bug , 完全是可以避免的 。