Soundness: a local variable with a constant's name shadows the constant (Format.JPG read as local JPG)
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
- 78/100
Línea de trabajo
Comienza en RefinementTypeChecker.visitCtFieldRead, identificado en el issue, y reproduce el conflicto de nombres con el ejemplo de Java proporcionado. Comprueba cómo la búsqueda de contexto distingue entre una variable local y el campo que se está leyendo; el issue describe una posible corrección e informa de que las 347 pruebas pasan. Se considera terminado cuando el reproductor informa de un error de refinement en onlyPng(g) y la suite de pruebas sigue pasando.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Description
A field read of a constant such as Format.JPG is resolved to a local variable with the same simple name (JPG), if one is in scope, instead of the constant. The refinement of the local is then used, so real violations are accepted.
Minimal reproducer
import liquidjava.specification.Refinement;
public class Repro {
enum Format { JPG, PNG }
static void onlyPng(@Refinement("_ == Format.PNG") Format f) {}
public static void main(String[] args) {
Format JPG = Format.PNG; // a local that happens to share the constant's name
Format g = Format.JPG; // the enum constant JPG, not the local
onlyPng(g); // expected error: g is JPG
}
}
Expected
A refinement error at onlyPng(g): g holds Format.JPG.
Actual
Correct! Passed Verification.
Removing the line Format JPG = Format.PNG; gives the expected error (g == JPG is not a subtype of g == Format.PNG), so the name clash is what hides it.
Reproduced on main at fbfb4e23.
Where
RefinementTypeChecker.visitCtFieldRead: its first branch looks the field up by simple name in the context (where the local lives) without checking that the variable found is the field being read. A candidate fix (about 5 lines, found during the review of #319) only uses the context variable when it really is that field, and otherwise falls through; it keeps all 347 tests passing.
Context
Found by the adversarial review of #319 (fix for #302): with #319 the same clash inside an if condition (if (f == Format.JPG)) turns a former crash into an accepted violation, so this should be fixed before or with #319.
- Lenguaje dominante
- Java
- Estrellas
- 67
- Forks
- 36
- Merge medio
- 4 d 17 h
- PR fusionados (30 d)
- 7
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
-
Dificultad 4/5 3-5 días Aptitud para principiantes 68/100
liquid-java/liquidjava#323 ·
Los mantenedores suelen responder en 2 días
-
Soundness: a field of another class or object is read as this class's field with the same nameAbiertobug
Dificultad 3/5 1-2 días Aptitud para principiantes 76/100
liquid-java/liquidjava#322 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
liquid-java/liquidjava#318 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
liquid-java/liquidjava#317 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 62/100
liquid-java/liquidjava#316 ·
Los mantenedores suelen responder en 2 días
Todos los issues de liquid-java/liquidjava
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
rename config parameterAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
OpenConext/OpenConext-access#1015 ·
Los mantenedores suelen responder en 1 día
-
68000: FDBcc branch target is 2 bytes too low (uses inst_start+2 instead of the displacement word)Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
NationalSecurityAgency/ghidra#9702 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
apache/rocketmq-dashboard#5358 ·
Los mantenedores suelen responder en 3 días
-
area:cpan-port area:database bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
fglock/PerlOnJava#1605 ·
Los mantenedores suelen responder en 1 día