Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AssertionError: visitArrayAccess on a non-AnnotatedArrayType #3020

Closed
cpovirk opened this issue Dec 30, 2019 · 2 comments
Closed

AssertionError: visitArrayAccess on a non-AnnotatedArrayType #3020

cpovirk opened this issue Dec 30, 2019 · 2 comments
Assignees
Labels
Milestone

Comments

@cpovirk
Copy link
Contributor

cpovirk commented Dec 30, 2019

Minimized from the real code (which doesn't yet contain the call to "passThrough," which is really going to be a call to requireNonNull):

$ cat SomeEnum.java 
enum SomeEnum {
  INSTANCE;

  void retrieveConstant() {
    Class<?> theClass = SomeEnum.class;
    Object unused = passThrough(theClass.getEnumConstants())[0];
  }

  <T> T passThrough(T t) {
    return t;
  }
}
$ checker/bin/javac -processor org.checkerframework.checker.nullness.NullnessChecker SomeEnum.java
error: SourceChecker.typeProcess: unexpected Throwable (AssertionError) while processing SomeEnum.java
  Compilation unit: SomeEnum.java
  Last visited tree at line 1 column 1:
  enum SomeEnum {
  Exception: java.lang.AssertionError; Stack trace: org.checkerframework.framework.type.TypeFromExpressionVisitor.visitArrayAccess(TypeFromExpressionVisitor.java:228)
  org.checkerframework.framework.type.TypeFromExpressionVisitor.visitArrayAccess(TypeFromExpressionVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCArrayAccess.accept(JCTree.java:2080)
  com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:80)
  org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:36)
  org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1214)
  org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:992)
  org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:201)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitArrayAccess(CFAbstractTransfer.java:637)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitArrayAccess(CFAbstractTransfer.java:93)
  org.checkerframework.dataflow.cfg.node.ArrayAccessNode.accept(ArrayAccessNode.java:49)
  org.checkerframework.dataflow.analysis.Analysis.callTransferFunction(Analysis.java:418)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysisBlock(Analysis.java:215)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysis(Analysis.java:190)
  org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:91)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1253)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1171)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1520)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:258)
  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:808)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)
  org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:82)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1020)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:523)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:516)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:182)
  com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:120)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1404)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1363)
  com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:959)
  com.sun.tools.javac.main.Main.compile(Main.java:302)
  com.sun.tools.javac.main.Main.compile(Main.java:162)
  com.sun.tools.javac.Main.compile(Main.java:57)
  com.sun.tools.javac.Main.main(Main.java:43)
error: SourceChecker.typeProcess: unexpected Throwable (AssertionError) while processing SomeEnum.java
  Compilation unit: SomeEnum.java
  Last visited tree at line 1 column 1:
  enum SomeEnum {
  Exception: java.lang.AssertionError; Stack trace: org.checkerframework.framework.type.TypeFromExpressionVisitor.visitArrayAccess(TypeFromExpressionVisitor.java:228)
  org.checkerframework.framework.type.TypeFromExpressionVisitor.visitArrayAccess(TypeFromExpressionVisitor.java:71)
  com.sun.tools.javac.tree.JCTree$JCArrayAccess.accept(JCTree.java:2080)
  com.sun.source.util.SimpleTreeVisitor.visit(SimpleTreeVisitor.java:80)
  org.checkerframework.framework.type.TypeFromTree.fromExpression(TypeFromTree.java:36)
  org.checkerframework.framework.type.AnnotatedTypeFactory.fromExpression(AnnotatedTypeFactory.java:1214)
  org.checkerframework.framework.type.AnnotatedTypeFactory.getAnnotatedType(AnnotatedTypeFactory.java:992)
  org.checkerframework.framework.flow.CFAbstractTransfer.getValueFromFactory(CFAbstractTransfer.java:201)
  org.checkerframework.framework.flow.CFAbstractTransfer.visitArrayAccess(CFAbstractTransfer.java:637)
  org.checkerframework.checker.nullness.NullnessTransfer.visitArrayAccess(NullnessTransfer.java:197)
  org.checkerframework.checker.nullness.NullnessTransfer.visitArrayAccess(NullnessTransfer.java:57)
  org.checkerframework.dataflow.cfg.node.ArrayAccessNode.accept(ArrayAccessNode.java:49)
  org.checkerframework.dataflow.analysis.Analysis.callTransferFunction(Analysis.java:418)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysisBlock(Analysis.java:215)
  org.checkerframework.dataflow.analysis.Analysis.performAnalysis(Analysis.java:190)
  org.checkerframework.framework.flow.CFAbstractAnalysis.performAnalysis(CFAbstractAnalysis.java:91)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1253)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysis(GenericAnnotatedTypeFactory.java:1171)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.checkAndPerformFlowAnalysis(GenericAnnotatedTypeFactory.java:1520)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:258)
  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:808)
  com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:56)
  org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:82)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1020)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:523)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:182)
  com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:120)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1404)
  com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1363)
  com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:959)
  com.sun.tools.javac.main.Main.compile(Main.java:302)
  com.sun.tools.javac.main.Main.compile(Main.java:162)
  com.sun.tools.javac.Main.compile(Main.java:57)
  com.sun.tools.javac.Main.main(Main.java:43)
2 errors

The failing assertion is type instanceof AnnotatedArrayType.

Source file and -version -verbose -AprintAllQualifiers output attached.

@cpovirk
Copy link
Contributor Author

cpovirk commented Dec 30, 2019

Oh: And if I pull the result of passThrough(theClass.getEnumConstants()) out into a variable (of type Object[]), then the failure goes away. (And then I get an accessing.nullable error, but that's as expected.)

Additionally, inlining theClass or removing the call to passThrough also eliminates the failure.

@wmdietl wmdietl self-assigned this Dec 30, 2019
@wmdietl wmdietl added the crash label Dec 30, 2019
@wmdietl wmdietl added this to the Critical milestone Dec 30, 2019
@wmdietl
Copy link
Member

wmdietl commented Feb 25, 2020

#3107 fixes the crash. #979 is the underlying issue for the failed passThrough inference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants