Verifier crashes on a `for` loop whose body is an empty statement (`for (...) ;`)
Los mantenedores suelen responder en 2 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 82/100
Línea de trabajo
El fallo está en visitCtFor en src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java, donde una lambda llama a getElements sobre CtFor.getBody() alrededor de la línea 628; la misma ruta pasa por visitLoop alrededor de la línea 658. Empieza leyendo cómo se consume el cuerpo del bucle allí y luego ejecuta el reproductor del issue, que tiene un cuerpo vacío ;. Está terminado cuando ese reproductor imprime Correct! Passed Verification. y una prueba de bucle existente sigue pasando.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Impact: verification stops with an internal error on any for loop whose body is an empty statement (;).
Description
for (...; ...; ...) ; has no body block: CtFor.getBody() is null, and RefinementTypeChecker.visitCtFor calls getElements on it (RefinementTypeChecker.java:628). Nothing in the loop needs a refinement, so an empty body could be checked as an empty block.
Minimal reproducer
public class Repro {
static int total(int[] counts) {
int total = 0;
for (int i = 0; i < counts.length; total += counts[i], i++)
;
return total;
}
}
Expected
Correct! Passed Verification.
Actual
Exception in thread "main" java.lang.RuntimeException:
Error while checking CtMethodImpl
on total(int[] counts) {
at Repro.java:2
with
Error while checking CtBlockImpl
on {
at Repro.java:2
with
Error while checking CtForImpl
on for (int i = 0; i < counts.length; total += counts[i], i++)
at Repro.java:4
with Cannot invoke "spoon.reflect.code.CtStatement.getElements(spoon.reflect.visitor.Filter)" because the return value of "spoon.reflect.code.CtFor.getBody()" is null
...
Caused by: java.lang.NullPointerException: Cannot invoke "spoon.reflect.code.CtStatement.getElements(spoon.reflect.visitor.Filter)" because the return value of "spoon.reflect.code.CtFor.getBody()" is null
at liquidjava.processor.refinement_checker.RefinementTypeChecker.lambda$visitCtFor$4(RefinementTypeChecker.java:628)
at liquidjava.processor.refinement_checker.RefinementTypeChecker.visitLoop(RefinementTypeChecker.java:658)
at liquidjava.processor.refinement_checker.RefinementTypeChecker.visitCtFor(RefinementTypeChecker.java:623)
Reproduced on main at ad055b49 (liquidjava-verifier 0.0.35).
Real-world file that hits it
for (int i = 0; i < updateCount.length; cnt += updateCount[i], i++) ;— tejeswarp/tungsten-replicator (file)
Context
Found while running LiquidJava on the original repository files of 53 real-world typestate and refinement bugs (the files our study exercises were simplified from). Each file is verified on its own, as a user would verify one file of a project, so the project's other classes and its dependencies are not on the classpath.
- Lenguaje dominante
- Java
- Estrellas
- 69
- Forks
- 36
- Merge medio
- 2 d 1 h
- PR fusionados (30 d)
- 35
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de liquid-java/liquidjava
-
Verifier crashes on a comparison or other binary operator whose operand types cannot be resolved (classes not on the classpath)Posiblemente ocupada @CatarinaGamboa la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
liquid-java/liquidjava#388 ·
Los mantenedores suelen responder en 2 días
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
liquid-java/liquidjava#373 ·
Los mantenedores suelen responder en 2 días
-
Soundness: a local variable with a constant's name shadows the constant (Format.JPG read as local JPG)Posiblemente ocupada @CatarinaGamboa la tomó hace 1 día. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
liquid-java/liquidjava#321 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 20/100
liquid-java/liquidjava#406 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 40/100
liquid-java/liquidjava#405 ·
Los mantenedores suelen responder en 2 días
Todos los issues de liquid-java/liquidjava
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
iOS podspec depends on `React-Codegen`, which resolves to an unrelated pod on CocoaPods trunkAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
GantMan/jail-monkey#380 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
objectionary/jucs#145 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
objectionary/lints#1559 ·
Los mantenedores suelen responder en 2 días
-
RRateLimiter acquire methods accept negative permits and raise available permits above the rate.Posiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 4 días