diff --git a/example/go/1000/in.txt b/example/go/1000/in.txt new file mode 100644 index 0000000..e69de29 diff --git a/example/go/1000/main.go b/example/go/1000/main.go new file mode 100644 index 0000000..5ee8a3d --- /dev/null +++ b/example/go/1000/main.go @@ -0,0 +1,6 @@ +package main +import "fmt" + +func main() { + fmt.Println("Hello World!") +} \ No newline at end of file diff --git a/example/go/1000/out.txt b/example/go/1000/out.txt new file mode 100644 index 0000000..c57eff5 --- /dev/null +++ b/example/go/1000/out.txt @@ -0,0 +1 @@ +Hello World! \ No newline at end of file diff --git a/example/go/1001/in.txt b/example/go/1001/in.txt new file mode 100644 index 0000000..1ed0fb7 --- /dev/null +++ b/example/go/1001/in.txt @@ -0,0 +1 @@ +2 3 \ No newline at end of file diff --git a/example/go/1001/main.go b/example/go/1001/main.go new file mode 100644 index 0000000..8fcc0ba --- /dev/null +++ b/example/go/1001/main.go @@ -0,0 +1,9 @@ +package main +import "fmt" + +func main() { + var a, b int + fmt.Scan(&a) + fmt.Scan(&b) + fmt.Println(a + b) +} diff --git a/example/go/1001/out.txt b/example/go/1001/out.txt new file mode 100644 index 0000000..7813681 --- /dev/null +++ b/example/go/1001/out.txt @@ -0,0 +1 @@ +5 \ No newline at end of file diff --git a/example/main.py b/example/main.py index ad8be8c..a528218 100644 --- a/example/main.py +++ b/example/main.py @@ -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__": diff --git a/src/allow.rs b/src/allow.rs index 5657487..a9c5ded 100644 --- a/src/allow.rs +++ b/src/allow.rs @@ -6,19 +6,31 @@ pub fn gen_rules() -> Vec { 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 { 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 { 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 { 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 { 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), ] diff --git a/src/judger.rs b/src/judger.rs index 972e5e6..0fe8870 100644 --- a/src/judger.rs +++ b/src/judger.rs @@ -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 {