diff --git a/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql b/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql index 42fd2049289..3111c704b4d 100644 --- a/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql +++ b/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql @@ -16,14 +16,19 @@ ClassOrInterface getTaggedType(ThrowsTag tag) { result = tag.getFile().(CompilationUnit).getATypeInScope() } +predicate canThrow(Callable callable, Class exception) { + exception instanceof UncheckedThrowableType + or + callable.getAnException().getType().getADescendant() = exception +} + // Uses ClassOrInterface as type for thrownType to also cover case where erroneously an interface // type is declared as thrown exception from ThrowsTag throwsTag, ClassOrInterface thrownType, Callable docMethod where getTaggedType(throwsTag) = thrownType and docMethod.getDoc().getJavadoc().getAChild*() = throwsTag and - not thrownType instanceof UncheckedThrowableType and - not docMethod.getAnException().getType().getADescendant() = thrownType + not canThrow(docMethod, thrownType) select throwsTag, "Javadoc for " + docMethod + " claims to throw " + thrownType.getName() + " but this is impossible."