“千年虫”的测试和校正  

  什么是“千年虫”?“千年虫”就是计算机2000年问题的别号。

  那什么是计算机2000年问题呢?

  计算机2000年问题(简称Y2K问题,有叫千禧年的),实际上包括软件和硬件两个方面的问题,它们各自的原因不同,解决方案也不同。

  在早期的计算机软件系统设计中,当时的存储空间极为有限(内存仅有几千字节),为节省存储空间,设计人员只采用了两位十进位数来记录年份的最后两位,例如:1973年10月1日表示为:73-10-1,省略了19这两位表示世纪的数字。这样,当新的千年到来时,时间从1999年12月31日跨入2000年1月1日,就会使程序将2000年误认为1900年。

  而在早期的计算机硬件系统设计中,用一种实时时钟芯片(RTC)来存储时间和日期。实时时钟芯片由七个寄存器组成,无论计算机是开还是关,由电池供电的实时时钟芯片中的前六个寄存器都会自动更新,每个寄存器存储不同的数值:秒、分、时、日、月和年;但是,第七个存储器(不妨称之为世纪存储器)存储年份的最高两位数,即1973中的19,不会自动进位更新(某些机器的时间寄存器中没有世纪寄存器), 同样,在新世纪到来时,系统时间会从2000年变为1900年。

  由于时间的混乱,将致使计算机系统以及各种仪器设备因时间判断错误而发生故障,造成运算错误甚至导致系统崩溃。

一、“千年虫”问题的简易测试

  先在WIN95/WIN98下做一张启动盘,在Windows 95/98环境下,通过选择控制面板中的“增加/删除程序”项目,点“启动盘”标签,再选“创建启动盘”按钮,放一张空盘在软驱,即可制成一张启动盘。如果你还在用DOS系统,则只需用干净的DOS盘即可。

  再编一个批命令文件DT2000,内容只需两行:date 12-31-1999(回车)time 23:59:40。将这个文件保存到你的启动盘之中。

  然后用这张启动盘启动计算机,执行A盘中的批命令文件DT2000后,系统时间将被更改为1999年12月31日23时40秒。关闭计算机并等待至少20秒钟再开机,在这段时间内,时间寄存器中的年份存储器将会进位到00,同时,旧的世纪存储器仍会保持19不变,而新的世纪存储器会自动进位到20。再用启动盘启动计算机之后,使用date命令察看日期,这时,如果年份数值显示为2000,你的机器就没有“千年虫”问题。如果年份显示为1980年,你就有一些麻烦了。如果是这样,你可以先与你的PC机制造厂商联系,或者到他们的主页上去访问一下,询问这种问题能否通过更新BIOS程序来解决,或者厂家是否提供了其他的解决方案。

  虽然你可以不用启动盘启动,直接在WIN95/98下更改时间来测试“千年虫”问题,但还是推荐使用启动盘,这样可以避免WIN95/98批处理文件或“启动组"中的某些程序对系统时间有影响。当然,你也可以进到COMS中,直接修改BIOS中的时间来测试“千年虫”问题。

  测试之后,再把时间改回来。

  另外,如果你还担心你的计算机可能还存在将2000年的闰年问题的话,可以测试计算机的闰年兼容性,只要在以上介绍的测试方法中,将测试日期不是设为1999年12月31日,而是设为2000年2月28日。当时间跳变后,如果日期是2000年2月29日,就没有问题;如果日期是2000年3月1日,你就与你的PC机制造厂商联系了,告诉他们你的问题,寻求解决方案。

