judge: differentiate exit code with signalled (#664)

This commit is contained in:
Yang Gao authored and GitHub committed 2023-09-29 19:40:58 +08:00
1 parent 659bd9f4aa
commit efd9fc5c13
5 files changed
+16 -8

No files matched your search

+2 -2
View File
@@ -26,7 +26,7 @@ function judgeCase(c: NormalizedCase) {
},
);
const {
code, time, memory, fileIds,
code, signalled, time, memory, fileIds,
} = res;
let { status } = res;
let message: any = '';
@@ -50,7 +50,7 @@ function judgeCase(c: NormalizedCase) {
}));
}
} else if (status === STATUS.STATUS_RUNTIME_ERROR && code) {
if (code < 32) message = signals[code];
if (code < 32 && signalled) message = signals[code];
else message = { message: 'Your program returned {0}.', params: [code] };
}
await Promise.allSettled(Object.values(res.fileIds).map((id) => del(id)));
+4 -2
View File
@@ -51,7 +51,9 @@ export async function judge(ctx: Context) {
cacheStdoutAndStderr: true,
},
);
const { code, time, memory } = res;
const {
code, signalled, time, memory,
} = res;
let { status } = res;
let message: any = '';
if (status === STATUS.STATUS_ACCEPTED) {
@@ -73,7 +75,7 @@ export async function judge(ctx: Context) {
}));
}
} else if (status === STATUS.STATUS_RUNTIME_ERROR && code) {
if (code < 32) message = signals[code];
if (code < 32 && signalled) message = signals[code];
else message = { message: 'Your program returned {0}.', params: [code] };
}
await Promise.allSettled(Object.values(res.fileIds).map((id) => del(id)));
+4 -2
View File
@@ -13,7 +13,9 @@ function judgeCase(c: NormalizedCase) {
return async (ctx: Context, ctxSubtask: ContextSubTask) => {
ctx.executeInteractor.copyIn.in = c.input ? { src: c.input } : { content: '' };
ctx.executeInteractor.copyIn.out = c.output ? { src: c.output } : { content: '' };
const [{ code, time, memory }, resInteractor] = await runPiped(
const [{
code, signalled, time, memory,
}, resInteractor] = await runPiped(
{
execute: ctx.executeUser.execute,
copyIn: ctx.executeUser.copyIn,
@@ -39,7 +41,7 @@ function judgeCase(c: NormalizedCase) {
status = STATUS.STATUS_MEMORY_LIMIT_EXCEEDED;
} else if ((code && code !== 13/* Broken Pipe */) || (code === 13 && !resInteractor.code)) {
status = STATUS.STATUS_RUNTIME_ERROR;
if (code < 32) message = signals[code];
if (code < 32 && signalled) message = signals[code];
else message = { message: 'Your program returned {0}.', params: [code] };
} else {
const result = parse(resInteractor.stderr, c.score);
+4 -2
View File
@@ -57,7 +57,9 @@ export const judge = async (ctx: Context) => {
},
1,
);
const { code, time, memory } = res;
const {
code, signalled, time, memory,
} = res;
let { status } = res;
const message: string[] = [];
if (time > parseTimeMS(ctx.config.time || '1s')) {
@@ -66,7 +68,7 @@ export const judge = async (ctx: Context) => {
status = STATUS.STATUS_MEMORY_LIMIT_EXCEEDED;
} else if (code) {
status = STATUS.STATUS_RUNTIME_ERROR;
if (code < 32) message.push(`ExitCode: ${code} (${signals[code]})`);
if (code < 32 && signalled) message.push(`ExitCode: ${code} (${signals[code]})`);
else message.push(`ExitCode: ${code}`);
}
message.push(res.stdout, res.stderr);
+2
View File
@@ -45,6 +45,7 @@ interface Parameter {
interface SandboxAdaptedResult {
status: number;
code: number;
signalled: boolean;
/** in miliseconds */
time: number;
/** in kilobytes */
@@ -114,6 +115,7 @@ async function adaptResult(result: SandboxResult, params: Parameter): Promise<Sa
// FIXME: Signalled?
const ret: SandboxAdaptedResult = {
status: statusMap.get(result.status) || STATUS.STATUS_ACCEPTED,
signalled: result.status === SandboxStatus.Signalled,
time: result.time / 1000000 / rate,
memory: result.memory / 1024,
files: result.files,