【问题标题】:What is causing the 2010 bugs?是什么导致了 2010 年的错误?
【发布时间】:2010-01-05 16:03:48
【问题描述】:

有很多关于系统无法理解 2010 年的报告,但我不知道为什么。据我所知,我所照顾的当前系统运行良好,但我想知道更好地搜索的实际问题是什么。

请问有大神能介绍一下吗?

编辑:http://www.rte.ie/business/2010/0105/bug.html - 有关它影响德国信用卡的信息

【问题讨论】:

  • 天哪,这非常模糊。你有什么链接可以分享吗?
  • 这只是为 2012 年末日做准备。
  • 也许顾问在修复 Y2K 时添加了这些错误,所以他们在 10 年后会有一堆简单的工作要做。
  • 也许它不适合这个网站,但仍然是一个有趣的问题。
  • 明智之举,从 2009 年跳到 2016 年,我们错过了 2012 年世界的毁灭。这个程序员值得诺贝尔和平价!

标签: y2k


【解决方案1】:

银行和电信中使用的几种协议- including the SMS protocol - 将年份编码为单个字节中的BCD

从 2000 年到 2009 年,人们很容易犯错误,将年份解释为标准二进制数,因为编码是相同的:

Encoding  Binary-interpreted  BCD-interpreted
0x01      2001                2001
0x02      2002                2002
...
0x09      2009                2009
0x10      2016                2010
...

这很可能是导致 Windows Mobile 错误的原因。

【讨论】:

    【解决方案2】:

    一种可能的解释在下面的文章中

    http://www.theregister.co.uk/2010/01/05/symantec_y2k10_bug/

    让我想起了你最近关于廉价和肮脏的 Y2K 错误修复的文章,其中一些不道德的程序员输入了一个简单的 if

    【讨论】:

    • Windows 目前也有同样的功能。两位数的年份被解释为 1930 到 2029 之间的日期。这使得代码 if < 30 = 20xx otherwise the date is 19xx。解决方法是使用 2 位数的年份(包括最终用户)心甘情愿地打人
    【解决方案3】:

    SpamAssassin 有一条规则,可以将过早的日期标记为垃圾邮件:

    /20[1-9][0-9]/
    

    修复晚了几天,但很简单:

    /20[2-9][0-9]/
    

    十年后再见。

    【讨论】:

    • 首先我认为你一定是在开玩笑。但后来我检查了issues.apache.org/SpamAssassin/show_bug.cgi?id=6269。对我来说比较两个 4 位整数似乎并不难。他们为什么要为此使用正则表达式?
    • 因为每个人都知道,如果你不能用正则表达式来表达它,那就不值得这样做......;)
    • 可能是为了避免字符串到整数的转换?
    • 为什么不直接采样系统日期,并以此为基础确定“未来太远”?什么鬼?
    【解决方案4】:

    我有一个使用一位数年份字段的系统。是的。一位数。所以这个系统失败的原因是“2000”与“2010”的表达方式相同。

    【讨论】:

    • 该决定是否/是否有任何理由?
    • 我不知道,也没有真正的办法。
    • “10 年后我们再也不会使用这个软件了。”
    • 某些版本的 TRS-80 DOS(如 TRSDOS 6)使用一个八进制数字(三位)来表示年份。这是促使我离开 TRS-80 Model 4 并转向 Macintosh 的原因之一。
    • AT&T 6300 也有同样的问题:内部时钟只能表示 1984 年到 1991 年之间的年份。
    【解决方案5】:

    我听说的是人们为 Y2K 所做的快速修复,但没有经过深思熟虑。所以如果 xx

    【讨论】:

    • 并没有真正解释 16
    • 16 是从哪里来的?问题只是询问系统无法理解 2010 年。当然,0x10=16 可能是原因之一。
    • 2010 年到 2016 年的错误可能不是这里唯一的错误......这可以很好地解释德国银行所面临的问题。
    【解决方案6】:

    这可能是因为年轻的开发者在 Y2K 之后开始了他们的职业生涯,并且使用 1 位来表示年份。

    【讨论】:

    • 这难道不是更有经验的老开发人员的特征吗?(a) 尽量减少这些表示和 (b) 开发更有可能发生这种情况的系统?
    • 或者可能是 Y2K 顾问没有足够的退休金:)
    【解决方案7】:

    上周末我在一个网站上处理了一个 2010 年的小故障,但这只是编码疏忽的结果。

    当列表仅包含 2009 年之前的项目时,有人认为将列表项的值设置为当前 dateTime.year.Now() 是个好主意。

    ddlItem.findByText(DateTime.Now.Year.ToString())
    

    【讨论】:

      【解决方案8】:

      这是诺顿赛门铁克端点保护的屏幕截图

      alt text http://img695.imageshack.us/img695/4500/152010112800am.jpg

      没有人 @ symantec 通知他们的客户真是太好了…… 直到文章发布:http://www.theregister.co.uk/2010/01/05/symantec_y2k10_bug/

      【讨论】:

        【解决方案9】:

        这是一个组件中的一个错误,将年份分成两部分。第二部分用于比较,因此数字 10 不在基数 10 中,而是在基数 16 中,这意味着它是 0x10 = 16(十六进制)。

        【讨论】:

          【解决方案10】:

          我使用谷歌代码搜索find y2010 bugs in open source software。我寻找了一种可以指示错误的特定模式(使用“200%d”作为 printf 格式字符串),并发现了几个具有该错误的项目。搜索模式的创造性应用可能会出现更多不同类型的错误。

          【讨论】:

            猜你喜欢
            • 2020-09-15
            • 1970-01-01
            • 2011-08-13
            • 2012-10-06
            • 2022-06-28
            • 2012-09-21
            • 2010-10-12
            • 2013-10-03
            • 1970-01-01
            相关资源
            最近更新 更多