Skip to content

CDFLS/Judge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Judge

demo1

一个简单的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。

Todo

  • 对命令参数的查错
  • 对文件输入输出的检查和支持
  • 一次完成对一次考试的评测(读取data、source目录下的多个选手程序和多道题目的测试数据)
  • 检查头文件,并可通过命令行添加头文件黑名单
  • 设置文件
  • CUI
  • 调用外部SPJ
  • Sandbox
  • 更多的配置项
  • define解析
  • 多线程评测

已知 Bug

终端宽度不够时CLI陷入死循环。
时间限制小于一秒时可能出错。
测试出的内存与 lemon 略有出入。

Help

如果你初次接触,可以在一次考试的根目录下运行 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]: 额外信息文件(可以不创建)

更多截图

demo2 demo3 demo5 demo4 cui