typetools / checker-framework

Pluggable type-checking for Java
http://checkerframework.org/
Other
990 stars 347 forks source link

The checker fails to analyze new in map javax annotations #2536

Closed akryzhn closed 4 years ago

akryzhn commented 4 years ago

Checkerframework doesn't seem to like embedded validation annotations as you see for the Map Strings in the example below.

@Size(max = 30, message = "msg")
public Map<@Size(max = 40, message = "msg") String,
                   @AllowableValues({"on", "off"}) String> channelPermissions;

I get the following error from checkergramework:

error: org.checkerframework.framework.util.element.MethodApplier.handleInvalid: Invalid variable and element passed to extractAndApply; type: Map getAndroidNotificationChannelPermissions(MobileDeviceItem this), element: getAndroidNotificationChannelPermissions() (kind: METHOD), invalid annotations: @javax.validation.constraints.Size(max=40, message="msg"), @com.zillow.request.validator.AllowableValues({"on", "off"})
  Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS; Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER
  Compilation unit: /Users/annad/git/services/mobile-device-service/src/main/java/com/zillow/mobiledevice/service/lib/AllowableFieldsValidator.java
  Last visited tree at line 8 column 1:
  public final class AllowableFieldsValidator implements ConstraintValidator<AllowableFields, MobileDeviceItem> {
  Exception: java.lang.Throwable; Stack trace: org.checkerframework.javacutil.BugInCF.<init>(BugInCF.java:14)
  org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.handleInvalid(TargetedElementAnnotationApplier.java:135)
  org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.extractAndApply(TargetedElementAnnotationApplier.java:199)
  org.checkerframework.framework.util.element.MethodApplier.extractAndApply(MethodApplier.java:119)
  org.checkerframework.framework.util.element.MethodApplier.apply(MethodApplier.java:30)
  org.checkerframework.framework.type.ElementAnnotationApplier.apply(ElementAnnotationApplier.java:82)
  org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:74)
  org.checkerframework.framework.type.TypeFromMemberVisitor.visitMethod(TypeFromMemberVisitor.java:23)
  com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:800)
  com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:53)
  org.checkerframework.framework.type.TypeFromTree.fromMember(TypeFromTree.java:50)
  org.checkerframework.framework.type.AnnotatedTypeFactory.fromMember(AnnotatedTypeFactory.java:1270)
  org.checkerframework.framework.type.AnnotatedTypeFactory.fromElement(AnnotatedTypeFactory.java:1190)
  org.checkerframework.framework.type.TypeFromExpressionVisitor.visitMemberSelect(TypeFromExpressionVisitor.java:147)
  org.checkerframework.framework.type.TypeFromExpressionVisitor.visitMemberSelect(TypeFromExpressionVisitor.java:44)
  com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1903)
  com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:53)
  org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:36)
  org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1299)
  org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:1079)
  org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:201)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:577)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitNode(CFAbstractTransfer.java:93)
  org.checkerframework.dataflow.cfg.node.AbstractNodeVisitor.visitMethodAccess(AbstractNodeVisitor.java:241)
  org.checkerframework.checker.nullness.NullnessTransfer.visitMethodAccess(NullnessTransfer.java:206)
  org.checkerframework.checker.nullness.NullnessTransfer.visitMethodAccess(NullnessTransfer.java:58)
  org.checkerframework.dataflow.cfg.node.MethodAccessNode.accept(MethodAccessNode.java:49)
  org.checkerframework.dataflow.analysis.Analysis.callTransferFunction(Analysis.java:408)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysisBlock(Analysis.java:234)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysis(Analysis.java:187)
  org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:91)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1231)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1149)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1493)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:259)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:320)
  org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:167)
  com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720)

Checkerframework version: ext.checkerFrameworkVersion = '2.8.0'

mernst commented 4 years ago

I'm sorry you are having trouble. Could you please provide a reproducible example, as explained in the manual? That will enable us to reproduce the problem and verify a fix.

mernst commented 4 years ago

Which version of Java are you using? Can you please try to reproduce this problem using the Java 8 compiler, version 211 or later? Version 211 fixes some bugs, whereas previous versions create incorrect .class files for certain code that uses wildcards.

mernst commented 4 years ago

Possibly related: #2173.

mernst commented 4 years ago

I am closing this because there is not sufficient information to reproduce the problem. We can reopen it if someone is able to provide the needed information.

ahsaid commented 4 years ago

I'm facing same problem, just by adding a validation annotation on generic type causes checker framework to crash, tried both "'2.9.0" and "'2.10.0", java 8, example:

@Value @Builder @AllArgsConstructor public class request {

@JsonProperty("fooList") private List<@Positive Integer> fooList; }

error: handleInvalid(this=org.checkerframework.framework.util.element.MethodApplier): Invalid variable and element passed to extractAndApply; type: List getFooList(request this) element: getFooList() (kind: METHOD) invalid annotations: @javax.validation.constraints.Positive Targeted annotations: METHOD_RECEIVER, METHOD_RETURN, THROWS Valid annotations: LOCAL_VARIABLE, RESOURCE_VARIABLE, EXCEPTION_PARAMETER, NEW, CAST, INSTANCEOF, METHOD_INVOCATION_TYPE_ARGUMENT, CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT, METHOD_REFERENCE, CONSTRUCTOR_REFERENCE, METHOD_REFERENCE_TYPE_ARGUMENT, CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT, METHOD_TYPE_PARAMETER, METHOD_TYPE_PARAMETER_BOUND, METHOD_FORMAL_PARAMETER Compilation unit :..... /request.java Last visited tree at line 20 column 1: @Value Exception: java.lang.Throwable; Stack trace: org.checkerframework.javacutil.BugInCF.(BugInCF.java:14) org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.handleInvalid(TargetedElementAnnotationApplier.java:141) org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.extractAndApply(TargetedElementAnnotationApplier.java:205) org.checkerframework.framework.util.element.MethodApplier.extractAndApply(MethodApplier.java:119) org.checkerframework.framework.util.element.MethodApplier.apply(MethodApplier.java:30)

