我计划在 CodeChef、TechGig 等方面建立一个在线评委。最初,我将只接受 C/C++ 中的解决方案。
已经考虑过相同的安全模型,但我现在关心的是如何对执行和测试部分进行建模。
方法一
似乎更流行的方法是将标准输入重定向到可执行文件,并将标准输出重定向到文件,例如:
./submission.exe < input.txt > output.txt
然后将 output.txt 文件与一些 solution.txt 文件逐个字符进行比较并报告结果。
方法二
我看到的第二种方法是不允许用户编写 main()。相反,编写一个以字符串形式接受一些参数并将全局变量设置为输出的函数。例如:
//This variable should be set before returning from submissionAlgorithm()
char * output;
void submissionAlgorithm(char * input1, char * input2)
{
//Write your code here.
}
在每个步骤中,对于要执行的测试用例,重复调用函数 submitAlgorithm() 并检查输出变量的结果。
形成初步分析,我发现方法 2 不仅是安全的(我会阻止从提交的代码对文件系统的所有读写访问),而且由于测试的计算可以更快地执行测试用例(也许?)结果会出现在内存中。
我想知道是否有任何理由说明为什么方法 1 优于方法 2。
PS:当然,我会在 Linux 服务器上托管在线判断引擎。