一个简单的OI程序评测程序,目前只支持Linux,将来也不会支持Windows。
当以root运行时会使用chroot来实现一个简单的沙盒。
拥有一个简单的CLI,结果可导出至CSV文件
可将执行过程重定向到文件(将会显示进度)
会判定freopen是否写错,如果写错且爆0将给出FileError(但不一定准确,可能只是单纯地写了个freopen("./bala.in", "r", stdin)然后WA了而已,不过我不觉得有这种非主流)
运行make构建,运行make en构建英文版。
Arch Linux 64位上g++ 7.1.1编译成功。
对于一份代码,首先会在副本中删除所有include行(同时检查头文件),然后对g++ -E -P -DEJUDGE的输出进行字符串搜索(从而防止使用宏定义避免搜索)。然后检测是否以root运行,是则使用chroot。
- 对命令参数的查错
- 对文件输入输出的检查和支持
- 一次完成对一次考试的评测(读取data、source目录下的多个选手程序和多道题目的测试数据)
- 检查头文件,并可通过命令行添加头文件黑名单
- 设置文件
- CUI
- 调用外部SPJ
- Sandbox
- 更多的配置项
- define解析
- 多线程评测
终端宽度不够时CLI陷入死循环。
时间限制小于一秒时可能出错。
测试出的内存与 lemon 略有出入。
如果你初次接触,可以在一次考试的根目录下运行 judge -g 命令生成 judge.conf 配置文件 也可查看 judge --help 或 example 目录。
用法:judge [选项]...
评测OI程序,编译当前目录下和source/[选手名]目录下的代码(使用该代码父目录名),并使用当前目录下和data/[题目名]目录下的数据(自动查找)评测。文件操作自动检测(仅检测freopen)。
当以root权限运行judge时,将调用chroot实现一个简单的沙盒。
代码检测仅检测C与C++
编译使用命令:
timeout 10s g++ -static -std=c++11 -s -lm -DEJUDGE %s -o Exec/%s
timeout 10s gcc -static -std=c99 -fno-asm -s -lm -DEJUDGE %s -o Exec/%s
timeout 10s fpc -Xs -Sgic -dEJUDGE %s -oExec/%s
judge python %s Exec/%s
judge python2 %s Exec/%s
-f [STRING] 禁止源文件中出现该函数
-f[NUMBER] [STRING]... 禁止源文件中出现以下NUMBER个函数
-h [STRING] 禁止源文件中出现该头文件
-h[NUMBER] [STRING]... 禁止源文件中出现以下NUMBER个头文件
-t [TIME] 限定程序运行时间(未指定时为1s)
-m [MEMORY] 限制程序使用内存(为指定时为128000KB)
--csv 输出结果到result.csv,当人数大于一时默认开启
--nocsv 禁止输出到result.csv(即使人数大于一)
-c, --cli 使用一个简单的CLI管理一次考试
-o 开启 O2 优化
-g 生成一份配置文件方便修改
-s 执行脚本
--help 显示本帮助
全局配置文件:
程序会依次从~/.judgerc和./judge.conf中读取设置,设置文件格式为:[选项]([参数1],[参数2]......)
当参数为字符串且参数不定时,会启用转义符,如"\,"表示",","\("表示"("目前支持以下选项:
无参数:
quit 回到全局配置编辑模式(在enter命令结束时使用)
一个参数:
background, bg 设置输出AC、WA等的背景色,有以下值可选:black green red blue yellow cyan white purple
FileIO, file 强制使用或不使用文件输入输出(默认情况下检测freopen),值:true false
O2, optimize 开启 O2 优化,值:true false
enter 对[参数1]问题进行配置,使接下来的命令按照配置文件解析,quit命令结束
两个参数:
SourceProblem, source, s 将问题[值1]按照配置文件(详见下一部分)[值2]进行配置
多个参数:
Func, f 将所有参数加入禁用函数列表
Header, h 将所有参数加入禁用头文件列表
示例配置:
./judgerc:
h(fstream)
f(folk)
source(aplusb,config)
file(true)
./config:
time(2.0)
memo(64000)
score(10)
问题配置文件:
三个选项,格式同judgerc
time, t 时间
memo, memory, m 内存
score, s 单个测试点分数
rename, ren, r 重命名问题
示例同上。
CLI模式:
tab键切换模式(重测和查看记录),ws上下移动,ad翻页,enter选择,q退出
SPJ说明:
将SPJ编译,放在data对应题目目录下,命名为spj(或者将spj.cpp放在该目录下,将会被自动编译)
SPJ参数:
- argv[1]: 标准输入文件
- argv[2]: 选手输出文件
- argv[3]: 标准输出文件
- argv[4]: 本测试点满分
- argv[5]: 分数输出文件(必须创建),仅一行,包含一个非负整数,表示得分.
- argv[6]: 额外信息文件(可以不创建)