ahsaid commented 4 years ago

version 2.11.0 causes another crash

message: com.sun.tools.javac.code.Type.stripMetadata()Lcom/sun/tools/javac/code/Type; Exception: java.lang.NoSuchMethodError: com.sun.tools.javac.code.Type.stripMetadata()Lcom/sun/tools/javac/code/Type;; Stack trace: org.checkerframework.javacutil.TypeAnnotationUtils.unannotatedType(TypeAnnotationUtils.java:558) org.checkerframework.framework.type.BoundsInitializer.initializeTypeArgs(BoundsInitializer.java:99) org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedDeclaredType.getTypeArguments(AnnotatedTypeMirror.java:899) org.checkerframework.framework.util.element.TypeDeclarationApplier.extractAndApply(TypeDeclarationApplier.java:111)

mernst commented 4 years ago

I'm sorry you are having trouble. Could you please provide a reproducible test case? For example, you didn't say what checker you are running. The manual gives instructions for reporting a bug: https://checkerframework.org/manual/#reporting-bugs . Also, it is most helpful to test with the current version (3.0.0) rather than an old one. Thanks.

ahsaid commented 4 years ago

3.0.0 crashes with different stack trace, (javac 1.8.0_181)

error: SourceChecker.typeProcessingStart: unexpected Throwable (NoSuchMethodError); message: com.sun.tools.javac.code.Type.stripMetadata()Lcom/sun/tools/javac/code/Type; Exception: java.lang.NoSuchMethodError: com.sun.tools.javac.code.Type.stripMetadata()Lcom/sun/tools/javac/code/Type;; Stack trace: org.checkerframework.javacutil.TypeAnnotationUtils.unannotatedType(TypeAnnotationUtils.java:558) org.checkerframework.framework.type.BoundsInitializer.initializeTypeArgs(BoundsInitializer.java:99) org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedDeclaredType.getTypeArguments(AnnotatedTypeMirror.java:897) org.checkerframework.framework.util.element.TypeDeclarationApplier.extractAndApply(TypeDeclarationApplier.java:115) org.checkerframework.framework.util.element.TypeDeclarationApplier.apply(TypeDeclarationApplier.java:23) org.checkerframework.framework.type.ElementAnnotationApplier.applyInternal(ElementAnnotationApplier.java:134) org.checkerframework.framework.type.ElementAnnotationApplier.apply(ElementAnnotationApplier.java:79) org.checkerframework.framework.type.AnnotatedTypeFactory.fromElement(AnnotatedTypeFactory.java:1129) org.checkerframework.framework.type.AnnotatedTypeFactory.fromElement(AnnotatedTypeFactory.java:2357) org.checkerframework.common.basetype.BaseTypeVisitor.(BaseTypeVisitor.java:229) org.checkerframework.common.basetype.BaseTypeVisitor.(BaseTypeVisitor.java:209) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:223) org.checkerframework.common.basetype.BaseTypeChecker.createSourceVisitor(BaseTypeChecker.java:84) org.checkerframework.framework.source.SourceChecker.initChecker(SourceChecker.java:904) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:99) org.checkerframework.common.basetype.BaseTypeChecker.initChecker(BaseTypeChecker.java:90) org.checkerframework.framework.source.SourceChecker.typeProcessingStart(SourceChecker.java:860) org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:157) com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:681) com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:111) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1342) com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1296) com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860) com.sun.tools.javac.main.Main.compile(Main.java:523) com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129) com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:89) org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57) org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:50) org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:36)

smillst commented 4 years ago

The Checker Framework now has different setup when running on JDK 8. See https://checkerframework.org/manual/#java8-install for details.

ahsaid commented 4 years ago

The Checker Framework now has different setup when running on JDK 8. See https://checkerframework.org/manual/#java8-install for details.

here is how it is configured in gradle allprojects { tasks.getByName('compileJava') { JavaCompile compile -> compile.options.compilerArgs = [ '-processor', 'org.checkerframework.checker.nullness.NullnessChecker,lombok.launch.AnnotationProcessorHider$AnnotationProcessor', '-processorpath', "${configurations.checkerFramework.asPath}", "-Xbootclasspath/p:${configurations.checkerFrameworkAnnotatedJDK.asPath}" ] } }

smillst commented 4 years ago

Please use the Gradle plugin. https://checkerframework.org/manual/#gradle.

ahsaid commented 4 years ago

not sure how this will fix the crash. the crash happens only if I add annotation on the generic type i.e. List<@Positive Integer>

smillst commented 4 years ago

In order for us to fix the crash, we need a reproducible test case using the latest version of the Checker Framework. Your current setup will not work with the latest version of the Checker Framework. Since you are using Gradle, the easiest way to configure Gradle to run a checker is to use the Checker Framework Gradle plugin. If you wish to build using some other tool, please follow the instructions for that tool: https://checkerframework.org/manual/#external-tools.

ahsaid commented 4 years ago

OK. I applied the plugin, has checker version 3.0.0 and got the same error

mernst commented 4 years ago

Can you please provide a complete, reproducible bug report with all of the information requested at https://checkerframework.org/manual/#reporting-bugs, in one place? We need that in order to reproduce your report and fix the problem. Thanks for helping us help you.

ahsaid commented 4 years ago

https://github.com/typetools/checker-framework/issues/2867