Affects PMD Version:
6.27.0
Description:
NPE in TypeTestUtil::isA("any", anonymousTypeNode)
Problematic code is https://github.com/pmd/pmd/blob/master/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/TypeTestUtil.java#L178
Because an anonymous class does not have a canonical name, this method fails with NPE.
Exception Stacktrace:
java.lang.NullPointerException
at net.sourceforge.pmd.lang.java.types.TypeTestUtil.isExactlyA (TypeTestUtil.java:178)
at net.sourceforge.pmd.lang.java.rule.errorprone.CloseResourceRule.isAllowedResourceType (CloseResourceRule.java:291)
at net.sourceforge.pmd.lang.java.rule.errorprone.CloseResourceRule.isNotAllowedResourceType (CloseResourceRule.java:282)
at net.sourceforge.pmd.lang.java.rule.errorprone.CloseResourceRule.shouldVarOfTypeBeClosedInMethod (CloseResourceRule.java:277)
at net.sourceforge.pmd.lang.java.rule.errorprone.CloseResourceRule.checkForResources (CloseResourceRule.java:166)
at net.sourceforge.pmd.lang.java.rule.errorprone.CloseResourceRule.visit (CloseResourceRule.java:153)
at net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration.jjtAccept (ASTMethodDeclaration.java:37)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:220)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:267)
at net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBodyDeclaration.jjtAccept (ASTClassOrInterfaceBodyDeclaration.java:44)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:220)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:262)
at net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceBody.jjtAccept (ASTClassOrInterfaceBody.java:35)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:220)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:232)
at net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration.jjtAccept (ASTClassOrInterfaceDeclaration.java:56)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:220)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:417)
at net.sourceforge.pmd.lang.java.ast.ASTTypeDeclaration.jjtAccept (ASTTypeDeclaration.java:39)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:220)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visit (AbstractJavaRule.java:392)
at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.jjtAccept (ASTCompilationUnit.java:44)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.visitAll (AbstractJavaRule.java:163)
at net.sourceforge.pmd.lang.java.rule.AbstractJavaRule.apply (AbstractJavaRule.java:157)
at net.sourceforge.pmd.lang.rule.AbstractDelegateRule.apply (AbstractDelegateRule.java:336)
at net.sourceforge.pmd.RuleSet.apply (RuleSet.java:575)
at net.sourceforge.pmd.RuleSets.apply (RuleSets.java:148)
at net.sourceforge.pmd.SourceCodeProcessor.processSource (SourceCodeProcessor.java:194)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCodeWithoutCache (SourceCodeProcessor.java:107)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode (SourceCodeProcessor.java:89)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode (SourceCodeProcessor.java:51)
at net.sourceforge.pmd.processor.PmdRunnable.call (PmdRunnable.java:78)
at net.sourceforge.pmd.processor.PmdRunnable.call (PmdRunnable.java:24)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:511)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:624)
at java.lang.Thread.run (Thread.java:748)
Code Sample demonstrating the issue:
@Test
public void testBundleReloadUrlNotNull() throws IOException {
final AtomicBoolean closed = new AtomicBoolean();
final InputStream inputStream = new InputStream() {
@Override
public int read() {
return -1;
}
@Override
public void close() {
closed.set(true);
}
};
final URLConnection urlConnection = new URLConnection(null) {
@Override
public void connect() {
// no code
}
@Override
public InputStream getInputStream() {
return inputStream;
}
};
final URL url = new URL("test", null, 0, "", new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) {
return urlConnection;
}
});
final LocalizedMessage.Utf8Control control = new LocalizedMessage.Utf8Control();
final ResourceBundle bundle = control.newBundle(
"com.puppycrawl.tools.checkstyle.checks.coding.messages", Locale.ENGLISH,
"java.class", new TestUrlsClassLoader(url), true);
assertNotNull(bundle, "Bundle should not be null when stream is not null");
assertFalse(urlConnection.getUseCaches(), "connection should not be using caches");
assertTrue(closed.get(), "connection should be closed");
}
Steps to reproduce:
Failed build: https://travis-ci.org/github/checkstyle/checkstyle/jobs/722974486
Full source of LocalizedMessageTest.java
mvn -e clean test-compile pmd:check spotbugs:check
on latest checkstyle master
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4