FindBugs错误修改中文说明大全.docx
《FindBugs错误修改中文说明大全.docx》由会员分享,可在线阅读,更多相关《FindBugs错误修改中文说明大全.docx(171页珍藏版)》请在冰豆网上搜索。
FindBugs错误修改中文说明大全
FindBug错误修改中文说明大全
复制你的Patternid然后用Ctrl+F快速查找定位
Security关于代码安全性防护
序号
Description
备注
1.
Dm:
Hardcodedconstantdatabasepassword(DMI_CONSTANT_DB_PASSWORD)
代码中创建DB的密码时采用了写死的密码。
2.
Dm:
Emptydatabasepassword(DMI_EMPTY_DB_PASSWORD)
创建数据库连接时没有为数据库设置密码,这会使数据库没有必要的保护。
3.
HRS:
HTTPcookieformedfromuntrustedinput(HRS_REQUEST_PARAMETER_TO_COOKIE)
此代码使用不受信任的HTTP参数构造一个HTTPCookie。
4.
HRS:
HTTPResponsesplittingvulnerability(HRS_REQUEST_PARAMETER_TO_HTTP_HEADER)
在代码中直接把一个HTTP的参数写入一个HTTP头文件中,它为HTTP的响应暴露了漏洞。
5.
SQL:
NonconstantstringpassedtoexecutemethodonanSQLstatement(SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)
该方法以字符串的形式来调用SQLstatement的execute方法,它似乎是动态生成SQL语句的方法。
这会更容易受到SQL注入攻击。
6.
XSS:
JSPreflectedcrosssitescriptingvulnerability(XSS_REQUEST_PARAMETER_TO_JSP_WRITER)
在代码中在JSP输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞。
Experimental
序号
Description
备注
1.
LG:
PotentiallostloggerchangesduetoweakreferenceinOpenJDK(LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)
OpenJDK的引入了一种潜在的不兼容问题,特别是,java.util.logging.Logger的行为改变时。
它现在使用内部弱引用,而不是强引用。
–logger配置改变,它就是丢失对logger的引用,这本是一个合理的变化,但不幸的是一些代码对旧的行为有依赖关系。
这意味着,当进行垃圾收集时对logger配置将会丢失。
例如:
publicstaticvoidinitLogging()throwsException{
Loggerlogger=Logger.getLogger("edu.umd.cs");
logger.addHandler(newFileHandler());//calltochangeloggerconfiguration
logger.setUseParentHandlers(false);//anothercalltochangeloggerconfiguration
}
该方法结束时logger的引用就丢失了,如果你刚刚结束调用initLogging方法后进行垃圾回收,logger的配置将会丢失(因为只有保持记录器弱引用)。
publicstaticvoidmain(String[]args)throwsException{
initLogging();//addsafilehandlertothelogger
System.gc();//loggerconfigurationlost
Logger.getLogger("edu.umd.cs").info("Somemessage");//thisisn'tloggedtothefileasexpected
}
2.
OBL:
Methodmayfailtocleanupstreamorresource(OBL_UNSATISFIED_OBLIGATION)
这种方法可能无法清除(关闭,处置)一个流,数据库对象,或其他资源需要一个明确的清理行动。
一般来说,如果一个方法打开一个流或其他资源,该方法应该使用try/finally块来确保在方法返回之前流或资源已经被清除了。
这种错误模式基本上和OS_OPEN_STREAM和ODR_OPEN_DATABASE_RESOURCE错误模式相同,但是是在不同在静态分析技术。
我们正为这个错误模式的效用收集反馈意见。
Badpractice代码实现中的一些坏习惯
序号
Description
备注
1.
AM:
Createsanemptyjarfileentry(AM_CREATES_EMPTY_JAR_FILE_ENTRY)
调用putNextEntry()方法写入新的jar文件条目时立即调用closeEntry()方法。
这样会造成JarFile条目为空。
2.
AM:
Createsanemptyzipfileentry(AM_CREATES_EMPTY_ZIP_FILE_ENTRY)
调用putNextEntry()方法写入新的zip文件条目时立即调用closeEntry()方法。
这样会造成ZipFile条目为空。
3.
BC:
Equalsmethodshouldnotassumeanythingaboutthetypeofitsargument(BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)
equals(Objecto)方法不能对参数o的类型做任何的假设。
比较此对象与指定的对象。
当且仅当该参数不为null,并且是表示与此对象相同的类型的对象时,结果才为true。
4.
BC:
Randomobjectcreatedandusedonlyonce(DMI_RANDOM_USED_ONLY_ONCE)
随机创建对象只使用过一次就抛弃
5.
BIT:
Checkforsignofbitwiseoperation(BIT_SIGNED_CHECK)
检查位操作符运行是否合理
((event.detail&SWT.SELECTED)>0)
IfSWT.SELECTEDisanegativenumber,thisisacandidateforabug.EvenwhenSWT.SELECTEDisnotnegative,itseemsgoodpracticetouse'!
=0'insteadof'>0'.
6.
CN:
ClassimplementsCloneablebutdoesnotdefineoruseclonemethod(CN_IDIOM)
按照惯例,实现此接口的类应该使用公共方法重写Object.clone(它是受保护的),以获得有关重写此方法的详细信息。
此接口不包含clone方法。
因此,因为某个对象实现了此接口就克隆它是不可能的,应该实现此接口的类应该使用公共方法重写Object.clone
7.
CN:
clonemethoddoesnotcallsuper.clone()(CN_IDIOM_NO_SUPER_CALL)
一个非final类型的类定义了clone()方法而没有调用super.clone()方法。
例如:
B扩展自A,如果B中clone方法调用了spuer.clone(),而A中的clone没有调用spuer.clone(),就会造成结果类型不准确。
要求A的clone方法中调用spuer.clone()方法。
8.
CN:
Classdefinesclone()butdoesn'timplementCloneable(CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)
类中定义了clone方法但是它没有实现Cloneable接口
9.
Co:
AbstractclassdefinescovariantcompareTo()method(CO_ABSTRACT_SELF)
抽象类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型,如下例:
intcompareTo(To) 比较此对象与指定对象的顺序。
10.
Co:
CovariantcompareTo()methoddefined(CO_SELF_NO_OBJECT)
类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型
11.
DE:
Methodmightdropexception(DE_MIGHT_DROP)
方法可能抛出异常
12.
DE:
Methodmightignoreexception(DE_MIGHT_IGNORE)
方法可能忽略异常
13.
DMI:
Don'tuseremoveAlltoclearacollection(DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)
不要用removeAll方法去clear一个集合
14.
DP:
ClassloadersshouldonlybecreatedinsidedoPrivilegedblock(DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED)
类加载器只能建立在特殊的方法体内
15.
Dm:
MethodinvokesSystem.exit(...)(DM_EXIT)
在方法中调用System.exit(...)语句,考虑用RuntimeException来代替
16.
Dm:
MethodinvokesdangerousmethodrunFinalizersOnExit(DM_RUN_FINALIZERS_ON_EXIT)
在方法中调用了System.runFinalizersOnExit或者Runtime.runFinalizersOnExit方法,因为这样做是很危险的。
17.
ES:
ComparisonofStringparameterusing==or!
=(ES_COMPARING_PARAMETER_STRING_WITH_EQ)
用==或者!
=方法去比较String类型的参数
18.
ES:
ComparisonofStringobjectsusing==or!
=(ES_COMPARING_STRINGS_WITH_EQ)
用==或者!
=去比较String类型的对象
19.
Eq:
Abstractclassdefinescovariantequals()method(EQ_ABSTRACT_SELF)
20.
Eq:
Equalschecksfornoncompatibleoperand(EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)
equals方法检查不一致的操作。
两个类根本就是父子关系而去调用equals方法去判读对象是否相等。
publicbooleanequals(Objecto){
if(oinstanceofFoo)
returnname.equals(((Foo)o).name);
elseif(oinstanceofString)
returnname.equals(o);
elsereturnfalse;
21.
Eq:
ClassdefinescompareTo(...)andusesObject.equals()(EQ_COMPARETO_USE_OBJECT_EQUALS)
类中定义了compareTo方法但是继承了Object中的compareTo方法
22.
Eq:
equalsmethodfailsforsubtypes(EQ_GETCLASS_AND_CLASS_CONSTANT)
类中的equals方法可能被子类中的方法所破坏,当使用类似于Foo.class==o.getClass()的判断时考虑用this.getClass()==o.getClass()来替换
23.
Eq:
Covariantequals()methoddefined(EQ_SELF_NO_OBJECT)
类中定义了多个equals方法。
正确的做法是覆写Object中的equals方法,它的参数为Object类型的对象。
24.
FI:
Emptyfinalizershouldbedeleted(FI_EMPTY)
为空的finalizer方法应该删除。
一下关于finalizer的内容省略
25.
GC:
Uncheckedtypeingenericcall(GC_UNCHECKED_TYPE_IN_GENERIC_CALL)
ThiscalltoagenericcollectionmethodpassesanargumentwhilecompiletypeObjectwhereaspecifictypefromthegenerictypeparametersisexpected.Thus,neitherthestandardJavatypesystemnorstaticanalysiscanprovideusefulinformationonwhethertheobjectbeingpassedasaparameterisofanappropriatetype.
26.
HE:
Classdefinesequals()butnothashCode()(HE_EQUALS_NO_HASHCODE)
方法定义了equals方法却没有定义hashCode方法
27.
HE:
ClassdefineshashCode()butnotequals()(HE_HASHCODE_NO_EQUALS)
类定义了hashCode方法去没有定义equal方法
28.
HE:
Classdefinesequals()andusesObject.hashCode()(HE_EQUALS_USE_HASHCODE)
一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法
29.
HE:
Classinheritsequals()andusesObject.hashCode()(HE_INHERITS_EQUALS_USE_HASHCODE)
子类继承了父类的equals方法却使用了Object的hashCode方法
30.
IC:
Superclassusessubclassduringinitialization(IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)
子类在父类未初始化之前使用父类对象实例
publicclassCircularClassInitialization{
staticclassInnerClassSingletonextendsCircularClassInitialization{
staticInnerClassSingletonsingleton=newInnerClassSingleton();
}
staticCircularClassInitializationfoo=InnerClassSingleton.singleton;
}
31.
IMSE:
DubiouscatchingofIllegalMonitorStateException(IMSE_DONT_CATCH_IMSE)
捕捉违法的监控状态异常,例如当没有获取到对象锁时使用其wait和notify方法
32.
ISC:
Needlessinstantiationofclassthatonlysuppliesstaticmethods(ISC_INSTANTIATE_STATIC_CLASS)
为使用静态方法而创建一个实例对象。
调用静态方法时只需要使用类名+静态方法名就可以了。
33.
It:
Iteratornext()methodcan'tthrowNoSuchElementException(IT_NO_SUCH_ELEMENT)
迭代器的next方法不能够抛出NoSuchElementException
34.
J2EE:
StoreofnonserializableobjectintoHttpSession(J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)
在HttpSession对象中保存非连续的对象
35.
JCIP:
Fieldsofimmutableclassesshouldbefinal(JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS)
Theclassisannotatedwithnet.jcip.annotations.Immutable,andtherulesforthatannotationrequirethatallfieldsarefinal..
36.
NP:
MethodwithBooleanreturntypereturnsexplicitnull(NP_BOOLEAN_RETURN_NULL)
返回值为boolean类型的方法直接返回null,这样会导致空指针异常
37.
NP:
equals()methoddoesnotcheckfornullargument(NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)
变量调用equals方法时没有进行是否为null的判断
38.
NP:
toStringmethodmayreturnnull(NP_TOSTRING_COULD_RETURN_NULL)
toString方法可能返回null
39.
Nm:
Classnamesshouldstartwithanuppercaseletter(NM_CLASS_NAMING_CONVENTION)
类的名称以大写字母名称开头
40.
Nm:
ClassisnotderivedfromanException,eventhoughitisnamedassuch(NM_CLASS_NOT_EXCEPTION)
类的名称中含有Exception但是却不是一个异常类的子类,这种名称会造成混淆
41.
Nm:
Confusingmethodnames(NM_CONFUSING)
令人迷惑的方面命名
42.
Nm:
Fieldnamesshouldstartwithalowercaseletter(NM_FIELD_NAMING_CONVENTION)
非final类型的字段需要遵循驼峰命名原则
43.
Nm:
UseofidentifierthatisakeywordinlaterversionsofJava(NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)
验证是否是java预留关键字
44.
Nm:
UseofidentifierthatisakeywordinlaterversionsofJava(NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)
验证是否时java中的关键字
45.
Nm:
Methodnamesshouldstartwithalowercaseletter(NM_METHOD_NAMING_CONVENTION)
方法名称以小写字母开头
46.
Nm:
Classnamesshouldn'tshadowsimplenameofimplementedinterface(NM_SAME_SIMPLE_NAME_AS_INTERFACE)
实现同一接口实现类不能使用相同的名称,即使它们位于不同的包中
47.
Nm:
Classnamesshouldn'tshadowsimplenameofsuperclass(NM_SAME_SIMPLE_NAME_AS_SUPERCLASS)
继承同一父类的子类不能使用相同的名称,即使它们位于不同的包中
48.
Nm:
Veryconfusingmethodnames(butperhapsintentional)(NM_VERY_CONFUSING_INTENTIONAL)
很容易混淆的方法命名,例如方法的名称名称使用使用大小写来区别两个不同的方法。
49.
Nm:
Methoddoesn'toverridemethodinsuperclassduetowrongpackageforparameter(NM_WRONG_PACKAGE_INTENTIONAL)
由于错误引用了不同包中相同类名的对象而不能够正确的覆写父类中的方法
importalpha.Foo;
publicclassA{
publicintf(Foox){return17;}
}
importbeta.Foo;
publicclassBextendsA{
publicintf(Foox){return42;}
publicintf(alpha.Foox){return27;}
}
50.
ODR:
Methodmayfailtoclosedatabaseresource(ODR_OPEN_DATABASE_RESOURCE)
方法中可能存在关闭数据连接失败的情况
51.
OS:
Methodmayfail