当前位置:主页 > wwwBet365正文

wwwBet365:隐藏的数据炸弹可能是导致不正常崩溃的罪魁祸首

05月07日作者:黑曼巴


内容:

百万分之一

破坏者数据差错模式

语法缘故原由

语义缘故原由

治疗和预防步伐

结论

参考资料

关于作者

对本文的评价

暗藏的数据炸弹可能是导致不正常崩溃的祸首罪魁

Eric E. Allen(eallen@cyc.com)

Java 开拓职员带头人,Cycorp, Inc.

2001 年 5 月

法度榜样因为毁坏的数据而崩溃时,破坏者可能难以捉摸。一个法度榜样常常在处置惩罚自身内部的数据的历程中就会崩溃,这以致会发生在法度榜样已经不出差错地运行了很长一段光阴今后。本文将评论争论一种差错模式(它可能便是引起这种崩溃的祸首罪魁),还有它为什么会存在,以及在它呈现之前和之后的几种打消它的措施。

百万分之一

作为一个勤劳的开拓职员,您已经为几个必要更好地造访繁杂的大年夜量数据存储的客户安装了一个利用法度榜样,它编写优越,而且颠最后充分测试。

对每个客户,现场测试阶段都通顺无阻地经由过程了。您在去银行的路上,心里极少斟酌这六个月来的软件检察,这时您的传呼机响了起来。您的一个客户在应用您的软件运行一个报表时,系统崩溃了。

您赶到误事出事地点,运行了一个随机测试。事情优越。您运行另一个。没呈现问题。您又运行了数百个测试。照样没有问题。您又反省了持续六个月运行这个利用法度榜样的其它客户。没有投诉。

您重复运行那个引起问题的报表。崩溃!怎么回事?

快速跟踪代码

清单 1. 样本,外部源文本文件

这种数据由法度榜样读取。可以从文件、键盘、麦克风、收集或者电子手套进行输入。

清单 2. 应用 StreamTokenizer 插入域和区域字符串

这种插入两个 String 的措施是否行得通取决于从文本文件获取 String 的要领。

清单 3. 数据破坏者

这个数据差错的示例可以引起法度榜样崩溃。

破坏者数据差错模式

许多法度榜样必要频繁造访和处置惩罚内部储存的数据来履行各类繁杂的义务。这种数据可以从内存中的大年夜型布局、数据库或收集上检索获得。

这类法度榜样异常轻易遭受毁坏的内部数据引起的崩溃。我称这种差错模式为破坏者数据模式,是由于这种数据可以无限日地存在于系统中(很象冷战中的匿伏特工一样),不激发任何问题,直到造访一段特定的数据时,毁wwwBet365坏的数据才象炸弹一样爆炸。

语法缘故原由

假定我们有一个 JDBC 利用法度榜样,它存储了一个名为 Mapping 的数据库表,该表将 String 的名称映射到一系列元素的聚拢。(请参阅参考资料,以获取关于 JDBC API 的更多信息。)每个聚拢中的每个元素都引用另一个表中的一个关键字(该表名为 Properties,包孕这些元素的不合已知属性)。

这样说吧,Mapping 和 Properties 表最初都是从一个文本文件中读取的,这个文本文件由外部源(外部意为不是内部孕育发生的随意率性数据源)成长而来,而在外部源中,每行都以一个名称开首,后面随着对应聚拢的表达,如下所示:

清单 1. 样本,外部源文本文件

In the Mapping file:

apples {macintosh, gala, golden-delicious}

trees{elm, beech, maple, pine, birch}

rocks{quartz, limestone, marble, diamond}

...

In the Properties file:

macintosh {color: red, taste: sour}

gala{color: red, taste: sweet}

diamond{color: clear, rigidity: hard, value: high}

...

可以对 Mapping 和 Properties 表条款进行语法阐发并将其通报到一个措施中,此措施会把这些条款插入到一个数据库中。但这种措施存在潜在的缺陷。例如,假定我们已经编写了一个处置wwwBet365惩罚 JDBC 兼容数据库的类。遵循 JDBC API,我们可以定义一个 PreparedStatement 工具并应用它把信息通报到数据库中,如下所示:

清单 2. 应用 StreamTokenizer 插入域和区域字符串

...

PreparedStatement insertionStmt =

con.prepareStatement("INSERT INTO MAPPING VALUES(?,?)");

...

public void insertEntry(String domain, String range)

throws SQLException {

insertionStatement.setString(1, domain);

insertionStatement.setString(2, range);

insertionStatement.executeUpdate();

}

以这种要领插入两个 String 相宜与否取决于从文本文件中获取 String 的要领。例如,假定一个简单的正则表达式匹配对象被用来将每一行拆分成两个 String:

一个 String 包孕第一个 String 之前的整个字符。

一个 String 包孕第一个 String 之后的整个字符。

这种对文本文件wwwBet365进行的基础的语法阐发不会捕获数据的较小毁坏。例如,假云云中的一行是如下的形式:

清单 3. 数据破坏者

trees{elm, beech, maple, pine birch}

“pine”和“birch”之间的逗号遗漏落了。这样的差错很轻易由天生文件的对象的差错或手工编辑文件而造成。

无论若何,数据都邑以毁坏的形式进入数据库,悄悄地等待被造访。假如用于造访数据的措施要求用逗号和空格来分隔条款,在读取这个条款的时刻就会导致崩溃。

假如法度榜样只是简单地应用逗号来区分聚拢中的元素,加倍严重的差错都可能发生。系统可能将“pine birch”解释为一个零丁的树类型(数据的单个条款),并将这个差错进一步传播到谋略中去。

语义缘故原由

