对于PMD,如果要忽略特定警告,可以使用// NOPMD
该行来忽略该行.
FindBugs有类似的东西吗?
是否可以关闭特定代码块的声纳(www.sonarsource.org)测量值,哪一个不想测量?
一个例子是Findbugs输出的"保留堆栈跟踪"警告.离开服务器时,我可能只想将消息传递回客户端,不包括我刚捕获的实际异常,如果客户端不知道该异常(因为客户端没有JAR,那么例如包含例外).
有一个问题比较PMD和CheckStyle.但是,我找不到PMD和FindBugs之间差异/相似性的细分.我认为一个关键的区别是PMD适用于源代码,而FindBugs适用于编译的字节码文件.但就能力而言,它应该是一种选择还是选择,还是相互补充?
我们正在从头开始研究一个Web项目,并且正在研究以下静态代码分析工具.
该项目建立在Maven之上.我没有使用多种工具来实现这一目的,而是在寻找一个灵活的解决方案并且遇到了SonarQube.
我们是否可以通过SonarQube实现Checkstyle,PMD和Findbugs的结果?
我们将静态分析工具引入到我们的Java产品的构建系统中.我们正在使用Maven2,因此Checkstyle和PMD集成是免费的.然而,就强制执行基本样式规则而言,这两个工具之间的功能似乎存在很大的重叠.
利用这两者有益处吗?我不想维护2个工具,如果一个工作.如果我们选择一个,我们应该使用哪一个?为什么?
我们还计划使用FindBugs.我们应该看看其他静态分析工具吗?
更新:共识似乎是PMD比CheckStyle更受欢迎.我没有看到使用两者的充分理由,我不想维护2套规则文件,因此我们可能会专门针对PMD.我们还将引入FindBugs,也许最终,Macker将实施架构规则.
考虑下面的课程.如果我针对它运行Findbugs,它将在第5行给出一个错误("可序列化类中的非瞬态非可序列化实例字段")但不在第7行.
1 public class TestClass implements Serializable {
2
3 private static final long serialVersionUID = 1905162041950251407L;
4
5 private Set<Integer> mySet; // Findbugs error
6
7 private HashSet<Integer> myOtherSet;
8
9 }
Run Code Online (Sandbox Code Playgroud)
这是正确的,因为java.util.Set从不在其层次结构中实现Serializable,而java.util.HashSet也是如此.但是,最佳做法是针对接口而不是具体实现进行编码.
我怎样才能最好地处理这件事?
我可以在第3行添加@Suppresswarnings(justification ="No bug",values ="SE_BAD_FIELD").我的实际代码中有很多集合和列表,我担心它会丢失我的代码太多.
还有更好的方法吗?
Findbug告诉我,我使用了不正确的延迟初始化.
public static Object getInstance() {
if (instance != null) {
return instance;
}
instance = new Object();
return instance;
}
Run Code Online (Sandbox Code Playgroud)
我没有看到任何错误.这是findbug的错误行为,还是我错过了什么?
我正在从FindBugs获得以下bug,
发现依赖于MyClass.print(String)中的默认编码:String.getBytes()
方法
protected void print (String str) {
{
private OutputStream outStream = null;
.....
outStream.write(str.getBytes());
.......
}
Run Code Online (Sandbox Code Playgroud)
请告诉我这是什么错误?我们如何解决这个问题?
提前致谢
使用Gradle FindBugs插件,如何以HTML格式生成输出?
该FindBugsExtension确实有一些配置设置.
findbugs {
toolVersion = "2.0.1"
sourceSets = [sourceSets.main]
ignoreFailures = true
reportsDir = file("$project.buildDir/findbugsReports")
effort = "max"
reportLevel = "high"
visitors = ["FindSqlInjection", "SwitchFallthrough"]
omitVisitors = ["FindNonShortCircuit"]
includeFilter = file("$rootProject.projectDir/config/findbugs/includeFilter.xml")
excludeFilter = file("$rootProject.projectDir/config/findbugs/excludeFilter.xml")
}
Run Code Online (Sandbox Code Playgroud)
但是没有输出属性可以设置为findbugs anttask.
我一直在对我们的宠物项目之一进行代码审查(主要使用像FindBugs这样的工具),FindBugs将以下代码标记为错误(伪代码):
Connection conn = dataSource.getConnection();
try{
PreparedStatement stmt = conn.prepareStatement();
//initialize the statement
stmt.execute();
ResultSet rs = stmt.getResultSet();
//get data
}finally{
conn.close();
}
Run Code Online (Sandbox Code Playgroud)
错误是此代码可能不会释放资源.我发现ResultSet和Statement没有关闭,所以我最后关闭了它们:
finally{
try{
rs.close()
}catch(SqlException se){
//log it
}
try{
stmt.close();
}catch(SqlException se){
//log it
}
conn.close();
}
Run Code Online (Sandbox Code Playgroud)
但是我在很多项目中遇到过上述模式(来自不少公司),没有人关闭ResultSet或Statements.
在Connection关闭时,您是否遇到没有关闭ResultSet和Statements的麻烦?
我发现只有这个,它指的是Oracle在关闭Connections时关闭ResultSet的问题(我们使用Oracle db,因此我的更正).java.sql.api在Connection.close()javadoc中什么也没说.