二、“千年虫”问题的商业测试与校正

  如果你或你的公司有大量的计算机需要测试进行2000年问题测试,而且希望测试结果更加稳妥可靠一些,则需要使用专门的软件来进行测试了。

  2000年问题测试软件的设计思想,其实与上面介绍的建议方法类似,实际上也是通过对系统时间的修改来验证BIOS中对时间处理的正确性。

  如果仅仅是测试,那么网上有很多免费的软件可以下载;但是,如果还要对大量的计算机进行2000年问题校正,那最好还是让你的老板花点银子。虽然网上也有不少免费或共享软件可以用来校正2000年问题,但你没办法保证它们稳妥可靠、万无一失,而且万一出了问题,免费和共享软件的作者是不需对此负责的。

  所以在商业应用中,还是建议购买商业公司的产品来校正2000年问题。这样可以得到较为完善的服务和具有法律效力的承诺,如果使用该公司产品未能解决“千年虫”问题而造成损失,他们必须承担责任。

  对BIOS中的2000年问题的校正,可以使用软件方法,也可以使用硬件设备。

  软件的解决方案,是通过运行一个常驻内存的小程序(TSR)来实时动态地监控BIOS程序的运行,检查BIOS从时间存储器中读取的日期数值是否会导致系统出问题,如果日期错误的问题出现,校正程序就会在把日期数值传递给操作系统和应用程序之前,通过某种的算法计算后,在时间数值增加或减少一定的年数来加以补偿,从而确保操作系统和应用程序得到的时间不会有错误。

  不过通过常驻内存程序(TSR)来对付2000年问题,用起来不太可靠和安全。一旦重新格式化计算机的硬盘、或是偶尔从软盘启动计算机,常驻内存程序(TSR)就将会被冲坏或被屏蔽掉了,这时你的计算机就不能识别时间进位错误了。所以,商业公司又提供了另一种方法,即在计算机的插槽中安装一块硬卡,以实现对计算机BIOS时间进位的保护,实际上是将上述软件的代码固化到芯片中,再通过总线来实时监控BIOS。这种校正方法显然更为可靠和持久,当然费用显然是高得多,特别是你的公司有上百台计算机需要处理的话。

  当然,在效果和费用之间选择的事情,就不是技术人员说了算的了。

  在这里,我们推荐几种2000年问题校正的工具软件包和硬卡设备。

  首先是Network Associates公司(www.nai.com)提供的McAfee 2000 Toolbox测试程序,这种工具在Windows环境下通过使用虚拟设备驱动程序来解决Windows环境下应用程序的2000年问题,不仅可以对BIOS检测和运行常驻内存程序来校正,还可以对数据文件和应用程序中的“千年虫”进行扫描检查;并且不要求重新启动系统就可以直接测试和校正。价格也不高,是中小型公司较为理想的选择。

  该公司还提供了一种名为Nuts & Bolts 98的工具软件包,它的功能基本与McAfee 2000 Toolbox基本相同,但是比McAfee 2000 Toolbox要贵不少;不过它额外提供了一些对PC机软硬件进行分析、优化的功能,所以性价比还是算合理。

  RighTime Clock公司(www.rightime.com)提供的2000年问题测试和校正程序PC Hardware Year 2000,可以通过e-mail得到,优点是适用于DOS、Windows 95/98和OS/2等多种环境,不过测试时需要重新启动计算机。

  UniComp Products公司(www.unicomp-products.com)提供的Date-A-Fix,突出的优点是卸载常驻内存程序(TSR)方便,它不需要向其它的软件包那样,必须亲自修改编辑Autoexec.bat文件,而只需通过菜单就可以卸载掉。不过,考虑到一般我们并不需要卸载“千年虫”监控程序,而且Date-A-Fix 的价格也太高了,所以,它不是划算的选择。

  Millennium Bug Toolkit(“千年虫”工具箱)(www.computerexperts.co.uk)是一家英国公司提供的硬件测试和修正程序,不过这个工具箱使用起来不太方便,而且价格也偏高。

  至于对付“千年虫”的硬卡,我们知道的有两种:American Megatrends公司(www.megaraid.com)的AMI Year 2000 BIOS Enabler Card ,价格稍贵;还有Award的一家分公司Unicore (www.firmware.com)提供的MFI Flash 2000,要便宜一些。

