JCoder-Pro / FeedBack

This repository is for collecting feedback from JCoder users. Your feeling and feedback matter.
5 stars 1 forks source link

基于IO的测评在超时的时候显示返回结果错误 #4

Closed YeeTone closed 2 years ago

YeeTone commented 2 years ago

考虑22春季学期中一道时限为2000ms的题目:

image

使用如下代码提交,由于Thread.sleep(2250)的语句,该代码的运行结果应当是超时:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(2250);
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        //... some other codes are omitted.
    }
}

但是考虑先后两次相同的提交,ID分别为#37337和#37357,得到的运行结果中并无TLE,而是大部分的WA和少部分的AC:

image

image

这是否说明对于超时的检测机制存在一定的漏洞?

liuxukun2000 commented 2 years ago

产生原因

您好,我查看了这道题目的配置,发现产生这类错误的原因是SPJ脚本在测试时未加入状态判断。也就是说,无论用户代码是否正常执行,SPJ脚本都会对输出进行对比并修改原始测评状态。

处理方式

在SPJ脚本中加入判断。

处理结果

经测试TLE可以正常被判断。

YeeTone commented 2 years ago

产生原因

您好,我查看了这道题目的配置,发现产生这类错误的原因是SPJ脚本在测试时未加入状态判断。也就是说,无论用户代码是否正常执行,SPJ脚本都会对输出进行对比并修改原始测评状态。

处理方式

在SPJ脚本中加入判断。

处理结果

经测试TLE可以正常被判断。

感谢及时处理!修复后尝试重测#37337和#37357,测评结果出现部分RE,请问对于这个现象是否有比较合理的解释?

image

image

liuxukun2000 commented 2 years ago

产生原因

您好,这是由于沙箱限制时间的精度的问题,您遇到的RE实际上是被沙箱kill导致的。建议在时间设置上不使用整数(秒)作为时限,可以适当增加。如修改为2001。具体原因涉及测评机构建,在此不便透露。

处理方式

适当增加时限。

处理结果

RE消失,错误类型为TLE

YeeTone commented 2 years ago

Nice work!