An added non-ASCII character case breaks compiled runs

Abierto Apto para principiantes
#690 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
75/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
c, cpp, java, javascript

Línea de trabajo

Empieza con charLiteral en web/compiler-explorer.js y candidateTypeMatches en web/runners.js para rastrear cómo se generan y aceptan los casos de caracteres. Encuentra las pruebas que cubren estas rutas y añade casos para é y un emoji. El trabajo estará terminado cuando se rechace la adición de cualquiera de los dos caracteres no ASCII con un mensaje que lo nombre y las pruebas pasen.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Observed behavior

An added character case whose cell is a non-ASCII character, such as é or an emoji, is written raw between quotes by charLiteral. C and C++ never hand it over as typed, and Java does only within the Basic Multilingual Plane:

  • C is built with clang on Compiler Explorer, and clang 21 (-std=c17) refuses the literal, so the run reports a compile failure.
  • C++ is built with gcc there, and g++ 15 (-std=c++20) reads 'é' as a multi-character constant, warns, and the solution receives -87 instead of the character. A correct solution can fail the case silently.
  • Java runs on JDK 25 there, and javac 25 receives é correctly (233) but refuses an emoji ("character literal contains more than one UTF-16 code unit"). gino1203 reported an earlier javac that accepts it and passes only the high surrogate, 55357.

Python and JavaScript are not affected.

Expected behavior

A character case either reaches every compiled language as typed or is refused when the case is added, with a message that names the character, as an integer outside 32 bits already is.

Reproduction

At main after #683, with the checkout's web/compiler-explorer.js:

const { nativeLiteral } = await import("./web/compiler-explorer.js");
nativeLiteral("é", "character", "cpp"); // "'é'", raw UTF-8 between quotes

Compiling char c = <that literal>; printf("%d", c); gives -87 with g++ 15 and refuses to compile with clang++ 21; the same in C. Checked locally with gcc 15, clang 21 and Java 25.

Initial analysis
  • Path: charLiteral in web/compiler-explorer.js escapes quotes, backslashes and, after #683, U+0000 to U+001F; every other character is written as is.
  • Reach: candidateTypeMatches in web/runners.js accepts any single code point as a character.
  • Domain: the six character judges (copper-pad-continuity, letter-grid-tracer, letter-panel-tracing, puzzle-grid-save-check, rooftop-panel-footprint, sealed-air-pocket-backfill) take letters, digits, ., 0 or 1, all ASCII. A C or C++ char cannot hold a character outside ASCII as one value, so refusing a non-ASCII character when the case is added is simpler than encoding it.
Action items
  1. Refuse a non-ASCII character case when it is added, naming the character.
  2. Add a test that fails on main for é and an emoji.

Raised by gino1203 in a review of #683.

Lenguaje dominante
Rust
Estrellas
228
Forks
150
Merge medio
1 d 3 h
PR fusionados (30 d)
226

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de sysprog21/codetrial

Todos los issues de sysprog21/codetrial

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.