findBugs 这个报的是什么错误

findBugs \u8fd9\u4e2a\u62a5\u7684\u662f\u4ec0\u4e48\u9519\u8bef

FindBugs\u662f\u9759\u6001\u5206\u6790\u5de5\u5177\u4e0d\u662f\u9519\u8bef\u3002
\u5b83\u68c0\u67e5\u7c7b\u6216\u8005 JAR \u6587\u4ef6\uff0c\u5c06\u5b57\u8282\u7801\u4e0e\u4e00\u7ec4\u7f3a\u9677\u6a21\u5f0f\u8fdb\u884c\u5bf9\u6bd4\u4ee5\u53d1\u73b0\u53ef\u80fd\u7684\u95ee\u9898\u3002\u6709\u4e86\u9759\u6001\u5206\u6790\u5de5\u5177\uff0c\u5c31\u53ef\u4ee5\u5728\u4e0d\u5b9e\u9645\u8fd0\u884c\u7a0b\u5e8f\u7684\u60c5\u51b5\u5bf9\u8f6f\u4ef6\u8fdb\u884c\u5206\u6790\u3002\u4e0d\u662f\u901a\u8fc7\u5206\u6790\u7c7b\u6587\u4ef6\u7684\u5f62\u5f0f\u6216\u7ed3\u6784\u6765\u786e\u5b9a\u7a0b\u5e8f\u7684\u610f\u56fe\uff0c\u800c\u662f\u901a\u5e38\u4f7f\u7528 Visitor \u6a21\u5f0f\u3002
\u5728FindBugs\u7684GUI\u4e2d\uff0c\u9700\u8981\u5148\u9009\u62e9\u5f85\u626b\u63cf\u7684.class\u6587\u4ef6(FindBugs\u5176\u5b9e\u5c31\u662f\u5bf9\u7f16\u8bd1\u540e\u7684class\u8fdb\u884c\u626b\u63cf\uff0c\u85c9\u4ee5\u53d1\u73b0\u4e00\u4e9b\u9690\u85cf\u7684bug\u3002)\u3002\u5982\u679c\u4f60\u62e5\u6709\u8fd9\u4e9b.class\u6863\u5bf9\u5e94\u7684\u6e90\u6587\u4ef6\uff0c\u53ef\u628a\u8fd9\u4e9b.java\u6587\u4ef6\u518d\u9009\u4e0a\uff0c\u8fd9\u6837\u4fbf\u53ef\u4ee5\u4ece\u7a0d\u540e\u5f97\u51fa\u7684\u62a5\u544a\u4e2d\u5feb\u6377\u7684\u5b9a\u4f4d\u5230\u51fa\u95ee\u9898\u7684\u4ee3\u7801\u4e0a\u9762\u3002\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u9009\u4e0a\u5de5\u7a0b\u6240\u4f7f\u7528\u7684library\uff0c\u8fd9\u6837\u4f3c\u4e4e\u53ef\u4ee5\u5e2e\u52a9FindBugs\u505a\u4e00\u4e9b\u9ad8\u9636\u7684\u68c0\u67e5\uff0c\u85c9\u4ee5\u53d1\u73b0\u4e00\u4e9b\u66f4\u6df1\u5c42\u7684bug\u3002

\u6269\u5c55\u8d44\u6599
findBugs\u68c0\u67e5\u7684bug\u7c7b\u578b\u5305\u62ec\uff1a
1\u3001Malicious code vulnerability\uff1a\u6076\u610f\u4ee3\u7801
2\u3001Dodgy code\uff1a\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801
3\u3001Internationalization\uff1a\u56fd\u9645\u5316\u76f8\u5173\u95ee\u9898\uff0c\u5982\u9519\u8bef\u7684\u5b57\u7b26\u4e32\u8f6c\u6362;
4\u3001Bad practice\uff1a\u574f\u7684\u5b9e\u8df5:\u5e38\u89c1\u4ee3\u7801\u9519\u8bef,\u5e8f\u5217\u5316\u9519\u8bef,\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u68c0\u67e5\u65f6\u8fdb\u884c\u7f3a\u9677\u6a21\u5f0f\u5339\u914d;
5\u3001Multithreaded correctness\uff1a\u591a\u7ebf\u7a0b\u7684\u6b63\u786e\u6027:\u5982\u591a\u7ebf\u7a0b\u7f16\u7a0b\u65f6\u5e38\u89c1\u7684\u540c\u6b65,\u7ebf\u7a0b\u8c03\u5ea6\u95ee\u9898;
6\u3001Performance\uff1a\u8fd0\u884c\u65f6\u6027\u80fd\u95ee\u9898\uff0c\u5982\u7531\u53d8\u91cf\u5b9a\u4e49,\u65b9\u6cd5\u8c03\u7528\u5bfc\u81f4\u7684\u4ee3\u7801\u4f4e\u6548\u95ee\u9898\u3002
7\u3001Correctness\uff1a\u53ef\u80fd\u5bfc\u81f4\u9519\u8bef\u7684\u4ee3\u7801,\u5982\u7a7a\u6307\u9488\u5f15\u7528\u7b49;
8\u3001Experimental\uff1a\u53ef\u80fd\u53d7\u5230\u7684\u6076\u610f\u653b\u51fb,\u5982\u8bbf\u95ee\u6743\u9650\u4fee\u9970\u7b26\u7684\u5b9a\u4e49\u7b49;
9\u3001Security\uff1a\u5b89\u5168\u6027
\u53c2\u8003\u8d44\u6599\u6765\u6e90\uff1a\u767e\u5ea6\u767e\u79d1-FindBugs

