根据工具PMD,以下是一个不好的做法:
String s = "" + 123; // bad
String t = Integer.toString(456); // ok
This is an inefficient way to convert any type to a `String`.
Run Code Online (Sandbox Code Playgroud)
为什么这样做不好?
我有以下JUnit测试.我正在测试的方法很简单,它只接收一个数字并返回一个带有除数的List.我不想多次重复测试代码,所以我创建了一个辅助方法,testDivisorsAux:
@Test
public final void testDivisors() {
testDivisorsAux(1, new int[] { 1 });
testDivisorsAux(6, new int[] { 1, 2, 3, 6 });
testDivisorsAux(0, new int[] { });
...
}
private final void testDivisorsAux(final int number, final int[] expected) {
List<Integer> divisors = Util.divisors(number);
assertSame(divisors.size(), expected.length);
for (int i : expected) {
assertTrue(divisors.contains(i));
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,我只是想知道...... 这是一个不好的做法吗?我应该以不同的方式编写测试吗?也许将所有代码保留在" @Test方法"中?
PMD告诉我JUnit测试应该包括assert()或fail()(对于第一个方法),执行测试的JUnit 4测试应该使用@Test注释(对于第二个).我知道PMD只使用正则表达式(好吧,实际上是XPath)来确定我正在破坏哪些规则......所以我倾向于认为它只是一个"误报"警告.但无论如何,我想知道我做错了什么.(公寓写作测试的时间比测试方法长4倍:)
当我在寻找类似于这个的问题时,我发现了一些叫做参数化测试的东西......但它似乎是面向更大场景的东西,不是吗?
目前,我正在为一个小组工作,在这个小组中,必须通过静态代码分析工具分析多个项目的源代码(Java)
但我想编写自定义规则,我可以添加到工具提供的现有规则集中(规则将主要涉及在源代码中匹配文本/字符串的正则表达式).
特别是保持我应该能够轻松编写/添加我自己的自定义规则的观点,这些规则可以与工具的现有规则列表一起使用.
任何人都可以建议我应该使用下面给出的列表中的哪个工具(或工具组合)?
编辑:谢谢艾拉的方向.我正在寻找与Sonar一起使用的静态代码分析工具.我希望现在的问题很明确.
假设我的库中有两种方法:
void com.somepackage.SomeClass.someSink(String s)
和
int com.someotherpackage.SomeOtherClass.someSource(int i)
第一种方法用作数据接收器,第二种方法用作我的代码中的数据源.类型参数int, String仅作为示例给出,并且可能在实际情况中改变.
我想在一些代码中检测这些方法的用法,这些代码满足下面给出的某种模式:
x)是由源生成的y)是使用一系列转换生成的f1(f2(... fn(x))y 给了水槽.只要存在从生成接收器数据的函数的调用序列到从源接收数据的函数,转换就可以是任意函数.这些函数也可以采用任何其他参数,并用作黑盒子.
扫描可以是源或字节码级别.有哪些工具可用于此类分析?
首选基于非IDE的工具和Java API.
[编辑:]澄清更多,someSink并someSource分别是类SomeSome和语言中的任意方法名称SomeOtherClass.它们可能是也可能不是static,可以采用任意数量的参数(我应该能够定义).参数的类型也不是任意的.唯一的要求是该工具应扫描代码并输出模式出现的行号.所以这个工具可能会这样工作:
示例输出:
MyClass1.java:12: value1 = com.someotherpackage.SomeOtherClass.someSource(...)
MyClass2.java:23: value2 = foo(value1, ...)
MyClass3.java:3: value3 = bar(value2)
MyClass4.java:22: com.somepackage.SomeClass.someSink(value3, ...)
Run Code Online (Sandbox Code Playgroud)
注意:如果函数不接受参数但对数据有一些副作用,则还需要考虑.(示例a = source(); void foo(){ c = a+b }; foo(); sink(c)是需要捕获的模式.)
这是我们写的一段代码:
public CustomerTO getCustomerByCustDel(final String cust, final int del)
throws SQLException {
final PreparedStatement query = getFetchByCustDel();
ResultSet records = null;
try {
query.setString(1, cust);
query.setInt(2, del);
records = query.executeQuery();
return this.getCustomer(records);
} finally {
if (records != null) {
records.close();
}
query.close();
}
}
如果省略'finally'块,则会使数据库资源悬空,这显然是一个潜在的问题.但是,如果您执行我在此处所做的操作 - 在**try**块之外将ResultSet设置为null,然后将其设置为块内所需的值 - PMD报告'DD异常'.在文档中,DD异常描述如下:
DataflowAnomalyAnalysis:数据流分析跟踪数据流上不同路径上的变量的本地定义,未定义和引用.从这些信息中可以发现各种问题.[...] DD - 异常:重新定义了最近定义的变量.这是不祥的,但不一定是一个错误.
如果在块之外声明ResultSet而不设置值,则在执行if(记录!= null)测试时,正确地得到"变量可能尚未初始化"错误.
现在,在我看来,我在这里使用不是一个错误.但有没有一种干净的重写方式,不会触发PMD警告?我并不特别想要禁用PMD的DataFlowAnomalyAnalysis规则,因为识别UR和DU异常实际上是有用的; 但是这些DD异常让我怀疑自己可以做得更好 - 而且,如果没有更好的方法可以做到这一点,那么它们就会变得混乱(我应该看看是否可以重写PMD规则)
我最近从Eclipse(针对Java/EE开发人员,x64)"Indigo"升级到"Juno".不幸的是,PMD-Plugin(http://marketplace.eclipse.org/content/pmd-eclipse)似乎不适用于此产品.
我无法找到另一种方法将此产品安装到我的新日食中,任何人都可以帮助解决这个问题吗?
我PMD在我的Java项目中使用代码审查.
只是想知道"PMD"的缩写词.我在谷歌搜索但找不到任何东西.有人知道吗?
谁能告诉我如何在Eclipse中安装PMD.我从以下链接下载了PMD 5.0.4:
http://sourceforge.net/projects/pmd/files/latest/download?source=files
当我在Eclipse安装选项中添加此存档文件时,我收到一条错误,指出"它无法找到指定的文件".
在我最近的项目中,我遇到了编译完全正常的代码,但对任何读者来说都是非常令人惊讶的,不应该通过静态分析.
class BracketsAfterMethodSignature {
Object emptyArray()[] {
return new Object[]{};
}
}
Run Code Online (Sandbox Code Playgroud)
我们使用Checkstyle,PMD,ErrorProne和SonarLint,但这些工具都没有抱怨这样的构造.是否有可以启用的规则或可用于阻止此类代码的工具?
显然,Checkstyle的ArrayTypeStyle不包括这种情况.
PMD 失败:...规则:UnusedPrivateMethod 优先级:3 避免未使用的私有方法,例如“printMyString(String)”
private void anyMethod() {
var myString = "a String";
printMyString(myString);
}
private void printMyString(String string) {
System.out.println(string);
}
Run Code Online (Sandbox Code Playgroud)
使用maven这个插件
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.12.0</version>
Run Code Online (Sandbox Code Playgroud) pmd ×10
java ×6
findbugs ×3
checkstyle ×2
eclipse ×2
dataflow ×1
eclipse-juno ×1
errorprone ×1
java-11 ×1
jdbc ×1
junit ×1
sonarlint ×1
sonarqube ×1
string ×1
tostring ×1