错误严重度
故障A
错误案例
以下是资讯VCUtil.java类里面一个同事加的一个方法,而这个类又被在页面上广泛使用。
//去掉单引号、双引号和红色htmltag public static String filterToHtml(String str){ int start = 0; int end = 0; while(str.indexOf("<")>=0 && str.indexOf(">")>=0){ start = str.indexOf("<"); end = str.indexOf(">"); str = str.replace(str.substring(start, end+1), ""); } return str.replaceAll("\'", "").replaceAll("\"", """).replaceAll("<font color=red>", "").replaceAll("</font>", ""); }
这个方法有个严重的bug,就是特定条件下会导致死循环,也就是这个方法导致资讯当时出现了大面积load到20多。
错误分析
比如这样的一个标题:
String title="<font color=red>我的资讯></font>";
运用这个方法之后做第一循环,<font color=red>被替换成空字符串"" 第二次循环,title就变成:"我的资讯></font>", 继续运行,这时:
start=end+1; str.substring(start, end+1)也即str.substring(end+1, end+1)
这样子字符串就是"", 再做replace成"", 永远退不出循环。一旦被标红的标题多了'>', 就会导致死循环。这只是其中的一种,可能还有其它的情况,只要最后><连在一起,就出现死循环。我在我机器跑了4个,机器的CPU100%,已经走不动了
正确用法
我们的应用跑了这么多年,一般的工具类或方法我们都有的,一般不需要自己写。 当遇到这种情况时,先咨询下资深的开发人员或架构师,框架中有没有相应的类或方法,如果有直接拿来使用,毕竟是久经验证的,错误的几率下。万不得已非要自己写时,记得一定找架构师review下,因为工具类方法是暴露给很多人用的,自己写可能考虑不够全面,出错的几率比较大。
测试关注点
1.多走一些测试路径
2. 尝试错误数据进行测试验证。