An added non-ASCII character case breaks compiled runs

Aberta Para iniciantes
#690 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
75/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
c, cpp, java, javascript
Domínio
testing-qa, tooling

Direção de pesquisa

Comece com charLiteral em web/compiler-explorer.js e candidateTypeMatches em web/runners.js para rastrear como os casos de caracteres são gerados e aceitos. Encontre os testes que cobrem esses caminhos e adicione casos para é e um emoji. O trabalho estará concluído quando a adição de qualquer um dos dois caracteres não ASCII for recusada com uma mensagem que o nomeie e os testes passarem.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Rust
Estrelas
228
Forks
150
Merge médio
1d 3h
PRs com merge (30d)
226

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de sysprog21/codetrial

Todas as issues de sysprog21/codetrial

Issues semelhantes

Mais issues de Rust

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.