An added non-ASCII character case breaks compiled runs

未关闭 适合新手
#690 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
75/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃

调研方向

从 web/compiler-explorer.js 中的 charLiteral 和 web/runners.js 中的 candidateTypeMatches 入手,追踪字符用例是如何生成和接受的。找到覆盖这些路径的测试,并为 é 和一个表情符号添加用例。完成标准是:添加这两个非 ASCII 字符中的任意一个都会被拒绝,并显示一条指出该字符的消息,且测试通过。

由索引模型根据 Issue 内容生成。

描述

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.

主要语言
Rust
星标
228
派生
150
平均合并
1 天 3 小时
30 天内合并 PR
226

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

sysprog21/codetrial 的其他 Issue

查看 sysprog21/codetrial 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。