我们的示例是一个违反了数据的一个简单的语法特性演示。当然,这不是可能毁坏数据的独一道路。

语义级别上的限制身分也可能被破坏。在我们的示例中,Mapping 表中数据的一种要求是,每个聚拢中的每个元素都是 Properties 表中的一个域条款。假如这种不变量被破坏,法度榜样就会在试图读取一个在 Properties 表中并不存在的元素时掉败,导致非常被抛出。

在本文中,我应用数据库条款作为示例,然则破坏者数据差错会以各类要领呈现 ? 与数据输入的要领一样多。当法度榜样读取数据时,不管它是从文件、键盘、麦克风、收集照样电子手套读取,破坏者数据差错都有可能存在。

治疗和预防步伐

最好的提防破坏者数据差错的措施是编译器和解释器开拓职员普遍采纳的那种措施。因为输入到这些法度榜样的数据是如斯繁杂,开拓职员别无它法,只有在第一次读取输入内容的时刻就履行尽可能彻底的完备性反省,而不是在今后造访的时刻再进行反省。

语法阐发生发火为打消差错的措施

实际上,对输入内容进行语法阐发的措施正好是打消大年夜量这些差错的道路。不幸的是,很多法度榜样员(他们从来不会斟酌编写没有语法阐发器的编译器)没有能够为较简单的数据编写足够的语法阐发措施。较简单的数据的语法阐发当然要轻易一点,然则这并不能成为根本纰谬它进行语法阐发的饰辞。

任何读取数据的法度榜样 ? 不管有多简单 ? 都应该对数据进行语法阐发。终究,这种法度榜样在它的有效输入的聚拢所定义的“说话”上可以被看作是一个编译器(或者说冥器)。

从经历过的人那里罗致一点履历吧。我年轻时对照卤莽,犯了个差错 ? 处置惩罚数据的时刻没有作适当的语法阐发,然后我就遭受了那样的后果 ? 跋扈獗的破坏者。我可不保举这种履历。

类型反省作为打消差错的措施

编译器为许多说话(当然包括 Java 说话)所作的反省的另一种普遍形式是类型反省。类型反省是法度榜样完备性上的语义级别反省的一个示例。

假如类型系统是壮实的(就象 Java 类型系统一样),这种完备性反省确凿可以包管很多差错永世不会在运行时孕育发生。象语法阐发一样,编译器编写者的这个示例可以利用于其它常常在其输入数据上规定语义级别不变量的法度榜样。这些不变量平日不是明确的,但可以经由过程进行对应的反省来把它们变成明确的。

反复操作作为打消差错的措施

当然,假如您狐疑这种差错模式的呈现与已经读入并存储的数据有关,反复操作数据也是明智的:造访在实际设置设置设备摆设摆设的利用法度榜样中可能要操作的每个数据,包管统统都象期望的那样事情。经由过程这种措施,您也能够修正简单的差错。

关于打消差错措施的一个告诫

我的意思当然不是暗示履行足够的反省来打消法度榜样中的所有破坏者数据老是可行的。假如然是那样,就不会有引起差错模式的潜在问题了。

一个破坏者在开始带来劫难之前为什么会无法觉察是有很多缘故原由的:

履行所有反省必需的数据直到破坏者数据已经存储了今后才可用。

整套的限制元素以致是无法谋略的(就象编译器和解释器的环境一样)。

限制元素可以谋略,然则法度榜样无法造访反省它们所必要的资本。

在这些环境下,我们最好是只管即便打消可能的破坏者形式。

结论

下面是破坏者数据差错模式的总结:

模式:破坏者数据

症状:一个存储和处置惩罚繁杂的输入数据的法度榜样在履行义务时意外地崩溃,而这个义务和其它没有孕育发生任何问题的义务很相似。

原由:一些内部数据被毁坏,可能是语法上的毁坏,也可能是语义上的。

治疗和预防步伐:对输入数据只管即便多地履行完备性反省,而且要只管即便早履行。对付已经毁坏的持久数据,钻研它并反省其完备性。

打消数据破坏者的黄金轨则:任何读取数据的法度榜样都应该对数据进行语法阐发。愿您能顺利打消这些差错!

参考资wwwBet365料

介入本文的评论争论论坛。

要懂得有关 JDBC 的更多信息,请查看关于本主题的 Java 数据库连接教程(developerWorks,2000 年 4 月)。

进修 Java 调试教程(developerWorks,2001 年 2 月)来得到一样平常调试技术的赞助。

造访 Enhydra 主页来下载 Instant DB,一个免费的 JDBC 驱动法度榜样。只管要让它适用于大年夜型数据库还必要一些技术,但用它处置惩罚中等大年夜小的表照样不错的。

只管遭受非议,正则表达式读取器照样很强大年夜的对象。看看 OroMatcher,一个 Java 说话的正则表达式匹配器,它读取 Perl 类型的正则表达式。

Java 说话有很多类似于 Lex 和 Yacc 的器械(标准语法阐发器对象),请看一下 ANTLR 的一个这样的例子。

涉猎 Eric 关于差错模式的 完备系列。

关于作者

Eric Allen 在 Cornell 大年夜学得到谋略机科学和数学的学士学位。他今朝是 Cycorp 公司的 Java 软件开拓职员带头人,照样 Rice 大年夜学的编程说话小组的兼职硕士生。他的钻研涉及在源法度榜样和字节码层次上的正箴言义模型和 Java 说话扩展的开拓。今朝,他正在为 NextGen 编程说话实现一种从源代码到字节码的编译器,这也wwwBet365是 Java 说话的泛型运行时类型的一种扩展。请经由过程 eallen@cyc.com 与 Eric 联系。

最近关注

热点内容

更多