三、应用软件中“千年虫”问题的侦测与修补

  对于数量巨大、种类繁多的应用程序、电子表格、数据库,要查找和消灭其中隐藏的“千年虫”,就比对付计算机BIOS中的2000年问题要复杂的多了。

  这些应用程序、电子表格、数据库中的“千年虫”问题,除了早期编制的软件受计算机内存限制而缩写日期外,其它大部分是由于程序员、数据录入员时间表述不规范造成的。

  因此,要彻底全面地侦测出几代程序员不同风格、数量巨大的源代码中,以及各种各样格式的电子表格、数据库中隐藏的“千年虫”,必须借助一些工具软件才行。

  对普通用户而言,网上的免费软件或是百来两百块钱的专业软件,当然是首选。上面介绍的美国McAfee 2000 Toolbox软件包,只需30美圆,国内也有不少公司提供这一价位的解决方案,如《电脑报》推出的"2000问题解决方案"《KB2000》软件,只需168¥。至于那些大的公司或政府公益部门,如果需要选购更为全面的软件和更好的技术支持,也有高达几十万元一套的“重型杀虫”软件可供选择。

  这些工具软件,基本分为两种:针对某一类应用的“千年虫”问题而设计的专用软件,和对多数应用程序的“千年虫”问题都适用的通用软件。

  MS Group International公司提供的DateSpy就是专门为电子表格的“千年虫”问题而设计的,DateSpy只能够查找出微软的 Excel电子表格中的2000年问题日期错误。这种专门软件是通过详细分析该种应用的数据结构和数据存储方式,然后扫描侦测出其中的日期数据问题,最后进行更改和修复。

  而通用软件,则是通过查找源代码或数据文件中与日期有关的部分,例如利用日期进行运算或者调用日期函数的地方,然后对程序进行分析,进而得到相应的解决方法。这些工具有WRQ公司的Express 2000 Suite软件包, IST公司的 Year 2000 Packs 工具包,当然还有Network Associates公司提供的McAfee 2000 Toolbox 。需要指出的是,McAfee 2000 Toolbox不仅可以发现电子表格和数据库文件中的隐藏的“千年虫”问题,而且还能够识别对2000年问题不兼容的应用程序,甚至能够发现计算机中潜伏的2000年问题病毒,功能非常强大。另外,如果需要通过网络来扫描文件,那么IST公司的 Year 2000 Packs 工具包是最佳选择,它拥有基于网络的强大的扫描和分析能力。

  总之,应该根据计算机的操作系统,网络环境、计算机的数量和类型、应用程序和数据文件的类型,以及经济承受能力来选择适当的工具软件,以期实现最低费用和最高效益的解决方案。

四、程序员与“千年虫”

  大部分软件中的“千年虫”,都是前辈程序员或数据录入员遗留下来的,那么现在要消灭它,就必须依靠我们新一代程序员了。因为大部分工具软件最多只能起到发现问题的作用,真正要杀灭应用程序中的“千年虫”,还必须靠程序员在程序源码中一行一行代码去修改。

  对于计算机2000年问题,可根据系统的具体要求,采取不同的解决方法:全部更换为用四位数表示日期的新系统;或重新开发用四位数表示日期的应用系统;或修改当前系统,消灭其中的2000年问题。实际上,除了一些小的应用软件可以重新开发外,对于大多数没有新的系统可供更换的实际应用而言,只能走修改这条道路。

  目前常用的修改方法主要有以下几种:

1、 日期变更法

  日期变更法又称为年代比较法,编制的程序将每一个从数据库中读取到的年代,与实现设定的数据作比较,然后判断出该年代属于哪一世纪。例如,设定任何大于70的年代数都为20世纪,而小于70的数字为21世纪。这个方法的优点是,不用改动数据文件,

只需改动源代码程序。这一点在不少实际应用中,是非常方便的。另外由于年代数未改变,依然用2位数,所以程序的接口部分不需要改动,而且,由于每个程序都是单独修改,因此,也无需使用桥接程序来解决各个程序相互间的协调问题。所以,系统修改花费的资源相对比较少。

  不过日期变更法的缺点也很明显:程序中凡是进行年代信息比较、计算和处理的地方,都必须对源代码做相应的改动。例如日期01/01/01和01/01/99,在程序未经修改时,系统解释为01/01/1901和01/01/1999,日期比较时,前者早于后者;但在日期变更法的系统中,这两组数表示的日期分别为01/01/2001和01/01/1999,前者就晚于后者了。如果源代码未作修改,就会得到完全不同的结果。而且,每一个涉及日期年代比较、计算和处理的程序都要作改动,所以程序改动范围大、数量多,需要测试的工作量也大大增加,使系统修改的成本提高。

