题:
为什么maven PMD插件给出了以下代码行的以下警告:警告:
避免使用java.lang.ThreadGroup; 它不是线程安全的
代码(第二行):
Calendar cal = Calendar.getInstance();
java.sql.Date endDate = new java.sql.Date(cal.getTime().getTime());
Run Code Online (Sandbox Code Playgroud)
语境:
我有这个confit java.sql.Date实例:
public class XYZServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse resp)
throws ServletException, IOException {
Connection conn = null;
CallableStatement stmt = null;
try {
conn = ...
...
Calendar cal = Calendar.getInstance();
java.sql.Date endDate = new java.sql.Date(cal.getTime().getTime());
...
} catch ...
}finally {
try { …Run Code Online (Sandbox Code Playgroud) 在我的公司,我们开始使用CheckStyle,FindBugs和PMD来检查我们的代码质量并统一我们的编程风格.这些工具非常有效,但不幸的是它们有一些重叠的规则集.
是否有在线可用的配置删除了重叠规则?
当然,这些默认规则集并不适用于每个项目,但对我们来说这将是一个很好的起点.我们可以采用此默认(非重叠)配置并使其适应我们的样式,而不是首先修剪重复项的规则集.
我一直在经历像pmd,findbuigs这样的代码分析器.它们涵盖了许多案例,似乎很好用.但想知道是否有专门针对gwt代码的代码分析器?
在这一行:
public Map getAll(BusinessTargetPK pkBusinessTargetId) throws Exception
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
NPath复杂度为32,768(最大允许值为200)
在这一行:
public Map getAll( Long RLE_ROLE_ID ) throws Exception {
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
getAll()方法的NPath复杂度为2048
我完全不知道什么是NPath复杂性及其含义.
有人可以提供建议如何避免这种类型的错误?
如何使用最新版本的gradle为Android项目设置PMD,Findbugs和Checkstyle静态代码分析工具?我尝试了几件事,但我没有设法使它们工作.
谢谢
1.关于PMD:
1.1如何设置PMD检查,忽略其中的一些,例如"变量名太短或太长","删除空构造函数等" - 如果我这样做,会出现另一个警告,说该类必须有一些静态的方法.基本上,这个课程是空的,以便以后开发,我现在想把它留下来.
1.2遵循此警告建议是否必要?
A class which only has private constructors should be final
Run Code Online (Sandbox Code Playgroud)
1.3那是什么意思?
The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
Run Code Online (Sandbox Code Playgroud)
1.4这个怎么样?我很乐意改变这一点,但目前关于变化的事情并没有让我想到:
Assigning an Object to null is a code smell. Consider refactoring.
Run Code Online (Sandbox Code Playgroud)
2.关于FindBugs:
2.1写入静态字段是否真的那么糟糕,比它的声明要晚一些?以下代码给了我一个警告:
Main.appCalendar = Calendar.getInstance();
Main.appCalendar.setTimeInMillis(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)
哪里appCalendar是静态变量.
2.2此代码:
strLine = objBRdr.readLine().trim();
Run Code Online (Sandbox Code Playgroud)
发出警告:
Immediate dereference of the result of readLine()
Run Code Online (Sandbox Code Playgroud)
这里objBRdr是一个BufferedReader(FileReader).怎么会发生什么?readLine()可能是空的?代码嵌套在while (objBRdr.ready())测试中,到目前为止,我没有问题.
当我用以下代码替换代码时,Update1:2.2被修复了:
strLine = objBRdr.readLine();
if (strLine != null) { …Run Code Online (Sandbox Code Playgroud) 代码审查工具抱怨saveSafeScan中可能的空指针取消引用safeScanWarnings(...)在if行(safeScanWarnings!= Null&safeScanWarnings.size()> 0)
我想知道这怎么可能?这是因为我们通过引用返回集合吗?
protected void saveSafeScan(final Response response, final Dtec dtec) throws dtecException
{
Collection<String> safeScanWarnings = dtec.getSafeScanWarnings();
if (safeScanWarnings!=null && safeScanWarnings.size()>0)
{
Iterator<String> iterator = safeScanWarnings.iterator();
int i = 0;
while (iterator.hasNext())
{
String safeScanCode = iterator.next();
if (i == 0)
{
response.setSafeScanCode(safeScanCode);
response.setSafeScanCodeText(getMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s",
StringUtils.trimToEmpty(safeScanCode))));
}
SafeScanWarning safeScan = new SafeScanWarning();
safeScan.setCode(safeScanCode);
safeScan.setMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", StringUtils.trimToEmpty(safeScanCode)));
safeScan.setPriority(i);
response.getSafeScanWarnings().add(safeScan);
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我开始与Sonar一起冒险;)
具有默认配置的声纳在主要级别上设置了PMD UnnecessaryLocalBeforeReturn错误.
List<Todo> filtered = em.createQuery(query).getResultList();
return filtered;
Run Code Online (Sandbox Code Playgroud)
对我来说,我应该在一行中更改上面的代码.
这对我来说真的很有意思,因为我建议我的同事在返回之前将这个"不必要的"本地化.
我觉得它很容易调试.当我在返回线上设置断点时,我确信当我到达那里时,这个值将准备就绪,我不必对我的陈述进行选择或"逐步表达".
除此之外,我相信它对减少方法的回报点有积极的影响.
我的问题是:是否存在某种解释/讨论,为什么来自Checkstyle,PMD,FindBugs等项目的错误被认为是错误?
我想在使用gradle构建的企业项目中使用gradle PMD插件.
我有一个pmd_rules.xml已经可以工作的文件,但我不能添加自己的java规则(我得到一个类未找到异常).我按照它的网站上的教程.
我在哪里必须制定自己的规则,以便他们得到gradle和PMD的认可?有人已经做过类似的事吗?
pmd.gradle:
apply from: rootProject.file("core/modules.gradle"), to : ext
if(project.name in (modules["modules"] +modules["modules"])){
apply plugin: 'pmd'
pmd {
ignoreFailures = true
ruleSetFiles = rootProject.files("../repo/pmd_rules.xml")
sourceSets = [sourceSets.main,sourceSets.test]
targetJdk = org.gradle.api.plugins.quality.TargetJdk.VERSION_1_7
ruleSets = []
toolVersion = "5.0.5"
}
}
Run Code Online (Sandbox Code Playgroud) 我们使用PMD复制粘贴检测器(CPD)来分析我们的C和C++代码.但是,代码的一些部分非常相似,但有充分的理由,我们希望抑制这些部分的警告.
PMD CPD的文档仅提及有关注释的内容,但这对我们的这些语言不起作用.
我怎样才能忽略特定部件的警告?
也许有评论吗?
[更新]我正在使用以下Groovy脚本来运行CPD:
@GrabResolver(name = 'jcenter', root = 'https://jcenter.bintray.com/')
@Grab('net.sourceforge.pmd:pmd-core:5.4.+')
@Grab('net.sourceforge.pmd:pmd-cpp:5.4.+')
import net.sourceforge.pmd.cpd.CPD
import net.sourceforge.pmd.cpd.CPDConfiguration
import java.util.regex.Pattern
def tokens = 60
def scanDirs = ['./path/to/scan', './scan/this/too']
def ignores = [
'./ignore/this/path',
'./this/must/be/ignored/too'
].collect({ it.replace('/', File.separator) })
def rootDir = new File('.')
def outputDir = new File('./reports/analysis/')
def filename_date_format = 'yyyyMMdd'
def encoding = System.getProperty('file.encoding')
def language_converter = new CPDConfiguration.LanguageConverter()
def config = new CPDConfiguration()
config.language = new CPDConfiguration.LanguageConverter().convert('c')
config.minimumTileSize = tokens
config.renderer = …Run Code Online (Sandbox Code Playgroud)