Skip to content

Commit

Permalink
Create 2024-01-23-今天发现一个JDK编译器的bug.md
Browse files Browse the repository at this point in the history
  • Loading branch information
MisterChangRay authored Jan 23, 2024
1 parent 53574a3 commit 1346838
Showing 1 changed file with 91 additions and 0 deletions.
91 changes: 91 additions & 0 deletions _posts/2024-01-23-今天发现一个JDK编译器的bug.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
---
layout: post
title: "今天发现一个JDK编译器的bug"
date: 2024-01-23 11:29:20 +0800
categories:
- java
tags:
- 编译器bug
---

平平淡淡的一天,正常写开发输出代码,但在打包编译时就懵了,编译出错,正常错误还好,根据提示修改即可,但这次报的却是`java.lang.StackOverflowError`

我懵了:这ide也没提示有语法错误什么的啊,上个版本也能正常打包的啊

后来发现这可能是一个JDK编译器的bug, 具体情况是编译项目中的一个java类时,报`StackOverflowError`错误。

测试过以下jdk版本:
- oricaljdk-1.8.0_271
- oricaljdk-17.0.8
- openjdk-17.0.2
- openjdk-21.0.1

以上版本编译统一都报错如下:
```shell
D:\workspace>javac Criteria.java


系统资源不足。
有关详细信息, 请参阅以下堆栈跟踪。
java.lang.StackOverflowError
at jdk.compiler/com.sun.tools.javac.code.Type.equalsIgnoreMetadata(Type.java:513)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.contains(Type.java:1150)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4769)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724)
at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681)
at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4739)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4724)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1011)
at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4771)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724)
at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681)
at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4739)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4724)
at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1011)
at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4771)
at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724)
at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681)
```
目前已经将bug上报了,等待官方反馈。

测试代码如下, 感兴趣的同学可以自己拿去`javac`编译下:

```java
package test;
import java.io.Serializable;
import test.Criteria.Builder;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class Criteria<B extends Builder<? extends Criteria>> implements Serializable {
private static final long serialVersionUID = 5066371601838698479L;

protected Criteria() {}

protected Criteria(B builder) {
}

// 此处导致,做如下修改则能正常编译
// 修改为 public static <B extends Builder> B builder()
public static <B extends Builder<E>, E extends Criteria<B>> B builder() {
return (B) new Builder<>();
}

public static class Builder<C extends Criteria<? extends Builder<C>>> {
protected Builder() {
}
public Builder<C> page() {
return this;
}
public C build() {
return (C) new Criteria<Builder<C>>(this);
}
}
}

```

等官方反馈后在续上

0 comments on commit 1346838

Please sign in to comment.