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

Compiler Crash on Parsing Specific Java Program #6631

Closed
iamsanjaymalakar opened this issue May 29, 2024 · 10 comments · Fixed by #6632
Closed

Compiler Crash on Parsing Specific Java Program #6631

iamsanjaymalakar opened this issue May 29, 2024 · 10 comments · Fixed by #6632
Assignees
Labels

Comments

@iamsanjaymalakar
Copy link
Member

Description:

An exception occurs in the compiler (11.0.23) when parsing a specific Java program. Below are the details of the crash and a reproducer. This issue can be demonstrated by running ./gradlew ainferTestCheckerAjavaTest after adding the test to either checker/tests/all-systems or checker/tests/ainfer-testchecker/non-annotated.

Crash Log:

An exception has occurred in the compiler (11.0.23). Please file a bug against the Java compiler via the Java bug reporting page (https://bugreport.java.com) after checking the Bug Database (https://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you.
com.sun.tools.javac.util.ClientCodeException: org.checkerframework.com.github.javaparser.ParseProblemException: (line 18,col 24) Parse error. Found  "1" <INTEGER_LITERAL>, expected one of  "!=" "%" "%=" "&" "&&" "&=" ")" "*" "*=" "+" "+=" "," "-" "-=" "->" "/" "/=" "::" "<" "<<=" "<=" "=" "==" ">" ">=" ">>=" ">>>=" "?" "^" "^=" "instanceof" "|" "|=" "||"
Problem stacktrace : 
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.generateParseException(GeneratedJavaParser.java:14369)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.jj_consume_token(GeneratedJavaParser.java:14214)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Arguments(GeneratedJavaParser.java:5566)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.PrimarySuffixWithoutSuper(GeneratedJavaParser.java:5353)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.PrimarySuffix(GeneratedJavaParser.java:5298)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.PrimaryExpression(GeneratedJavaParser.java:4967)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.StatementExpression(GeneratedJavaParser.java:6372)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5933)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.BlockStatement(GeneratedJavaParser.java:6187)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statements(GeneratedJavaParser.java:3049)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6064)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5884)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.WhileStatement(GeneratedJavaParser.java:6756)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5945)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.BlockStatement(GeneratedJavaParser.java:6187)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statements(GeneratedJavaParser.java:3049)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6064)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.MethodDeclaration(GeneratedJavaParser.java:2429)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBodyDeclaration(GeneratedJavaParser.java:2026)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBody(GeneratedJavaParser.java:1508)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceDeclaration(GeneratedJavaParser.java:765)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.CompilationUnit(GeneratedJavaParser.java:383)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:127)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:242)
  org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:96)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
  org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
  org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
  org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
  org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
  jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
  jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
  jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
(line 18,col 66) Parse error. Found  "\\u005c" <IDENTIFIER>, expected "}"
Problem stacktrace : 
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.generateParseException(GeneratedJavaParser.java:14369)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.jj_consume_token(GeneratedJavaParser.java:14214)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6065)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5884)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.WhileStatement(GeneratedJavaParser.java:6756)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5945)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.BlockStatement(GeneratedJavaParser.java:6187)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statements(GeneratedJavaParser.java:3049)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6064)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.MethodDeclaration(GeneratedJavaParser.java:2429)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBodyDeclaration(GeneratedJavaParser.java:2026)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBody(GeneratedJavaParser.java:1508)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceDeclaration(GeneratedJavaParser.java:765)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.CompilationUnit(GeneratedJavaParser.java:383)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:127)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:242)
  org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:96)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
  org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
  org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
  org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
  org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
  jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
  jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
  jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
(line 32,col 7) Parse error. Found "catch", expected one of  ";" "<" "@" "abstract" "boolean" "byte" "char" "class" "default" "double" "enum" "exports" "final" "float" "int" "interface" "long" "module" "native" "non-sealed" "open" "opens" "permits" "private" "protected" "provides" "public" "record" "requires" "sealed" "short" "static" "strictfp" "synchronized" "to" "transient" "transitive" "uses" "void" "volatile" "with" "yield" "{" "}" <IDENTIFIER>
Problem stacktrace : 
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.generateParseException(GeneratedJavaParser.java:14369)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.jj_consume_token(GeneratedJavaParser.java:14214)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBody(GeneratedJavaParser.java:1522)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceDeclaration(GeneratedJavaParser.java:765)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.CompilationUnit(GeneratedJavaParser.java:383)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:127)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:242)
  org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:96)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
  org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
  org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
  org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
  org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
  jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
  jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
  jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)

	at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:832)
	at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
	at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
	at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
