卫军超++薛鹏鹏
摘 要 在程序设计语言教学过程中,教师往往运用手把手教学的方式对学生的源代码编程进行审核,这类传统的教学模式效率低下,也不便于学生之间的交流。构建一个基于白箱测试的建立在C语言基础上的教学平台,提高师生互动,促进大家学习交流,简化程序的评测过程,提高学习的效率。
【关键词】白箱测试 在线评测 C语言
高校程序设计类课程传统的手工评测方式有许多难以克服的弊端,对教学效果和学生编程能力的提高造成了许多障碍。随着计算机技术的发展,特别是Internet技术的普遍应用, 源代码在线评测系统应运而生,应用于各高校程序设计类课程的辅助教学,同时还可以当做程序编程设计等竞赛的模拟系统,和传统的手工测评方式相比较而言,优势明显。
1 研究内容
在分析和总结前人研究工作的基础上,本研究基于白箱测试实现对C语言源代码的评测,使其能够应用在具体教学实践中。
1.1 评测系统的关键技术
评测系统要用到以下几个关键技术:操作 My SQL 数据库;编译源代码;执行被测试的数据;测试运行结果;获取评测时间等。
1.2 代码安全性检测
代码安全检测是研究的核心内容。一旦源代码使用者提供了错误的恶意性质的代码,必然会影响服务器的正常运行。所以确保代码的安全性是保障系统正常使用的核心,需要及时对用户提供的源代码进行安全性检测,以白箱测试中的静态分析技术为前提,设计这一模块,针对C语言源代码常见的安全漏洞机械能给你检测,分析。重点研究存储越界错误、动态内存分配错误、内存泄漏、类型不一致错误、数组越界、死循环等类六类安全漏洞的检测方法。
1.3 代码剽窃检测
分析常见的代码剽窃的几种方式,及目前国内外代码剽窃检测技术的发展情况。代码剽窃检测这项技术的最终要的计算方法就是代码相似度的检测。检测两种代码的相似情况的主要方法有两种,属性计数和结构度量。结合实际教学环境,选择合适的代码相似度计算机方法,提出解决学生在日常的编程、考试中代码剽窃自动检测的设计方案。
2 评测技术的关键技术
本研究主要是对实现评测系统的技术进行研究,主要包括以下几个方面:评测系统的关键技术、代码安全检测、代码剽窃检测。
2.1 评测系统关键技术
(1)采用C语言操作MySQL数据库。用到的API主要有:MYSQL*mysql_init(MYSQL*mysql),用来实现初始化一个MySQL对象。
MYSQL* mysql_connect(MYSQL*mysql,const char*host,const*user,const char*passwd),用来实现连接数据库。
int mysql_query(MYSQL *mysql,const char*query),实现对SQL语句的执行操作。
(2)对源代码进行编译,实现对源代码的编译要用到以下主要参数:
-o out_file:表示将编译后的可执行文件存储为out_file。如out_file为空,则则编译后的可执行文件存储为a.out;
-O2:在编译的过程中会采取优化处理方式;
-Wall:在编译时,程序会及时输出警告信息;
-Im:-I编译时,链接库会被连接;-I后面会出现需要要链接的库名。-Im表示会链接数学库;
-Static:在编译过程中,进行连接链接库时,会使用静态链接库进行连接,及时避免连接动态的链接库。
(3)源代码文件编译通过之后,会生成一个名为“main”的文件接下来的工作是测试程序的正确性,源代码的正确性测评采用的是黑盒测试,执行被测试程序的过程如下:重定向输入输出文件;创建一个子进程;设置资源限制;用函数调用要执行的程序。
(4)用来检测程序运行情况的思路是这样的:在对待评测程序进行评测时,要使用标准的输入文件,把标准文件输出的数据和待评测程序输出的数据比较分析,假设待评测程序的结果和标准的一样,那么久可以判断此待评测程序编码是正确的,如果有出入,就认为待评测程序是错误的,当然,在检测和对照的过程中,要确保时间合适,注意监视内存情况,假设超出时间和内存的限制就需要及时返回错误代码,测评时间就是看测试前后系统时间差。
2.2 代码安全检测
在检测代码安全性之前,要检查C语言是否存在安全漏洞,如果有,就好及时分析,在安全漏洞中破坏性较大的、典型很难发现的的一共有六种。
(1)存储越界错误;
(2)动态内存分配错误:
(3)内存泄漏;
(4)类型不一致错误;
(5)指针错误;
(6)死循环。
针对对内存泄漏和数组越界两大类漏洞找到合适的检测方法。
2.3 代码剽窃检测
作为代码剽窃检测的最重要的技术就是计算两个代码的相似度,也就是通过一种检测手段来衡量两个代码是否具有相似性,代码相似度计算的方法一共有两种,分别是:属性技术;结构度量。在代码剽窃检测的初始阶段,属性技术的方法被最早被提出和使用,结构度量的方式是后来才出现的。这两中度量的方式共同点是在对相应的程序代码做分析后,归纳出数字化的特征,运用特征这一向量把不同的属性综合起来,表征程序。两种度量方法的区别在于,前者仅仅处理各种代码的统计属性,忽略其内部结构;但是后者主要是针对程序的内部结构进行度量,通过对分析控制流和嵌套深度的整理,运用得出的度量值分析程序特征向量。所以,结构度量法比属性计数法应用的更加广泛,或者可以将两者结合起来检测代码剽窃软件。
针对学校学生的实际情况,考虑采用属性计数法采计算代码相似程度,且投入较少、易于实现,也方便拓展到不同的语言。在完成代码相似度的计算以后,根据计算结果判断代码是否是剽窃嫌疑,将所有嫌疑代码及涉嫌学生明确列出,供教师进行进一步审查。基本流程如图1。
3 结束语
该文提出了一个基于白箱测试的C语言在线评测系统设计方法,并解决了在搭建系统过程中遇到的一些列问题,方便了教师和学生对于源代码的评测。当然此平台上基本实现了代码的自动评测,下一步要做的工作是改进剽窃检测模块,以适用教学需求。
参考文献
[1]苑文会.黑盒测试技术在辅助教学系统中的应用[J].计算机工程与设计,2006,27(23):4604-4606.
[2]吕鹏,戴冠中.Linux下Ptrace()调用的安全分析[J].计算机应用研究,2005,22(08):102-104.
作者单位
西安交通工程学院 陕西省西安市 710300