2、 日期操作法

  日期操纵法也称固定数据法,即在现有的日期年代上固定加上某一年数,如将日期01/01/99的年代数据后加上85,则更改后的日期为01/01/84,实际上是将2000年问题推后15年。这种方法比较适合于对日期年代进行分类和比较运算的程序,如累计80年代的所有资金流通量这种分类运算;而对于要求实际年代日期的时间运算应用就不合适了,因为用日期操作法更改后,实际年代已经变化,要正确地一一对应比较困难,必须对接口函数作大的修改。

  由此看来,日期操纵法其实增加了整个系统的复杂性,具体实现起来也比较困难。因为并不是所有的情况加上85都合适,所以你必须仔细考虑所有程序的通用性后,才能确定一个合适的固定年数。这在实际应用中,是比较麻烦的。总体上看,日期操作法只适合一些分类明显的具体应用,不具备通用性。

  3、 日期重编法

  日期重编法包括两种方法,一种是年代压缩法,另一种日期编码法。

  年代压缩法是指通过编码和压缩的方法将四位的年代数据存储在现有的两位数空间内,例如,将现在的1999经过某种算法压缩(如进制转化)后,变为45(当然不是简单地变为99),这样就可以存放在原有程序的两位数年代存储空间了。而在运算时,先进行解压缩和反推算,得到实际年代数据,再传递给程序进行运算。这个方法比较适合对年代数据存储要求较高,而年代运算不太复杂的应用。如果年代运算很复杂,那么在解压反推后得到的年代数在传递与运算中就很容易出问题。

  另一种日期编码法是将原有的日期表示格式YY-MM-DD格式改为新的日期表示格式C-YY-DDD,其中C是世纪的代码,DDD为YY年中从第一天起计算的天数。假设1表示20世纪,2表示21世纪,那么,在日期编码法中,1998-01-22就表示为198022,而2000-01-01则表示为200001。

  日期重编法中的年代压缩法和日期编码法这两种方法,都有一个共同的缺点,就是必须编写一个通用的算法程序对年代日期进行预处理,然后还要进行解压缩和反推算,比较麻烦,不适用于有复杂年代运算的应用。

  4、 日期区域扩展法

  产生2000年问题的根本原因是由于使用两位数来存储年代信息。所以,可以采用日期区域扩展法,先将存储年代数据的数据库全部扩展到四位数字来表示,如87扩展为1987;然后,对程序中需要对年代进行计算、比较和处理的部分进行扩展,以适应新的年代数据处理的需要。另外,十分重要的是,还必须编制新的接口程序和接口界面,确保新的数据能够在程序中顺利地传递。同时,桥接程序也是必须的,它用来完成两位数到四位数之间的自动转换,一旦转换完成,就立即取消桥接程序。

  同步是日期区域扩展法的关键。数据库中存储年代的数据结构改为四位数后,当不同的应用程序从同一数据库中提取数据时,如果这些应用程序没有同步进行修改,就可能导致四位数年代在不同应用中不同结果,最终导致程序运行的失败。

  应该说,日期区域扩展法是最彻底、最根本、最有效的办法,但是这种办法也是资源投入最多、时间和财力花费最大、最为复杂的的方法。

  总而言之,目前有关计算机2000年问题的各种修改方法都有其固有的局限性和不足。因此,对系统作2000年问题修改时,应该根据实际应用的具体情况来选择方法,采取一种或多种方法综合运用。

 

  (编者:我们收集了部分文中提到的软硬件的报价以方便读者。

  这里的价格为1999年一季度制造商提供的未征关税前折合为人民币的报价,如果国内用户需要,应与制造商联系,以获得最新的报价。

  软件包:

  RighTime Clock公司的PC Pro PC Hardware Year 2000软件包,报价在320元左右;

  computerexperts公司的Millennium Bug Toolkit软件包,报价在700元左右;

  UniComp Products公司的Date-A-Fix软件包,报价在450元左右;

  Network Associates公司的McAfee 2000 Toolbox软件包,报价在260元左右; Nut & Bolts 98软件包,报价在350元左右。

  硬卡:

  Megatrends公司的AMI Year 2000 BIOS Enabler,每块卡报价在510元左右;AwardMFI Flash 2000,每块卡报价在310元左右。)

虎翼网门户通主机大赠送