fix(判题): C 的 int 函数里写 return; 升 gcc-14 之后直接编译错误,原来能跑
gcc-14 把 -Wreturn-mismatch 也提成了 error,和另外三个一样 -w 压不住。 cLooseErrors 补上这一个,判定和 gcc-13 一致。冒烟测试加一条对应的用例。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e118d80057
commit
fa0e1ab66c
5 files changed
+27
-9
No files matched your search
@@ -147,7 +147,7 @@ QingdaoU/JudgeServer 停更在 2024-04(官方镜像的 `latest` 和 `1.6.1`
|
|||||||
**服务器和机房各有各的判题沙箱,两边都要装。**
|
**服务器和机房各有各的判题沙箱,两边都要装。**
|
||||||
- 改工具链就把末尾序号 +1(下一版 `oj2-judge-3`)。`up -d` 不带 `--pull`,名字没变会静默用旧镜像。
|
- 改工具链就把末尾序号 +1(下一版 `oj2-judge-3`)。`up -d` 不带 `--pull`,名字没变会静默用旧镜像。
|
||||||
- 编译/运行命令在 `apps/api/src/judge/languages.ts`,不在镜像里。gcc-14 把隐式函数
|
- 编译/运行命令在 `apps/api/src/judge/languages.ts`,不在镜像里。gcc-14 把隐式函数
|
||||||
声明等提成了 error(`-w` 压不住),那边的 `cLooseErrors` 三个 `-Wno-error=` 就是
|
声明等提成了 error(`-w` 压不住),那边的 `cLooseErrors` 几个 `-Wno-error=` 就是
|
||||||
为此加的 —— 删掉它们等于让一批历史题解和 C 教程示例集体 CE。
|
为此加的 —— 删掉它们等于让一批历史题解和 C 教程示例集体 CE。
|
||||||
- **判题沙箱只认 C / C++ / Python。** Java / JavaScript / Golang 连同镜像里的
|
- **判题沙箱只认 C / C++ / Python。** Java / JavaScript / Golang 连同镜像里的
|
||||||
JDK / Node / Go 在 2026-09 一起砍了(前端本来就没给入口,12 万条提交里它们共 62 条),
|
JDK / Node / Go 在 2026-09 一起砍了(前端本来就没给入口,12 万条提交里它们共 62 条),
|
||||||
|
|||||||
@@ -19,17 +19,18 @@ import { normalizeLanguage } from "@oj2/contract"
|
|||||||
const defaultEnv = ["LANG=en_US.UTF-8", "LANGUAGE=en_US:en", "LC_ALL=en_US.UTF-8"]
|
const defaultEnv = ["LANG=en_US.UTF-8", "LANGUAGE=en_US:en", "LC_ALL=en_US.UTF-8"]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gcc-14 起这三类老写法从 warning 提成了 error,而 `-w` 只关警告、压不住 error:
|
* gcc-14 起这四类老写法从 warning 提成了 error,而 `-w` 只关警告、压不住 error:
|
||||||
* 隐式函数声明(忘了 `#include <stdio.h>` 就用 printf)、int 与指针互赋、
|
* 隐式函数声明(忘了 `#include <stdio.h>` 就用 printf)、int 与指针互赋、
|
||||||
* 不兼容的指针类型。判题机镜像 2026-09 从 gcc-13 升到 14(见 docker/judge/),
|
* 不兼容的指针类型、`int main` 里写不带值的 `return;`(全库 4 条,gcc-13 下能跑,
|
||||||
* 不加这三个开关的话,**一批历史题解和 20 篇 C 教程的示例会突然全部 CE**。
|
* 放行后退出码不定,多半判运行时错误,说明会让补 return 0)。判题机镜像 2026-09 从 gcc-13 升到 14(见 docker/judge/),
|
||||||
|
* 不加这几个开关的话,**一批历史题解和 20 篇 C 教程的示例会突然全部 CE**。
|
||||||
*
|
*
|
||||||
* 只给 C 加:C++ 那边这些本来就是 error,g++ 升版不改判定。
|
* 只给 C 加:C++ 那边这些本来就是 error,g++ 升版不改判定。
|
||||||
* 哪天决定「就是要学生写规范」,是删掉这三行,不是改镜像 —— 删之前先拿
|
* 哪天决定「就是要学生写规范」,是删掉这几个开关,不是改镜像 —— 删之前先拿
|
||||||
* docs/c-tutorials/verify-code.sh 全量过一遍教程。
|
* docs/c-tutorials/verify-code.sh 全量过一遍教程。
|
||||||
*/
|
*/
|
||||||
const cLooseErrors =
|
const cLooseErrors =
|
||||||
"-Wno-error=implicit-function-declaration -Wno-error=int-conversion -Wno-error=incompatible-pointer-types"
|
"-Wno-error=implicit-function-declaration -Wno-error=int-conversion -Wno-error=incompatible-pointer-types -Wno-error=return-mismatch"
|
||||||
|
|
||||||
export const languageConfigs: Record<string, Record<string, unknown>> = {
|
export const languageConfigs: Record<string, Record<string, unknown>> = {
|
||||||
C: {
|
C: {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#
|
#
|
||||||
# ⚠️ 语言的编译/运行命令**不在这个文件里**,在 apps/api/src/judge/languages.ts。
|
# ⚠️ 语言的编译/运行命令**不在这个文件里**,在 apps/api/src/judge/languages.ts。
|
||||||
# 升 gcc 大版本要同步看那边的开关(gcc-14 把 implicit-function-declaration
|
# 升 gcc 大版本要同步看那边的开关(gcc-14 把 implicit-function-declaration
|
||||||
# 等提成了 error,languages.ts 里有三个 -Wno-error 把它压回去)。
|
# 等提成了 error,languages.ts 里有几个 -Wno-error 把它压回去)。
|
||||||
|
|
||||||
# 镜像源。默认走国内镜像 —— 官方源在这边实测 197 KB/s,清华 3.9 MB/s,
|
# 镜像源。默认走国内镜像 —— 官方源在这边实测 197 KB/s,清华 3.9 MB/s,
|
||||||
# 整个构建从 12 分钟掉到 2 分钟出头。出国内网络环境用 build.sh --no-mirror 关掉。
|
# 整个构建从 12 分钟掉到 2 分钟出头。出国内网络环境用 build.sh --no-mirror 关掉。
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ compose 里三处,一起改)。`docker compose up -d` 不带 `--pull`,名
|
|||||||
这些绝对路径挂到正确的版本上(Dockerfile 末尾的 `update-alternatives`)。
|
这些绝对路径挂到正确的版本上(Dockerfile 末尾的 `update-alternatives`)。
|
||||||
|
|
||||||
gcc-14 把隐式函数声明、int↔指针互赋、不兼容指针类型从 warning 提成了 error,`-w`
|
gcc-14 把隐式函数声明、int↔指针互赋、不兼容指针类型从 warning 提成了 error,`-w`
|
||||||
压不住。`languages.ts` 里的 `cLooseErrors` 三个 `-Wno-error=` 就是为此加的 ——
|
压不住。`languages.ts` 里的 `cLooseErrors` 里的 `-Wno-error=` 就是为此加的 ——
|
||||||
实测 1951 份历史 C 提交和 20 篇 C 教程的 93 个代码块,加了之后与 gcc-13 逐个文件
|
实测 1951 份历史 C 提交和 20 篇 C 教程的 93 个代码块,加了之后与 gcc-13 逐个文件
|
||||||
结果完全一致;不加的话有一批会从能过变成 CE。
|
结果完全一致;不加的话有一批会从能过变成 CE。
|
||||||
|
|
||||||
|
|||||||
+18
-1
@@ -54,7 +54,7 @@ int main(void) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
// 这条是升 gcc 的主要风险点:gcc-14 起 implicit-function-declaration 是
|
// 这条是升 gcc 的主要风险点:gcc-14 起 implicit-function-declaration 是
|
||||||
// error,languages.ts 里的三个 -Wno-error 就是为它加的。这条挂了说明那些
|
// error,languages.ts 里的几个 -Wno-error 就是为它加的。这条挂了说明那些
|
||||||
// 开关没生效 —— 后果是一批历史题解和 20 篇 C 教程的示例突然全 CE。
|
// 开关没生效 —— 后果是一批历史题解和 20 篇 C 教程的示例突然全 CE。
|
||||||
language: "C",
|
language: "C",
|
||||||
name: "C 忘了 #include 仍能过(gcc 宽松度)",
|
name: "C 忘了 #include 仍能过(gcc 宽松度)",
|
||||||
@@ -64,6 +64,23 @@ int main(void) {
|
|||||||
scanf("%d %d", &a, &b);
|
scanf("%d %d", &a, &b);
|
||||||
printf("%d\\n", a + b);
|
printf("%d\\n", a + b);
|
||||||
return 0;
|
return 0;
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// gcc-14 把 int 函数里不带值的 return; 也提成了 error(-Wreturn-mismatch)
|
||||||
|
language: "C",
|
||||||
|
name: "C 不带值的 return; 仍能过(gcc 宽松度)",
|
||||||
|
expect: JudgeStatus.ACCEPTED,
|
||||||
|
code: `#include <stdio.h>
|
||||||
|
int check(int a) {
|
||||||
|
if (a < 0) return;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
int main(void) {
|
||||||
|
int a, b;
|
||||||
|
scanf("%d %d", &a, &b);
|
||||||
|
printf("%d\\n", check(a) + b);
|
||||||
|
return 0;
|
||||||
}`,
|
}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user