FindBugs规则整理 中文版.docx
- 文档编号:4164066
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:79
- 大小:43.58KB
FindBugs规则整理 中文版.docx
《FindBugs规则整理 中文版.docx》由会员分享,可在线阅读,更多相关《FindBugs规则整理 中文版.docx(79页珍藏版)》请在冰豆网上搜索。
FindBugs规则整理中文版
规则整理
规则整理
Findbugs中把影响代码质量分为以下几个部分:
Security关于代码安全性防护
序号
Description
备注
Dm:
Hardcodedconstantdatabasepassword(DMI_CONSTANT_DB_PASSWORD)
代码中创建DB的密码时采用了写死的密码。
Dm:
Emptydatabasepassword(DMI_EMPTY_DB_PASSWORD)
创建数据库连接时没有为数据库设置密码,这会使数据库没有必要的保护。
HRS:
HTTPcookieformedfromuntrustedinput(HRS_REQUEST_PARAMETER_TO_COOKIE)
此代码使用不受信任的HTTP参数构造一个HTTPCookie。
HRS:
HTTPResponsesplittingvulnerability(HRS_REQUEST_PARAMETER_TO_HTTP_HEADER)
在代码中直接把一个HTTP的参数写入一个HTTP头文件中,它为HTTP的响应暴露了漏洞。
SQL:
NonconstantstringpassedtoexecutemethodonanSQLstatement(SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)
该方法以字符串的形式来调用SQLstatement的execute方法,它似乎是动态生成SQL语句的方法。
这会更容易受到SQL注入攻击。
XSS:
JSPreflectedcrosssitescriptingvulnerability(XSS_REQUEST_PARAMETER_TO_JSP_WRITER)
在代码中在JSP输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞。
Experimental
序号
Description
备注
LG:
PotentiallostloggerchangesduetoweakreferenceinOpenJDK(LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)
OpenJDK的引入了一种潜在的不兼容问题,特别是,的行为改变时。
它现在使用内部弱引用,而不是强引用。
–logger配置改变,它就是丢失对logger的引用,这本是一个合理的变化,但不幸的是一些代码对旧的行为有依赖关系。
这意味着,当进行垃圾收集时对logger配置将会丢失。
例如:
publicstaticvoidinitLogging()throwsException{
Loggerlogger=("");
(newFileHandler());nfo("Somemessage");
Evenwhenisnotnegative,itseemsgoodpracticetouse'!
=0'insteadof'>0'.
CN:
ClassimplementsCloneablebutdoesnotdefineoruseclonemethod(CN_IDIOM)
按照惯例,实现此接口的类应该使用公共方法重写(它是受保护的),以获得有关重写此方法的详细信息。
此接口不包含clone方法。
因此,因为某个对象实现了此接口就克隆它是不可能的,应该实现此接口的类应该使用公共方法重写
CN:
clonemethoddoesnotcall()(CN_IDIOM_NO_SUPER_CALL)
一个非final类型的类定义了clone()方法而没有调用()方法。
例如:
B扩展自A,如果B中clone方法调用了(),而A中的clone没有调用(),就会造成结果类型不准确。
要求A的clone方法中调用()方法。
CN:
Classdefinesclone()butdoesn'timplementCloneable(CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)
类中定义了clone方法但是它没有实现Cloneable接口
Co:
AbstractclassdefinescovariantcompareTo()method(CO_ABSTRACT_SELF)
抽象类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型,如下例:
intcompareTo(To) 比较此对象与指定对象的顺序。
Co:
CovariantcompareTo()methoddefined(CO_SELF_NO_OBJECT)
类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型
DE:
Methodmightdropexception(DE_MIGHT_DROP)
方法可能抛出异常
DE:
Methodmightignoreexception(DE_MIGHT_IGNORE)
方法可能忽略异常
DMI:
Don'tuseremoveAlltoclearacollection(DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)
不要用removeAll方法去clear一个集合
DP:
ClassloadersshouldonlybecreatedinsidedoPrivilegedblock(DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED)
类加载器只能建立在特殊的方法体内
Dm:
Methodinvokes(...)(DM_EXIT)
在方法中调用(...)语句,考虑用RuntimeException来代替
Dm:
MethodinvokesdangerousmethodrunFinalizersOnExit(DM_RUN_FINALIZERS_ON_EXIT)
在方法中调用了或者方法,因为这样做是很危险的。
ES:
ComparisonofStringparameterusing==or!
=(ES_COMPARING_PARAMETER_STRING_WITH_EQ)
用==或者!
=方法去比较String类型的参数
ES:
ComparisonofStringobjectsusing==or!
=(ES_COMPARING_STRINGS_WITH_EQ)
用==或者!
=去比较String类型的对象
Eq:
Abstractclassdefinescovariantequals()method(EQ_ABSTRACT_SELF)
Eq:
Equalschecksfornoncompatibleoperand(EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)
equals方法检查不一致的操作。
两个类根本就是父子关系而去调用equals方法去判读对象是否相等。
publicbooleanequals(Objecto){
if(oinstanceofFoo)
return(((Foo)o).name);
elseif(oinstanceofString)
return(o);
elsereturnfalse;
Eq:
ClassdefinescompareTo(...)anduses()(EQ_COMPARETO_USE_OBJECT_EQUALS)
类中定义了compareTo方法但是继承了Object中的compareTo方法
Eq:
equalsmethodfailsforsubtypes(EQ_GETCLASS_AND_CLASS_CONSTANT)
类中的equals方法可能被子类中的方法所破坏,当使用类似于==()的判断时考虑用()==()来替换
Eq:
Covariantequals()methoddefined(EQ_SELF_NO_OBJECT)
类中定义了多个equals方法。
正确的做法是覆写Object中的equals方法,它的参数为Object类型的对象。
FI:
Emptyfinalizershouldbedeleted(FI_EMPTY)
为空的finalizer方法应该删除。
一下关于finalizer的内容省略
GC:
Uncheckedtypeingenericcall(GC_UNCHECKED_TYPE_IN_GENERIC_CALL)
ThiscalltoagenericcollectionmethodpassesanargumentwhilecompiletypeObjectwhereaspecifictypefromthegenerictypeparametersisexpected.Thus,neitherthestandardJavatypesystemnorstaticanalysiscanprovideusefulinformationonwhethertheobjectbeingpassedasaparameterisofanappropriatetype.
HE:
Classdefinesequals()butnothashCode()(HE_EQUALS_NO_HASHCODE)
方法定义了equals方法却没有定义hashCode方法
HE:
ClassdefineshashCode()butnotequals()(HE_HASHCODE_NO_EQUALS)
类定义了hashCode方法去没有定义equal方法
HE:
Classdefinesequals()anduses()(HE_EQUALS_USE_HASHCODE)
一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法
HE:
Classinheritsequals()anduses()(HE_INHERITS_EQUALS_USE_HASHCODE)
子类继承了父类的equals方法却使用了Object的hashCode方法
IC:
Superclassusessubclassduringinitialization(IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)
子类在父类未初始化之前使用父类对象实例
publicclassCircularClassInitialization{
staticclassInnerClassSingletonextendsCircularClassInitialization{
staticInnerClassSingletonsingleton=newInnerClassSingleton();
}
staticCircularClassInitializationfoo=;
}
IMSE:
DubiouscatchingofIllegalMonitorStateException(IMSE_DONT_CATCH_IMSE)
捕捉违法的监控状态异常,例如当没有获取到对象锁时使用其wait和notify方法
ISC:
Needlessinstantiationofclassthatonlysuppliesstaticmethods(ISC_INSTANTIATE_STATIC_CLASS)
为使用静态方法而创建一个实例对象。
调用静态方法时只需要使用类名+静态方法名就可以了。
It:
Iteratornext()methodcan'tthrowNoSuchElementException(IT_NO_SUCH_ELEMENT)
迭代器的next方法不能够抛出NoSuchElementException
J2EE:
StoreofnonserializableobjectintoHttpSession(J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)
在HttpSession对象中保存非连续的对象
JCIP:
Fieldsofimmutableclassesshouldbefinal(JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS)
Theclassisannotatedwithandtherulesforthatannotationrequirethatallfieldsarefinal..
NP:
MethodwithBooleanreturntypereturnsexplicitnull(NP_BOOLEAN_RETURN_NULL)
返回值为boolean类型的方法直接返回null,这样会导致空指针异常
NP:
equals()methoddoesnotcheckfornullargument(NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)
变量调用equals方法时没有进行是否为null的判断
NP:
toStringmethodmayreturnnull(NP_TOSTRING_COULD_RETURN_NULL)
toString方法可能返回null
Nm:
Classnamesshouldstartwithanuppercaseletter(NM_CLASS_NAMING_CONVENTION)
类的名称以大写字母名称开头
Nm:
ClassisnotderivedfromanException,eventhoughitisnamedassuch(NM_CLASS_NOT_EXCEPTION)
类的名称中含有Exception但是却不是一个异常类的子类,这种名称会造成混淆
Nm:
Confusingmethodnames(NM_CONFUSING)
令人迷惑的方面命名
Nm:
Fieldnamesshouldstartwithalowercaseletter(NM_FIELD_NAMING_CONVENTION)
非final类型的字段需要遵循驼峰命名原则
Nm:
UseofidentifierthatisakeywordinlaterversionsofJava(NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)
验证是否是java预留关键字
Nm:
UseofidentifierthatisakeywordinlaterversionsofJava(NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)
验证是否时java中的关键字
Nm:
Methodnamesshouldstartwithalowercaseletter(NM_METHOD_NAMING_CONVENTION)
方法名称以小写字母开头
Nm:
Classnamesshouldn'tshadowsimplenameofimplementedinterface(NM_SAME_SIMPLE_NAME_AS_INTERFACE)
实现同一接口实现类不能使用相同的名称,即使它们位于不同的包中
Nm:
Classnamesshouldn'tshadowsimplenameofsuperclass(NM_SAME_SIMPLE_NAME_AS_SUPERCLASS)
继承同一父类的子类不能使用相同的名称,即使它们位于不同的包中
Nm:
Veryconfusingmethodnames(butperhapsintentional)(NM_VERY_CONFUSING_INTENTIONAL)
很容易混淆的方法命名,例如方法的名称名称使用使用大小写来区别两个不同的方法。
Nm:
Methoddoesn'toverridemethodinsuperclassduetowrongpackageforparameter(NM_WRONG_PACKAGE_INTENTIONAL)
由于错误引用了不同包中相同类名的对象而不能够正确的覆写父类中的方法
import;
publicclassA{
publicintf(Foox){return17;}
}
import;
publicclassBextendsA{
publicintf(Foox){return42;}
publicintfx){return27;}
}
ODR:
Methodmayfailtoclosedatabaseresource(ODR_OPEN_DATABASE_RESOURCE)
方法中可能存在关闭数据连接失败的情况
OS:
Methodmayfailtoclosestream(OS_OPEN_STREAM)
方法中可能存在关闭流失败的情况
OS:
Methodmayfailtoclosestreamonexception(OS_OPEN_STREAM_EXCEPTION_PATH)
方法中可能存在关闭流时出现异常情况
RC:
Suspiciousreferencecomparisontoconstant(RC_REF_COMPARISON_BAD_PRACTICE)
当两者为不同类型的对象时使用equals方法来比较它们的值是否相等,而不是使用==方法。
例如比较的两者为
SuspiciousreferencecomparisonofBooleanvalues(RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN)
使用==或者!
=操作符来比较两个Boolean类型的对象,建议使用equals方法。
RR:
Methodignoresresultsof()(RR_NOT_CHECKED)
方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。
RR:
Methodignoresresultsof()(SR_NOT_CHECKED)
()方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户跳过少量字符请求的情况
RV:
Methodignoresexceptionalreturnvalue(RV_RETURN_VALUE_IGNORED_BAD_PRACTICE)
方法忽略返回值的异常信息
SI:
Staticinitializercreatesinstancebeforeallstaticfinalfieldsassigned(SI_INSTANCE_BEFORE_FINALS_ASSIGNED)
在所有的staticfinal字段赋值之前去使用静态初始化的方法创建一个类的实例。
Se:
Non-serializablevaluestoredintoinstancefieldofaserializableclass(SE_BAD_FIELD_STORE)
非序列化的值保存在声明为序列化的的非序列化字段中
Se:
Comparatordoesn'timplementSerializable(SE_COMPARATOR_SHOULD_BE_SERIALIZABLE)
Comparator接口没有实现Serializable接口
Se:
Serializableinnerclass(SE_INNER_CLASS)
序列化内部类
Se:
serialVersionUIDisn'tfinal(SE_NONFINAL_SERIALVERSIONID)
关于UID类的检查内容省略
Se:
ClassisSerializablebutitssuperclassdoesn'tdefineavoidconstructor(SE_NO_SUITABLE_CONSTRUCTOR)
子类序列化时父类没有提供一个void的构造函数
Se:
ClassisExternalizablebutdoesn'tdefineavoidconstructor(SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION)
Externalizable实例类没有定义一个void类型的构造函数
Se:
ThereadResolvemethodmustbedeclaredwithareturntypeofObject.(SE_READ_RESOLVE_MUST_RETURN_OBJECT)
readResolve从流中读取类的一个实例,此方法必须声明返回一个Object类型的对象
Se:
Transientfieldthatisn'tsetbydeserialization.(SE_TRANSIENT_FIELD_NOT_RESTORED)
Thisclasscontainsafieldthatisupdatedatmultipleplacesintheclass,thusitseemstobepartofthestateoftheclass.However,sincethefieldismarkedastransientandnotsetinreadObjectorreadResolve,itwillcontainthedefaultvalueinanydeserializedinst
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FindBugs规则整理 中文版 FindBugs 规则 整理
![提示](https://static.bdocx.com/images/bang_tan.gif)