Caused by: org.checkerframework.com.github.javaparser.ParseProblemException: (line 18,col 24) Parse error. Found  "1" <INTEGER_LITERAL>, expected one of  "!=" "%" "%=" "&" "&&" "&=" ")" "*" "*=" "+" "+=" "," "-" "-=" "->" "/" "/=" "::" "<" "<<=" "<=" "=" "==" ">" ">=" ">>=" ">>>=" "?" "^" "^=" "instanceof" "|" "|=" "||"
Problem stacktrace : 
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.generateParseException(GeneratedJavaParser.java:14369)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.jj_consume_token(GeneratedJavaParser.java:14214)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Arguments(GeneratedJavaParser.java:5566)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.PrimarySuffixWithoutSuper(GeneratedJavaParser.java:5353)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.PrimarySuffix(GeneratedJavaParser.java:5298)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.PrimaryExpression(GeneratedJavaParser.java:4967)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.StatementExpression(GeneratedJavaParser.java:6372)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5933)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.BlockStatement(GeneratedJavaParser.java:6187)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statements(GeneratedJavaParser.java:3049)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6064)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5884)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.WhileStatement(GeneratedJavaParser.java:6756)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5945)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.BlockStatement(GeneratedJavaParser.java:6187)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statements(GeneratedJavaParser.java:3049)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6064)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.MethodDeclaration(GeneratedJavaParser.java:2429)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBodyDeclaration(GeneratedJavaParser.java:2026)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBody(GeneratedJavaParser.java:1508)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceDeclaration(GeneratedJavaParser.java:765)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.CompilationUnit(GeneratedJavaParser.java:383)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:127)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:242)
  org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:96)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
  org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
  org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
  org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
  org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
  jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
  jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
  jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
(line 18,col 66) Parse error. Found  "\\u005c" <IDENTIFIER>, expected "}"
Problem stacktrace : 
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.generateParseException(GeneratedJavaParser.java:14369)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.jj_consume_token(GeneratedJavaParser.java:14214)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6065)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5884)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.WhileStatement(GeneratedJavaParser.java:6756)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statement(GeneratedJavaParser.java:5945)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.BlockStatement(GeneratedJavaParser.java:6187)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Statements(GeneratedJavaParser.java:3049)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.Block(GeneratedJavaParser.java:6064)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.MethodDeclaration(GeneratedJavaParser.java:2429)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBodyDeclaration(GeneratedJavaParser.java:2026)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBody(GeneratedJavaParser.java:1508)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceDeclaration(GeneratedJavaParser.java:765)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.CompilationUnit(GeneratedJavaParser.java:383)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:127)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:242)
  org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:96)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
  org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
  org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
  org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
  org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
  jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
  jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
  jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
(line 32,col 7) Parse error. Found "catch", expected one of  ";" "<" "@" "abstract" "boolean" "byte" "char" "class" "default" "double" "enum" "exports" "final" "float" "int" "interface" "long" "module" "native" "non-sealed" "open" "opens" "permits" "private" "protected" "provides" "public" "record" "requires" "sealed" "short" "static" "strictfp" "synchronized" "to" "transient" "transitive" "uses" "void" "volatile" "with" "yield" "{" "}" <IDENTIFIER>
Problem stacktrace : 
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.generateParseException(GeneratedJavaParser.java:14369)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.jj_consume_token(GeneratedJavaParser.java:14214)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceBody(GeneratedJavaParser.java:1522)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.ClassOrInterfaceDeclaration(GeneratedJavaParser.java:765)
  org.checkerframework.com.github.javaparser.GeneratedJavaParser.CompilationUnit(GeneratedJavaParser.java:383)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:127)
  org.checkerframework.com.github.javaparser.JavaParser.parse(JavaParser.java:242)
  org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:96)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
  org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
  org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
  org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
  org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
  org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
  org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
  org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
  org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
  org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
  org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
  jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
  jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1417)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1374)
  jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:311)
  jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)
  jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
  jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)

	at org.checkerframework.framework.util.JavaParserUtil.parseCompilationUnit(JavaParserUtil.java:100)
	at org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addSourceFile(WholeProgramInferenceJavaParserStorage.java:632)
	at org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.addClassTree(WholeProgramInferenceJavaParserStorage.java:611)
	at org.checkerframework.common.wholeprograminference.WholeProgramInferenceJavaParserStorage.preprocessClassTree(WholeProgramInferenceJavaParserStorage.java:587)
	at org.checkerframework.common.wholeprograminference.WholeProgramInferenceImplementation.preprocessClassTree(WholeProgramInferenceImplementation.java:1152)
	at org.checkerframework.framework.type.AnnotatedTypeFactory.setRoot(AnnotatedTypeFactory.java:915)
	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.setRoot(GenericAnnotatedTypeFactory.java:443)
	at org.checkerframework.checker.mustcall.MustCallAnnotatedTypeFactory.setRoot(MustCallAnnotatedTypeFactory.java:153)
	at org.checkerframework.common.basetype.BaseTypeVisitor.setRoot(BaseTypeVisitor.java:387)
	at org.checkerframework.framework.source.SourceChecker.setRoot(SourceChecker.java:685)
	at org.checkerframework.common.basetype.BaseTypeChecker.setRoot(BaseTypeChecker.java:167)
	at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1074)
	at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:559)
	at org.checkerframework.common.basetype.BaseTypeChecker.typeProcess(BaseTypeChecker.java:552)
	at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:188)
	at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:828)
	... 8 more

