舒新峰,何孝敏,郭芳瑶
(西安邮电大学 计算机学院,陕西 西安 710121)
C语言具备表达能力强、语法简洁紧凑以及执行效率高等特点,已广泛应用于操作系统和控制系统等各类底层软件开发中,是高校信息类专业普遍开设的必修课程。为了提升学生C语言编程能力,许多高校在C语言程序设计课程教学中打破传统的纸质作业和试卷的考核方式,引入“程序自动判定系统”对学生的作业和试卷进行计算机自动判定,通过考核手段改革引导学生强化C语言编写程序能力训练,并取得了良好的教学效果。数组是C语言广泛使用的一种数据类型,操作数组的方法和程序表达方式的多样性,给程序自动评分带来了困难。
栈返回地址保护[1-2]、数据追踪和插入检测代码[3]等动态评分方法可以应用于含有数组的C程序评分,但评测结果单一,只有0分或满分,不能很好地满足教学需要。静态评分方法主要是将源程序转化为系统依赖图[4]、控制流[5]和抽象语法树[6](Abstract Syntax Tree,AST)等中间表示形式,然后通过树或图的匹配算法[7]计算语句相似度进行评分。该方法虽然考虑了程序结构,但现有的中间表示形式不能准确表达程序语义及语句依赖关系,若数组空间大小不同或计算数组下标方式不同,则会导致误判,降低了评分的准确性。文献[8]将数组越界问题转化为下标变量取值的范围分析问题,利用抽象解释技术[9]进行数组越界的判定,但该方法对循环语句中数组的检测结果精度较低。……