第一章绪论
1.1传统的手工评测模式
在信息时期由于计算机和网络技术的飞速发展,计算机技术早己深入到各个行业。作为一名高素质的人才,不仅需要具备专业的知识,还需要具备一定的计算机技术。为了适应社会发展的需要,许多高校开始培养学生的计算机技术,尤其是计算机编程能力。编程能力对于大学生来说己经变得越来越重要。如果学生想提高编程能力,就需要进行大量的编程练习。另一方面,教师需要阅读学生编写的程序,纠正在程序中出现的错误,并给出相关的修改意见。手工评测代码的流程大致如下:
1.教师布置一部分编程题目,并给出学生完成编程题目的时间。
2.学生在这段时间内研究题目、编写代码。同时也可以向教师请教和提问。
3.学生在作业期限以内,以邮件或纸件的方式提交程序。
4.教师阅读代码、修改代码、给出成绩和相关的修改意见。
5.最后收集提交的代码中出现的常见错误,然后给学生进行讲解。显然,传统的手工评测代码的方法是费时、费力、低效率的。
1.2源代码在线评测系统的概述
在这一节主要介绍了国内外的源代码在线评测系统的发展情况和源代码在线评测系统可能存在的安全性问题。
1.2.1源代码在线评测系统的发展
因为手工评测源代码的方法是:低效率的、费时的、且准确性不高。因此为了能够高效地、准确地检测复杂的源代码,许多著名的大学开发出了各种源代码在线评测系统。
在最近几十年里,随着技术和相关理论的不断发展,基于Web的在线考试系统得到了飞速的发展,己经成为现代远程教育研究的一个热点。较为典型的教学考试平台有Lotos公司的Learning Space,英属哥伦比亚大学计算机科学系开发的Web CT(Web Course Tools) } WBT System公司的Top Class和加拿大SimonFraser开发的Virtual-U。目前最著名的、最具有影响力的源代码评测系统是PC2自动检测系统,该系统服务于国际大学生程序设计竞赛。
在国内,多所高校先后建立了自己的Online Judge平台,其中比较知名的有北京大学的Peking University Online Judge System,浙江大学的ZJU Online JudgeSystem以及同济大学的Tongji Online Judge System。我校(北京化工大学)也开发出了相应的在线评测系统。
1.2.2源代码在线评测系统存在的安全性问题
然而源代码在线评测系统可能会存在着一些安全问题。这些问题将会给系统造成严重的危害。因为通过网络提交的源代码本身是可能存在问题和危害的,甚至带有恶意的代码。然而源代码在线评测系统一般只对提交的源代码进行编译,不会对源代码中可能出现的安全漏洞进行检测。如果运行这些带有安全漏洞的程序,将会给源代码在线系统造成严重的危害。更加严重的话,将会造成整个在线评测系统的“瘫痪”。
1.3 C/C++源代码中常见的错误
在这一小节中,将介绍C/C++源代码中常见的一些运行时错误(存储越界、动态存储分配问题、内存泄露问题),并列举出了这些错误的一些表现形式。
1.3.1存储越界
存储越界是指一个变量读或写超出变量分配的内存空间。在C语言程序中,存储越界是一个十分普遍的问题,尤其是数组越界问题。存储越界往往是因为程序员的疏忽而造成的,并且这类错误不容易被发现。而如今的C编译器不会对缓冲区和数组进行边界检测,这样就可能造成程序越界读或写内存数据,从
造成极大的安全问题。在C语言程序中进行字符串操作时,C语言编译器通过识别字符串末尾的标识符来判断字符串是否结束,这种识别机制就很容易造成越界访问和其它相关错误。如果程序越界读取数据,将得到错误信息。甚至可能会出现安全问题,成为系统安全漏洞;如果程序越界写内存数据,被访问的内存数据就会遭到非法破坏。需要改写的内存数据没有被改写,不该改写的内存数据被重写,这将会造成比较严重的安全问题。如果函数的返回地址被越界修改,就很可能出现运行时错误,更严重的是造成系统“崩溃”。
第二章 系统架构........... 28-34
2.1 C/C++源代码静态........... 28
2.2 系统的符号........... 28-31
2.3 CSTS的架........... 31-34
2.3.1 CSTS的主体........... 31-32
2.3.2 CSTS的模块........... 32-34
第三章 静态分析树的........... 34-38
3.1 系统的静态........... 34
3.2 静态分析........... 34-38
3.2.1 静态分析树........... 35-37
3.2.2 静态分析树........... 37-38
第四章 基于静态分析树的........... 38-58
4.1 CSTS系统的路径........... 38-40
4.2 CSTS的符号计........... 40-45
4.2.1 数据结........... 40
4.2.2 符号计算........... 40-42
4.2.3 符号计算实例........... 42-45
4.3 调用函数的........... 45-47
4.3.1 相关的数据........... 45-46
4.3.2 处理过程........... 46-47
4.4 懒符号执行........... 47-49
4.4.1 懒符号执行........... 47-49
4.5 字符串操作函数........... 49
4.5.1 缓冲区长度........... 49
4.6 动态内存分配函数........... 49-52
4.6.1 检测动态释放非........... 50
4.6.2 检测内存分配和........... 50-51
4.6.3 检测重复释放........... 51
4.6.4 检测释放连续内存........... 51
4.6.5 检测未释放的内存........... 51-52
总结
本文设计了一个基于C/C++源程序的静态检测系统CSTS。该系统将会对学生在我校OJ系统提交的源程序进行检测,判断提交的源程序中是否存在数组越界、字符串函数的错误调用、存储越界等运行时错误。CSTS系统主要采用了静态分析技术和符号执行技术。通过静态分析获取到程序的静态分析树。在静态分析树的基础上,通过符号执行来获取程序中所有变量的符号值和程序在各个基本点的约束条件。最后通过约束求解和变量分析,给出相应的分析结果。通过测试,CSTS系统基本达到了预期的效果。
本文的主要工作如下:
(1)收集了大量的由学生提交的C/C++语言源代码。对这些程序进行分析,找出程序中存在的运行时错误。通过分析将这些错误分类,并抽象出这些错误的相似特征。静态检测系统的目标就是检