\u6ca1\u6709\u8bf4\u662fbug \uff0c\u53ea\u662f\u4e00\u4e2a\u8b66\u544a\u800c\u5df2\uff0c\u5e76\u4e0d\u5f71\u54cd\u4f60\u4ee3\u7801\u7684\u8fd0\u884c\u3002
\u4f60\u5982\u679c\u4e0d\u58f0\u660e\u7f16\u7801\uff0c \u5b83\u5c31\u4f1a\u7528\u64cd\u4f5c\u7cfb\u7edf\u9ed8\u8ba4\u7684\u7f16\u7801\u3002 \u90a3\u4e48\u4f60\u7684\u9879\u76ee\u90e8\u7f72\u5230\u5176\u4ed6\u670d\u52a1\u5668\u4e0a\u7684\u65f6\u5019\uff0c\u5c31\u6709\u53ef\u80fd\u53d1\u751f\u9519\u8bef\u4e86\u3002 \u6240\u4ee5\u4ed6\u8b66\u544a\u4f60\uff0c\u6700\u597d\u58f0\u660e\u4e00\u4e2a\u7f16\u7801\u683c\u5f0f\u3002

 FindBugs常见错误描述和解决方法

  (一)
[DLS_DEAD_LOCAL_STORE]
描述: Dead store to 未使用的局部变量
解决方法:局部变量定义后未使用;实例化对象后又重新对该对象赋值

(二) [ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD]
描述:Write to static field 通过实例方法更新静态属性
常见于常量类,直接通过类名.常量名获取的方式违背了封装的原则,findbugs不提倡使用,而如果将常量改成静态成员变量,又因为spring不支持静态注入导致不能实现,解决方法是非静态的setter调用静态的setter方法给静态成员变量赋值。
解决方法:
常量类F:
class F{
public static String a = “123”;
}
常量a改为静态成员变量,通过F.getA()获取,且由于spring不支持静态注入,改为:
class F{
private static String a;
public static Integer getA() {
return a;
}
public void setA(String a) {
setAValue(a);
}
public static void setAValue(String a) {
F.a = a;
}
}

(三) [BX_UNBOXING_IMMEDIATELY_REBOXED]
描述: Boxed value is unboxed and then immediately reboxed 装箱的值被拆箱,然后立刻重新装箱了
常见的是三目运算时,同时存在基本类型和包装类型。
解决方法:
Integer a = null;
//...
a = (a == null)?0:a;
此问题在于a不为null时,会被拆箱,赋值时再装箱。这是自动装箱拆箱的特性,只要运算中有不同类型,当涉及到类型转换时,编译器就会向下转型,再进行运算。修改方法,统一类型:
Integer a = null;
//...
a = (a == null)?Integer.valueOf(0):a;

(四) [SE_BAD_FIELD]
描述: Non-transient non-serializable instance field in serializable class在可序列化的类中存在不能序列化或者不能暂存的数据
解决方法:
方法1:序列化该对象
方法2:当采用struts2框架开发,不可避免的此问题会大量出现,因为ActionSupport实现了序列化接口,action继承了此类,而service没序列化,所以在action中引用service对象时提示此错误,最简单的解决方法是将service对象声明成transient,即service不需要序列化
方法3(未验证):To avoid java serialization you need to implement writeObject() and readObject() method in your Class and need to throw NotSerializableException from those method.(action中实现这两个方法?)
private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
throw new java.io.NotSerializableException( getClass().getName() );
}
private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
throw new java.io.NotSerializableException( getClass().getName() );
}

(五) [NP_LOAD_OF_KNOWN_NULL_VALUE]
描述: Load of known null value加载已知是null的值
解决方法:已知方法参数为null是,直接传递null而不是参数名

(六) [REC_CATCH_EXCEPTION]
描述: Exception is caught when Exception is not thrown 过泛地捕获异常或捕获异常后未做任何处理
解决方法:异常分类捕获(至少要打印出此异常对象)

(七) [NP_NULL_PARAM_DEREF]
描述: Null passed for nonnull parameter 把空值传给了非空的参数
解决方法:增加非空判断

(八) [NP_IMMEDIATE_DEREFERENCE_OF_READLINE]
描述: Immediate dereference of the result of readLine() 立即引用了readLine()的结果
解决方法:判断readLine的结果是否为空

(九) [EI_EXPOSE_REP] 恶意代码漏洞
描述:may expose internal representation by returning getter方法返回引用类型
eclipse自动生成的引用类型(Object、数组、Date等)的getter、setter方法会得到或通过对可变对象的引用操作而暴露代码内部实现,解决方法很多,只要返回的或赋值的对象不是原引用对象即可。
解决方法:
以Date类型为例:
public Date getHappenTime() {
if(happenTime != null){
return (Date) happenTime.clone();
}
return null;
}

(十) [ EI_EXPOSE_REP2] 恶意代码漏洞
描述:may expose internal representation by storing an externally mutable object into setter方法返回引用类型
eclipse自动生成的引用类型(Object、数组、Date等)的getter、setter方法会得到或通过对可变对象的引用操作而暴露代码内部实现,解决方法很多,只要返回的或赋值的对象不是原引用对象即可。
解决方法:
以Date类型为例:
public void setHappenTime(Date happenTime) {
if(happenTime != null){
this.happenTime = (Date) happenTime.clone();
}else{
this.happenTime = null;
}
}

扩展阅读:翻译成中文 ... 英文翻译中文在线翻译 ... 英转中翻译器 ... 中英转换器 ... 中英文自动翻译器 ... finish 中文翻译 ... 英译汉 ... figs 中文翻译 ... findchips ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网