Reproducer:

public class EG1 {
  void foo() {
    while (true) {
      System.out.print("Enter an expression like \u005c"1+(2+3)*4;\u005c" :");
    }
  }
}

The exception occurs when the print statement is inside the while loop body.

Steps to Reproduce:

  • Add the above test to checker/tests/all-systems or checker/tests/ainfer-testchecker/non-annotated.
  • Run ./gradlew ainferTestCheckerAjavaTest.
@iamsanjaymalakar
Copy link
Member Author

The issue is caused by the Unicode escape sequence \u005c within the string. This sequence represents the backslash (\) character. When the Java parser encounters this escape sequence, it interprets it as a single backslash, which affects the subsequent characters in the string.

So, System.out.print("Enter an expression like \u005c"1+(2+3)*4;\u005c" :"); is equivalent to System.out.print("Enter an expression like \"1+(2+3)*4;\" :");.

But the parser parses till "Enter an expression like \u005c", then it expects a right parenthesis ()), but finds 1, and crashes.

@mernst
Copy link
Member

mernst commented May 29, 2024

For clarification, in the above "the parser" means "JavaParser": this is a JavaParser bug. Is that correct?

A workaround would be to do a pre-processing step for Unicode escape sequences, before calling JavaParser.

@mernst
Copy link
Member

mernst commented May 29, 2024

Can this problem be reproduced in a regular type-checker test suite, or only in the ainfer test suite as you described above?

@iamsanjaymalakar
Copy link
Member Author

iamsanjaymalakar commented May 29, 2024

For clarification, in the above "the parser" means "JavaParser": this is a JavaParser bug. Is that correct?

Yes, the JavaParser.

@iamsanjaymalakar
Copy link
Member Author

Can this problem be reproduced in a regular type-checker test suite, or only in the ainfer test suite as you described above?

I've only tried it in ainfer. I don't have experience with the regular type-checker test suites, so could you provide more information on those?

@kelloggm
Copy link
Contributor

Can this problem be reproduced in a regular type-checker test suite, or only in the ainfer test suite as you described above?

@mernst based on the description above, it would be possible to trigger this bug without -Ainfer. But, it does require a corresponding .ajava file (the bug occurs while parsing ajava and java files simultaneously). To trigger the bug in a regular checker test suite, we'd need to copy the test file twice provided by @iamsanjaymalakar twice: once in any checker's test suite as a .java file, and another time as a .ajava file.

The bug is unlikely to occur in practice outside of WPI/-Ainfer and it's easiest to trigger it via -Ainfer, so it seems sensible to me to test it as part of the -Ainfer tests, despite the fact that it's technically possible to trigger elsewhere.

@msridhar
Copy link
Contributor

Nice find!

But the parser parses till "Enter an expression like \u005c", then it expects a right parenthesis ()), but finds 1, and crashes.

To be clear, this is because it does not treat the " character as escaped, but instead thinks it terminates the string literal, right?

Since this is a JavaParser bug, maybe best to also report it upstream to them?

@kelloggm
Copy link
Contributor

Since this is a JavaParser bug, maybe best to also report it upstream to them?

I think it's intentional: see the discussion at javaparser/javaparser#2265.

I have the test passing locally by changing the JavaParser configuration to use the option that's mentioned in that JavaParser issue. I'll put up a PR soon.

@kelloggm
Copy link
Contributor

PR with fix is here: #6632

@iamsanjaymalakar
Copy link
Member Author

To be clear, this is because it does not treat the " character as escaped, but instead thinks it terminates the string literal, right?

Yes.

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

Successfully merging a pull request may close this issue.

4 participants