add language: Go

This commit is contained in:
MeiK 2020-11-05 17:21:33 +08:00
parent 05986d6923
commit 31caf33d9d
9 changed files with 52 additions and 3 deletions

0
example/go/1000/in.txt Normal file
View File

6
example/go/1000/main.go Normal file
View File

@ -0,0 +1,6 @@
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}

1
example/go/1000/out.txt Normal file
View File

@ -0,0 +1 @@
Hello World!

1
example/go/1001/in.txt Normal file
View File

@ -0,0 +1 @@
2 3

9
example/go/1001/main.go Normal file
View File

@ -0,0 +1,9 @@
package main
import "fmt"
func main() {
var a, b int
fmt.Scan(&a)
fmt.Scan(&b)
fmt.Println(a + b)
}

1
example/go/1001/out.txt Normal file
View File

@ -0,0 +1 @@
5

View File

@ -17,6 +17,8 @@ def judge(path, language):
filename = "Main.java"
elif language == river_pb2.Rust:
filename = "main.rs"
elif language == river_pb2.Go:
filename = "main.go"
with open(path.joinpath(filename), "rb") as fr:
code = fr.read()
with open(path.joinpath("in.txt"), "rb") as fr:
@ -67,6 +69,11 @@ def run():
for item in stub.Judge(judge(path, river_pb2.Rust)):
print(item)
print(f"{path} 评测完成")
for path in Path("go").iterdir():
print(f"开始评测 {path}")
for item in stub.Judge(judge(path, river_pb2.Go)):
print(item)
print(f"{path} 评测完成")
if __name__ == "__main__":

View File

@ -6,19 +6,31 @@ pub fn gen_rules() -> Vec<SyscallRuleSet> {
allow_syscall(libc::SYS_access),
allow_syscall(libc::SYS_arch_prctl),
// allow_syscall(libc::SYS_brk),
allow_syscall(libc::SYS_chdir),
allow_syscall(libc::SYS_chmod),
allow_syscall(libc::SYS_chown),
allow_syscall(libc::SYS_clock_adjtime),
allow_syscall(libc::SYS_clock_getres),
allow_syscall(libc::SYS_clock_gettime),
allow_syscall(libc::SYS_clone),
allow_syscall(libc::SYS_close),
allow_syscall(libc::SYS_connect),
allow_syscall(libc::SYS_copy_file_range),
allow_syscall(libc::SYS_epoll_create1),
allow_syscall(libc::SYS_epoll_ctl),
allow_syscall(libc::SYS_epoll_pwait),
allow_syscall(libc::SYS_dup),
allow_syscall(libc::SYS_dup2),
allow_syscall(libc::SYS_dup3),
allow_syscall(libc::SYS_execve),
allow_syscall(libc::SYS_exit),
allow_syscall(libc::SYS_exit_group),
allow_syscall(libc::SYS_fallocate),
allow_syscall(libc::SYS_fchdir),
allow_syscall(libc::SYS_fchmod),
allow_syscall(libc::SYS_fchmodat),
allow_syscall(libc::SYS_fchown),
allow_syscall(libc::SYS_fchownat),
allow_syscall(libc::SYS_fcntl),
allow_syscall(libc::SYS_fork),
allow_syscall(libc::SYS_fstat),
@ -26,6 +38,7 @@ pub fn gen_rules() -> Vec<SyscallRuleSet> {
allow_syscall(libc::SYS_futex),
allow_syscall(libc::SYS_getcwd),
allow_syscall(libc::SYS_getdents),
allow_syscall(libc::SYS_getdents64),
allow_syscall(libc::SYS_getegid),
allow_syscall(libc::SYS_geteuid),
allow_syscall(libc::SYS_getgid),
@ -43,9 +56,12 @@ pub fn gen_rules() -> Vec<SyscallRuleSet> {
allow_syscall(libc::SYS_madvise),
// allow_syscall(libc::SYS_mmap),
allow_syscall(libc::SYS_mkdir),
allow_syscall(libc::SYS_mkdirat),
allow_syscall(libc::SYS_mlock),
allow_syscall(libc::SYS_mprotect),
// allow_syscall(libc::SYS_munmap),
allow_syscall(libc::SYS_nanosleep),
allow_syscall(libc::SYS_newfstatat),
allow_syscall(libc::SYS_open),
allow_syscall(libc::SYS_openat),
allow_syscall(libc::SYS_pipe2),
@ -53,9 +69,13 @@ pub fn gen_rules() -> Vec<SyscallRuleSet> {
allow_syscall(libc::SYS_prctl),
allow_syscall(libc::SYS_pread64),
allow_syscall(libc::SYS_prlimit64),
allow_syscall(libc::SYS_pwrite64),
allow_syscall(libc::SYS_pwritev),
allow_syscall(libc::SYS_read),
allow_syscall(libc::SYS_readlink),
allow_syscall(libc::SYS_readlinkat),
allow_syscall(libc::SYS_rename),
allow_syscall(libc::SYS_renameat),
allow_syscall(libc::SYS_rmdir),
allow_syscall(libc::SYS_rt_sigaction),
allow_syscall(libc::SYS_rt_sigprocmask),
@ -73,11 +93,14 @@ pub fn gen_rules() -> Vec<SyscallRuleSet> {
allow_syscall(libc::SYS_statx),
allow_syscall(libc::SYS_sysinfo),
allow_syscall(libc::SYS_tgkill),
allow_syscall(libc::SYS_unlinkat),
allow_syscall(libc::SYS_umask),
allow_syscall(libc::SYS_uname),
allow_syscall(libc::SYS_unlink),
allow_syscall(libc::SYS_utimensat),
allow_syscall(libc::SYS_vfork),
allow_syscall(libc::SYS_wait4),
allow_syscall(libc::SYS_waitid),
allow_syscall(libc::SYS_write),
allow_syscall(libc::SYS_writev),
]

View File

@ -59,7 +59,8 @@ pub async fn judger(
// 开始执行并等待返回结果
let mut runner = process.runner.clone();
// 为 Java 虚拟机取消内存限制和 trace万恶的 JVM
if request.language == Language::Java as i32 {
// 看起来虚拟机语言都有同样的问题
if request.language == Language::Java as i32 || request.language == Language::Go as i32 {
runner.memory_limit = -1;
runner.traceme = false;
}
@ -131,7 +132,7 @@ pub async fn compile(
Some(Language::Rust) => "/root/.cargo/bin/rustc main.rs -o a.out -C opt-level=2",
Some(Language::Node) => "/usr/bin/node /plugins/js/validate.js main.js",
Some(Language::TypeScript) => "/usr/bin/tsc main.ts",
Some(Language::Go) => "/usr/bin/go build -ldflags \"-s -w\" main.go",
Some(Language::Go) => "/usr/bin/go build -o a.out main.go",
Some(Language::Java) => "/usr/bin/javac Main.java",
None => return Err(Error::LanguageNotFound(request.language)),
};
@ -149,7 +150,7 @@ pub async fn compile(
let mut runner = process.runner.clone();
runner.traceme = false;
// 为 Java 虚拟机取消内存限制(万恶的 JVM
if request.language == Language::Java as i32 {
if request.language == Language::Java as i32 || request.language == Language::Go as i32 {
runner.memory_limit = -1;
}
if request.language == Language::Rust as i32 {