恶意卡TLE && 测评时判断OJ是否将TLE判成RE或WA

本文讨论了部分在线编程平台(oj)如何识别并防止卡tle的恶意代码,特别是针对复杂运算如无限循环的策略。对于某些特定平台如LA,实现卡tle可能更具挑战性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大部分oj能识别恶意卡tle的代码,但实在要卡还是可以做到的(想卡LA确实难)。

//能识别的
for(int i=1;i<=1000000000;i++)
for(int j=1;j<=1000000000;j++)
tt=i+j;


### Golang 在线评测系统项目示例 #### 项目概述 构建一个基于Golang的在线评测系统(OJ),可以实现编程题目提交、自动评判以及结果反馈功能。此类系统广泛应用于教育领域,帮助学生练习算法和提高编程技能。 #### 主要模块设计 ##### 用户管理模块 负责用户的注册登录认证逻辑,包括但不限于密码加密存储、权限校验等安全措施[^1]。 ```go type User struct { ID int `json:"id"` Username string `json:"username"` Password string `json:"-"` } ``` ##### 题目管理模块 维护题目的元数据信息,如描述、输入输出样例、间空间限制条件等,并支持多分类标签体系以便检索查询。 ```go type Problem struct { ID int `json:"id"` Title string `json:"title"` Description string `json:"description"` InputSpec string `json:"input_spec"` OutputSpec string `json:"output_spec"` TimeLimitMS float64 `json:"time_limit_ms"` MemoryLimitKB int `json:"memory_limit_kb"` } ``` ##### 提交评审模块 接收来自前端页面上传代码文件后端解析编译运行获取最终得分并返回给客户端显示;此部分需考虑沙箱隔离机制防止恶意脚本攻击风险。 ```go func JudgeSubmission(submissionID int) error { submission, err := GetSubmissionByID(submissionID) if err != nil { return fmt.Errorf("failed to get submission %d: %v", submissionID, err) } problem, err := GetProblemByID(submission.ProblemID) if err != nil { return fmt.Errorf("failed to get problem %d: %v", submission.ProblemID, err) } resultChan := make(chan *JudgementResult) go func() { defer close(resultChan) sandbox := NewSandbox() defer sandbox.Close() codeFile, _ := ioutil.TempFile("", "submission_*.cpp") _, _ = codeFile.WriteString(submission.Code) _ = codeFile.Close() compileCmd := exec.Command("/usr/bin/g++", "-o", "/tmp/submission.out", codeFile.Name()) if err := compileCmd.Run(); err != nil { resultChan <- &JudgementResult{ Status: "CE", Score: 0, } return } runCmd := exec.Command("/tmp/submission.out") var stdoutBuf bytes.Buffer runCmd.Stdout = &stdoutBuf timer := time.NewTimer(time.Millisecond * time.Duration(problem.TimeLimitMS)) done := make(chan bool, 1) go func() { exitErr := runCmd.Run() done <- true if exitErr != nil && exitErr.Error() == "signal: killed" { resultChan <- &JudgementResult{Status: "TLE"} return } else if exitErr != nil { resultChan <- &JudgementResult{Status: "RE"} return } outputStr := strings.TrimSpace(stdoutBuf.String()) if !strings.EqualFold(outputStr, problem.OutputSpec) { resultChan <- &JudgementResult{Status: "WA"} return } resultChan <- &JudgementResult{Status: "AC", Score: 100} }() select { case <-done: case <-timer.C: process.Kill() resultChan <- &JudgementResult{Status: "TLE"} } }() judgementRes := <-resultChan UpdateSubmissionResult(submission.ID, judgementRes.Status, judgementRes.Score) return nil } type JudgementResult struct { Status string Score int } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值