Skip to content

Commit f6347bd

Browse files
committed
Fix infinite recursion
When determining whether a static final field is initialized with a compile-time constant we need to detect cyclic initialization
1 parent e1376c7 commit f6347bd

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

key.core/src/main/java/de/uka/ilkd/key/java/transformations/ConstantExpressionEvaluator.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
* SPDX-License-Identifier: GPL-2.0-only */
44
package de.uka.ilkd.key.java.transformations;
55

6+
import java.util.LinkedList;
7+
import java.util.Queue;
8+
69
import com.github.javaparser.StaticJavaParser;
710
import com.github.javaparser.ast.body.FieldDeclaration;
811
import com.github.javaparser.ast.expr.*;
@@ -75,6 +78,9 @@ public Expression evaluate(String string) throws EvaluationException {
7578

7679
private static class ConstantExpressionEvaluatorVisitor
7780
extends GenericVisitorAdapter<Object, Void> {
81+
82+
private Queue<FieldDeclaration> path = new LinkedList<FieldDeclaration>();
83+
7884
@Override
7985
public Object visit(ArrayAccessExpr n, Void arg) {
8086
return super.visit(n, arg);
@@ -234,8 +240,11 @@ public Object visit(ExplicitConstructorInvocationStmt n, Void arg) {
234240
public Object visit(FieldAccessExpr n, Void arg) {
235241
final FieldDeclaration fd =
236242
(FieldDeclaration) n.resolve().asField().toAst().orElse(null);
237-
if (fd.isFinal() && fd.isStatic()) {
238-
return visit(fd, arg);
243+
if (fd.isFinal() && fd.isStatic() && !path.contains(fd)) {
244+
path.add(fd);
245+
var result = super.visit(fd, arg);
246+
path.remove(fd);
247+
return result;
239248
} else {
240249
return null;
241250
}

0 commit comments

Comments
 (0)