是啥导致了 2010 年的错误?
Posted
技术标签:
【中文标题】是啥导致了 2010 年的错误?【英文标题】: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 年世界的毁灭。这个程序员值得诺贝尔和平价! 【参考方案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 格式字符串),并发现了几个具有该错误的项目。搜索模式的创造性应用可能会出现更多不同类型的错误。
【讨论】:
以上是关于是啥导致了 2010 年的错误?的主要内容,如果未能解决你的问题,请参考以下文章
是啥导致了这个 ActiveRecord::ReadOnlyRecord 错误?