FindBugs规则整理_中文版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

FindBugs1.3.9规则整理Findbugs中把影响代码质量分为以下几个部分: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());//calltochangeloggerconfigurationlogger.setUseParentHandlers(false);//anothercalltochangeloggerconfiguration}该方法结束时logger的引用就丢失了,如果你刚刚结束调用initLogging方法后进行垃圾回收,logger的配置将会丢失(因为只有保持记录器弱引用)。publicstaticvoidmain(String[]args)throwsException{initLogging();//addsafilehandlertotheloggerSystem.gc();//loggerconfigurationlostLogger.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.clone7.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类

1 / 63
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功