C程序自动测试方法
- 格式:doc
- 大小:26.00 KB
- 文档页数:4
web程序自测方法摘要:一、引言二、Web程序自测方法概述1.浏览器的开发者工具2.网络爬虫工具3.代码审计工具4.自动化测试工具5.手动测试方法三、各方法详细介绍与操作步骤1.浏览器的开发者工具a.打开浏览器开发者工具b.切换到对应的测试环境c.查看和调试代码2.网络爬虫工具a.选择合适的爬虫工具b.编写爬虫脚本c.执行爬虫任务3.代码审计工具a.选择合适的代码审计工具b.导入代码库c.执行代码审计4.自动化测试工具a.选择合适的自动化测试工具b.编写测试脚本c.执行自动化测试5.手动测试方法a.针对功能点进行测试b.检查页面布局和交互c.验证数据输入和输出四、自测注意事项1.确保测试环境与实际生产环境一致2.遵循测试规范和流程3.及时修复发现的问题4.持续优化测试方法正文:一、引言随着互联网技术的不断发展,Web程序已经成为各行各业的重要组成部分。
为了确保Web程序的稳定性和安全性,自测成为了开发过程中必不可少的一环。
本文将为您介绍几种Web程序自测方法,帮助您更好地进行项目测试。
二、Web程序自测方法概述在进行Web程序自测时,可以采用以下几种方法:1.浏览器的开发者工具浏览器的开发者工具提供了一个便捷的调试环境,可以帮助我们查看和修改页面源代码、调试JavaScript代码等。
以下是使用浏览器开发者工具进行自测的步骤:a.打开浏览器,访问需要测试的网页。
b.按下F12键或右键单击页面,选择“检查”打开开发者工具。
c.在开发者工具中,可以查看页面源代码、调试JavaScript代码、监听网络请求等。
2.网络爬虫工具网络爬虫工具可以模拟用户访问行为,自动抓取网页内容。
通过分析抓取到的数据,可以发现Web程序中的问题。
以下是使用网络爬虫工具进行自测的步骤:a.选择合适的爬虫工具,如Python的Scrapy、BeautifulSoup等。
b.编写爬虫脚本,定义抓取目标网址、解析内容等。
c.执行爬虫任务,分析抓取到的数据。
什么是自动化测试引言概述:随着软件开辟的快速发展,测试工作也变得越来越重要。
而自动化测试作为一种高效、可靠的测试方法,正在被越来越多的企业所采用。
本文将详细介绍什么是自动化测试以及其在软件开辟中的重要性。
一、自动化测试的定义和原理1.1 自动化测试的定义:自动化测试是指利用计算机程序和工具来执行测试任务,替代人工进行测试的过程。
它通过摹拟用户的操作,自动化执行测试用例,并生成测试报告和结果。
1.2 自动化测试的原理:自动化测试的原理是基于测试脚本的执行。
测试脚本是一种编写的测试代码,它可以摹拟用户的操作,执行各种测试用例。
通过编写和执行测试脚本,自动化测试可以快速、准确地执行大量的测试任务。
二、自动化测试的优势和应用场景2.1 自动化测试的优势:2.1.1 提高测试效率:自动化测试可以快速执行大量的测试用例,大大提高了测试效率。
2.1.2 提高测试覆盖率:自动化测试可以覆盖更多的测试场景,包括边界情况和异常情况,提高了测试的全面性。
2.1.3 降低测试成本:自动化测试可以减少人工测试的工作量,降低了测试的成本。
2.2 自动化测试的应用场景:2.2.1 回归测试:自动化测试可以快速执行回归测试,确保软件在修改后仍然具有预期的功能。
2.2.2 性能测试:自动化测试可以摹拟多个用户同时访问系统,测试系统的性能和稳定性。
2.2.3 接口测试:自动化测试可以通过摹拟接口请求和响应,测试接口的正确性和稳定性。
三、自动化测试的工具和技术3.1 自动化测试工具:3.1.1 Selenium:Selenium是一种常用的自动化测试工具,它可以摹拟用户在Web应用中的操作,执行各种测试任务。
3.1.2 Appium:Appium是一种用于挪移应用测试的自动化测试工具,它可以摹拟用户在挪移设备上的操作,执行各种测试任务。
3.1.3 JUnit:JUnit是一种用于Java应用测试的自动化测试工具,它可以执行单元测试和集成测试。
c语言中的断言断言(Assertion)是C语言中一种用于检查程序中假设的语句的正确性的方法。
通过使用断言,开发人员可以在程序中插入一些条件,以确保程序的执行满足特定的预期。
断言的作用是在程序运行时检查某个条件是否为真。
如果条件为真,则程序继续执行;如果条件为假,则断言将触发错误,并在运行时终止程序的执行。
断言通常用于检查程序中的约束条件、前提条件或不变条件是否满足,以避免潜在的错误。
在C语言中,断言通常使用assert宏来表示。
assert宏接受一个表达式作为参数,如果该表达式的值为0(假),则断言失败,程序终止执行,并将错误信息打印到标准错误流。
如果表达式的值为非零(真),则断言成功,程序继续执行。
断言的使用可以帮助开发人员在编写程序时进行自动化的测试和调试。
通过在关键位置插入断言,可以检查程序中的一些关键条件是否满足,以帮助开发人员找出潜在的错误和问题。
例如,可以使用断言来检查函数的输入参数是否有效,数组的索引是否越界,指针是否为空等。
断言的使用可以提高程序的健壮性和可靠性。
在开发过程中,使用断言可以帮助开发人员及时发现并修复程序中的错误。
在程序发布后,断言可以帮助用户发现并报告潜在的问题,以便开发人员进行修复。
通过使用断言,开发人员可以更早地发现和解决问题,从而提高程序的质量和可维护性。
然而,使用断言时需要注意一些问题。
首先,断言通常被认为是一种调试技术,不应该在生产环境中开启。
在生产环境中,断言的开销可能会影响程序的性能,而且断言失败时会终止程序的执行,可能导致严重的后果。
因此,在发布程序之前,应该关闭或移除所有的断言。
断言的设计应该尽量简单和明确。
断言的表达式应该是简单和直观的,便于阅读和理解。
如果断言的表达式过于复杂或难以理解,可能会导致开发人员对程序的行为和预期的理解产生误解。
断言的使用应该谨慎。
断言应该用于检查那些永远不应该发生的情况,而不是用于检查可能发生的情况。
如果断言的条件可能在正常情况下发生,那么就应该使用其他方法来处理这种情况,而不是依赖于断言。
常用的软件测试方法软件测试在软件开发过程中扮演着至关重要的角色,通常为了确保软件质量,开发团队会组织专门的测试组来确保软件质量,在测试过程中发现和纠正错误、提高软件质量。
通过测试,可以识别并修复潜在的问题,测试有助于确保软件在不同的情况下正常工作,从而提高软件的质量和可靠性,符合用户的预期和需求。
常用的测试方法包括:静态测试、黑盒测试、白盒测试、性能测试、安全测试、兼容性测试、用户界面测试、回归测试、接口测试、故障注入测试。
1.静态测试:通过人工检查和评估软件代码的过程。
团队成员对代码进行检查,以发现潜在的错误、不一致性和低效率的代码。
这可以通过代码走查会议、代码对比工具和代码静态分析工具来完成。
以下是静态测试的几种常见方法:a)代码走查会议:团队成员在会议中一起检查代码,通过讨论和分享经验来发现潜在的问题。
参与者可以提出问题、提供建议和意见,并确保代码符合规范和最佳实践。
b)代码对比工具:使用代码对比工具可以比较不同版本的代码或不同分支的代码,以检测代码的变更和差异。
这有助于发现潜在的错误和冲突,并确保代码的一致性和正确性。
c)代码静态分析工具:静态分析工具通过分析代码的结构、语法和语义来检测潜在的问题和错误。
这些工具可以自动化地扫描代码,并提供警告、建议或错误信息,帮助开发人员发现可能存在的问题。
静态测试的主要优势在于可以在早期阶段发现问题,并且相对于动态测试来说,成本更低。
它可以帮助团队成员共同审查代码,分享经验和知识,提高代码质量和可维护性。
然而,静态测试也有一些局限性。
它主要关注于代码本身,无法覆盖代码在运行时的实际行为。
因此,静态测试通常需要与其他测试方法(如动态测试)结合使用,以获得更全面的测试覆盖和保证软件质量。
2.黑盒测试:黑盒测试的测试方法:是由一些非编码人员根据《需求规格说明书》的要求对打包好的软件进行测试环境部署、模仿使用,以发现软件中的问题。
黑盒测试包括安装测试、功能测试、组装测试、压力测试、集成环境测试五种。
C语言中的软件测试与调试方法与工具C语言作为一种广泛使用的编程语言,对于软件测试与调试的需求十分重要。
本文将介绍C语言中常用的软件测试和调试方法以及相关工具,帮助读者更加有效地开发和调试C语言程序。
一、单元测试(Unit Testing)单元测试是针对程序中最小的可测试单元进行测试的一种方法。
在C语言中,最小的可测试单元是函数。
通过编写各种测试用例,对函数进行测试并验证其各个功能的正确性。
1.1 断言(Assertion)断言是单元测试中常用的一种方法,通过在程序中插入断言语句来检测特定条件是否为真。
如果断言条件为假,则表示该处存在问题,并会发出相应的警告或错误信息。
例如,以下代码段展示了如何使用断言来测试一个简单的C语言函数:```c#include <stdio.h>#include <assert.h>int sum(int a, int b) {assert(a >= 0 && b >= 0); // 断言a和b都大于等于0return a + b;int main() {int result = sum(3, -2);printf("Sum: %d\n", result);return 0;}```在上述代码中,我们使用assert宏来实现断言,判断a和b是否都大于等于0。
如果不满足条件,程序将会中止并输出相应的错误信息。
1.2 测试框架(Testing Framework)为了更加方便地进行单元测试,C语言中存在一些测试框架,可以帮助开发者进行自动化测试。
常用的C语言测试框架包括Check、Unity和Google Test等,它们提供了丰富的断言和测试组织能力。
以Check测试框架为例,以下是一个简单的示例:```c#include <check.h>START_TEST(test_sum_positive_numbers) {int result = sum(3, 2);ck_assert_int_eq(result, 5);START_TEST(test_sum_negative_numbers) {int result = sum(-3, -2);ck_assert_int_eq(result, -5);}Suite *sum_suite() {Suite *suite = suite_create("Sum");TCase *test_case = tcase_create("Core");tcase_add_test(test_case, test_sum_positive_numbers); tcase_add_test(test_case, test_sum_negative_numbers); suite_add_tcase(suite, test_case);return suite;}int main() {Suite *suite = sum_suite();SRunner *runner = srunner_create(suite);srunner_run_all(runner, CK_VERBOSE);int failed_count = srunner_ntests_failed(runner);srunner_free(runner);return (failed_count == 0) ? 0 : 1;}```上述代码使用了Check测试框架来进行单元测试。
C++ test一、C++test介绍C++Test是一个C/C++单元测试工具,自动测试任何C/C++类、函数或部件,而不需要您编写一个测试用例、测试驱动程序或桩调用。
C++Test能够自动测试代码构造(白盒测试)、测试代码的功能性(黑盒测试)和维护代码的完整性(回归测试)。
C++Test是一个易于使用的产品,能够适应任何开发生命周期。
通过将C++Test集成到开发过程中,您能够有效地防止软件错误,提高代码的稳定性,并自动化单元测试技术(这是极端编程过程的基础)。
功能描述:·静态测试C++Test内嵌了业界最出名的Effective C++(epcc)、More Effective C++(mepcc)、meyer-klaus(mk)以及Universal Code Standard(ucs)规范。
同时,它也集成了由parasoft 累积出来的一些规范。
静态测试中,C++Test会对代码进行详尽的扫描,验证代码中是否存在和这些规范相冲突的地方,尽快的发现一些简单或低级错误,避免由它们带来的集成扩散。
·动态测试(白盒测试)C++Test提供了一种有效并且高效的方法执行白盒测试。
C++Test完全自动执行所有的白盒测试过程,自动生成和执行精心设计的测试用例。
自动标记任何运行失败,并以一种简单的图示化结构显示。
然后自动保存这些测试用例,能够方便地用于以后的回归测试。
由于C++Test能够自动生成桩函数,或允许你加入自己的桩函数,因此它能够测试引用外部对象的类。
换句话说,C++Test能够运行任何一个或一组类,并自动生成和执行一组测试用例,它们被设计成能够发现尽可能多的错误。
C++Test允许你定制白盒测试用例的生成,和在什么层次上(项目、文件、类或方法)执行测试。
·动态测试(黑盒测试)C++Test通过自动化黑盒测试的大部分操作,减轻了这类测试的负担。
你可以简单地输入测试用例输入,然后让C++Test运行测试用例并自动确定实际的输出结果。
C语言安全测试方法与工具推荐引言在软件开发过程中,安全性是一个至关重要的问题。
特别是对于使用C语言编写的软件程序来说,安全性更是一个需要高度关注的方面。
C语言作为一种强大而广泛应用的编程语言,为开发者提供了更多的自由度和灵活性。
然而,正是由于其底层编程特性,也给了安全性带来了挑战。
为了确保软件程序的安全性,C语言的安全测试方法和工具成为了不可或缺的环节。
一、C语言安全测试方法为了保证C语言软件程序的安全性,以下是一些常用的安全测试方法:1. 静态代码分析静态代码分析是一种通过对源代码进行检查来发现软件中潜在安全漏洞的方法。
它可以帮助开发者发现代码中的错误、漏洞和缺陷,提高软件程序的安全性。
一些常用的静态代码分析工具包括Coverity、Fortify和Cppcheck等。
2. 动态测试动态测试是一种通过运行程序并监视其行为来发现安全漏洞的方法。
这包括输入验证、边界检查和错误处理等方面的测试。
常用的动态测试工具包括Valgrind、Fuzzit和AddressSanitizer等。
3. 代码复审代码复审是一种由其他开发者对源代码进行审查和评估的方法。
通过多人合作的方式,可以发现潜在的安全漏洞和代码质量问题。
常用的代码复审工具包括Gerrit和Phabricator等。
4. 安全编码指南安全编码指南是一组为开发者提供的规范和建议,以帮助他们编写更安全的代码。
这些指南包括避免使用危险函数、正确处理输入和异常等方面的要求。
一些常用的安全编码指南包括CERT C、OWASP和Secure Coding等。
二、C语言安全测试工具推荐除了上述的安全测试方法,下面是一些常用的C语言安全测试工具的推荐:1. CoverityCoverity是一款强大的静态代码分析工具,可以帮助开发者发现和修复源代码中的安全漏洞和缺陷。
它支持多种编程语言,包括C语言。
Coverity可以静态地分析源代码,发现潜在的缺陷,并提供修复建议。
软件测试⽅法——静态测试与动态测试从测试⽅法的⾓度可以分为⼿⼯测试和⾃动化测试。
1、静态测试所谓(static testing)就是不实际运⾏被测软件,⽽只是静态地检查程序代码、界⾯或⽂档中可能存在的错误的过程。
从概念中我们可以知道,其包括对代码测试、界⾯测试和⽂档测试三个⽅⾯:对于代码测试,主要测试代码是否符合相应的标准和规范。
对于界⾯测试,主要测试软件的实际界⾯与需求中的说明是否相符。
对于⽂档测试,主要测试⽤户⼿册和需求说明是否符合⽤户的实际需求。
其中后两者的测试容易⼀些,只要测试⼈员对⽤户需求很熟悉,并⽐较细⼼就很容易发现界⾯和⽂档中的缺陷。
⽽对程序代码的静态测试要复杂得多,需要我们按照相应的代码规范模板来逐⾏检查程序代码。
那么我们从哪⾥获得这个规范模板呢?其实没有⼀个统⼀的标准,每个公司内部⼀般都有⾃⼰的编码规范,⽐如《c/c++编码规范》,你只需要按照上⾯的条⽬逐条测试就可以了。
当然很⽩盒测试⼯具中就⾃动集成了各种语⾔的编码规范,⽐如公司的C++Test就集成了C/C++的编码规范,我们只要点击⼀个按钮,这些⼯具就会⾃动帮助我们检测代码中不符合语法规范的地⽅,⾮常⽅便。
下⾯我们举⼀个实际的例⼦。
C语⾔程序的静态分析和动态分析#include <sio.h>Max(float x, float y){float z;z=x>y?x:y;return(z);}Main(){float a, b;int c;scanf(“%f, %f”&a,&b);c=max(a,b);printf(“Max is %d\n”, c);}这段C语⾔编写的⼩程序,⽐较简单,实现的功能为:在主函数⾥输⼊两个单精度的数a和b,然后调⽤max⼦函数来求a和b中的⼤数,最后将⼤数输出。
我们现在就对代码进⾏静态分析,主要根据⼀些C语⾔的基础知识来检查。
我们把问题分为两种,⼀种必须修改的,另⼀种建议修改的。
wings是一款用于单元测试测试用例驱动框架自动生成工具,简单来说这款工具主要是全自动生成单元测试驱动代码与测试数据。
下面我们尝试使用wings来完成单元测试框架与测试数据的自动生成。
首先准备好需要测试的C语言工程,本文以大型开源软件Mysql为例。
第一步:打开wings工具,选择被测工程的主要目录。
第二步:点击工程操作中的分析生成,对工程目录下的.c文件进行解析,保存为XML 的格式,生成的文件保存在工程目录下的FunXml与GlobalXml中,分别是函数信息与全局变量的信息,点击驱动文件结构图,即可看到对应文件的函数结构信息。
上图可以查看所有.c文件的驱动函数,以及函数所对应的参数信息与全局变量的信息。
第三步:点击功能操作驱动生成,完成项目的驱动框架自动生成,驱动文件保存在wings_projects下的Driver文件夹下。
点击驱动文件,即可看到对应.c文件的驱动生成代码。
点击单个函数,可以高亮定位到函数所在位置,并且双击函数参数,可以定位到每个参数的赋值单元,查看每个参数的具体驱动赋值代码。
第四步:点击值功能操作的值生成按钮,则对应生成测试数据。
界面上显示为单个函数的测试数据,可依据需要修改测试次数,重新生成测试数据文件,也可依据需要修改特定的测试数据。
第五步:将驱动文件加载到所在工程目录,与源文件一起编译,即可运行。
如果想查看对应的函数信息与全局变量信息,则右键对应打开对应的Parameter Struture Description(函数信息结构体)与Global Parameter Struture Description(全局变量结构图)。
Parameter Struture Description(函数信息结构体):显示函数的名称,参数个数,参数类型以及复杂类型的展开形式。
Global Parameter Struture Description(全局变量结构图):显示全局变量的结构信息。
C语言自动化测试自动化测试框架和测试用例设计自动化测试在软件开发中起到了至关重要的作用。
C语言作为一种广泛应用于系统级编程的编程语言,也需要进行相应的自动化测试。
为了提高测试效率和测试质量,我们需要了解C语言自动化测试的框架和测试用例的设计方法。
一、C语言自动化测试框架C语言自动化测试框架是指一套用于自动化测试的工具集合,它提供了各种功能和接口,便于开发人员编写并执行测试用例。
下面介绍几个常用的C语言自动化测试框架。
1. UnityUnity是一款开源的C语言测试框架,它提供了丰富的断言和测试报告生成功能。
开发人员可以通过Unity编写测试用例,并使用它的断言函数进行断言,进而判断代码逻辑是否正确。
Unity还能够生成详细的测试报告,方便测试结果的分析和问题追踪。
2. CUnitCUnit是另一款常用的C语言测试框架,它提供了一系列的API,可以用于测试用例的编写和执行。
CUnit支持测试用例的组织和管理,能够自动化运行多个测试用例,并生成相应的测试报告。
3. CheckCheck是一个简单而灵活的C语言测试框架,它支持测试用例的并行执行,提供了丰富的断言和测试报告生成功能。
Check的灵活性使得开发人员能够根据项目的需求进行定制化开发,满足不同项目的自动化测试需求。
二、测试用例设计在进行C语言自动化测试时,一个关键的环节是测试用例的设计。
一个好的测试用例能够覆盖到代码的不同路径和边界条件,确保代码的健壮性和正确性。
下面介绍几个测试用例设计的基本原则。
1. 边界值测试边界值测试是一种重要的测试策略,它通过测试输入的边界条件来检查代码的反应。
在编写测试用例时,我们应该尽可能包括所有可能的边界值,并观察代码在这些边界值下的行为。
2. 非法输入测试在测试过程中,我们应该不仅仅考虑一般情况下的输入,还要考虑输入的非法情况。
这些非法输入可能是无效的指针、溢出的数组等,我们需要编写相应的测试用例来测试代码对于这些非法输入的处理。
C程序自动测试方法
【摘要】针对C语言的特点,提出了在Win XP/NT平台上对C源程序进行实时测试的原理、方法。
在程序控制流适当的地方插入一探针函数调用,实时收集程序运行时刻信息,研究的结果对程序员的测试有极大的帮助,为程序优化提供了大量有用的信息。
【关键词】自动测试;静态测试;算法
1问题的提出
随着装备自动化程度的不断提高,计算机的应用越来越普遍,为了提高软件开发的效率、可靠性,必须用一种系统的方法对开发的软件进行评估,度量其可靠性,并自动对软件进行测试,找出软件中存在的缺陷或错误。
C语言作为一种高级开发语言,具有通用性好,编程效率高,编程灵活,移植性好,因此C语言被选为各种装备软件开发的重要语言之一。
装备的可靠性、可用性对软件的可靠性要求越来越高,如何度量软件的可靠性、对软件进行自动测试的任务迫在眉睫。
正是为了提高软件的可靠性,对C语言编制的软件进行自动测试,以期找出软件中潜在的错误和缺陷,并协助程序员修改错误,提高软件的质量和开发效率。
对C语言编制程序进行控制流分析,并在源程序的适当地方插入一函数调用,使其在运行时刻收集程序的运行信息。
帮助程序员设计测试用例,显示程序的运行过程,判断程序的执行情况,协助其改正错误。
测试程序可作为软件测试的一种工具,将提高测试效率,保证软件的质量,把程序员从低级的、重复的劳动中解放出来,将主要精力放在软件的开发和设计上,成倍地提高生产率[3] [6]。
2自动测试目标和算法
2.1自动测试及其目标
基于被测试程序是否执行,可以把软件测试分为静态测试和动态测试。
静态测试只分析被测试程序,如包含哪些语句,哪些函数或模块,函数之间的调用关系,标识符的引用关系等。
而动态测试则收集程序运行时刻信息:如哪些路径被执行,每个路径执行的时间,每个变量在某一时刻的值,每个分支被执行时的条件等[4][5]。
动态测试的一般方法是,在被测试的程序里适当的地方插入信息收集函数(或称探针),再对源程序进行编译、运行,当程序运行到收集函数时,由收集函数往数据库中更新内容,然后由一个事后处理函数对数据库进行分析、统计、显示[2][9]。
需要完成以下目标:以WinXP/NT作为软件运行的平台,采用GUI(Graphics User Interface),针对VC6.0+的程序进行测试,分析出控制流图,并在屏幕上画出控制流图,实时跟踪控制流图中哪些弧被经历过,经历的次数是多少,每次经历的时间是多少;显示每个节点对应的源代码;当前运行的代码加亮显示;源代码中的关键字、注释醒目地显示等[1]。
2.2动态测试的算法
编程语言采用Delphi,数据库选单机版的Paradox。
算法思路
自动对VC6.0+的.DSW(Develop Studio Workshop)文件进行分析,从.DSW文件中分析出它所包含的工程文件.DSP(Develop Studio Project),一个.DSW文件中可能包含多个.DSP文件。
然后逐个对.DSP文件进行分析,找出每个工程文件中包含的.C、.CPP文件,再对.C、.CPP文件逐一进行分析。
在对.C、.CPP文件进行分析时,首先找出每个文件中所包含的函数,然后对每个函数进行分析。
在分析过程中,边分析,边记录,同时在函数的适当地方插入探针[7][8]。
(1)dsw、.dsp文件分析
.dsw、.dsp文件为文本格式,用任何编辑器打开均可阅读其内容,稍加浏览即可明白其格式,不在此赘述。
1).dsw文件分析
a.从.dsw文件中分析出.dsp文件名
b.分析.dsp文件
c.重复1)直到所有的.dsp文件分析完毕
2).dsp文件分析
a.从.dsp文件中分析出.C或.CPP文件名
b.分析该文件
c.重复1)直到所有的.C或.CPP文件分析完毕
(2)C或.CPP文件分析
1)将源文件切分为一系列的Token串,存入一表中
2)从Token表中过滤掉注释部分,如/*…*/、//…
3)从Token表中过滤掉”…”部分,并考虑串中可能存在转义字符“\””。
4)从Token表中搜索并计算下列关键字所处的行、列,并存入另一表List 中:break、case、continue、default、do、else、for、goto、if、return、switch、while、{、}
5)从List表中搜索并处理goto关键字,并把goto的目的地址(行、列等信息)仍存入List表中,相关信息存入goto预处理表中
6)将List表按行、列的升序排序
7)对List分析得到控制流信息,在分析时,在源程序的适当地方插入探针。
(3)源文件Token化
利用了从Internet上收集到的一个控件TTokenList,设置好该控件的属性:1)与源程序对应的流式文件TFileStream的一个实例;2)分隔符属性,其设置方式是将布尔数组下标0~255对应的单元初始化,每个单元和一个ASCII码对应,若某个ASCII码为分隔符,则以该ASCII码的序号为下标,该下标对应的单元设置为true
1)指针指向Token表头
2)判断是否为/符号,若是转3),否则指针+1,重复2)直到Token尾部结束。
3)判断是否为*,否转5)
4)对/*…*/进行处理,处理完后转2)
5)判断是否为/,若是转6),否则转2)
6)处理//…直到换行符,处理完后转2)
(5)滤掉”…”部分
为了不影响对关键字的判断处理,还必须过滤掉”…”部分
1)指针指向Token表头
2)是”符号吗?是转3),否则指针+1,重复2)直到Token 尾部结束。
3)若是\字符,判断下一字符是否为”,若是则虑掉这两个字符,否则下一字符为”时结束过滤,转2)继续
(6)搜索关键字
因关键字有多个,若把每个Token和所有的关键字进行比较,将十分费时,因此,笔者考虑了一种较为有效的方法。
一般编程语言中均提供了在某字符串中搜索字串的函数,若能成功匹配,返回其位置,否则返回-1或其它的值。
但存在一种情况:Token中的串是关键字的子串,该如何处理这种情况?笔者的解决办法是:把每个关键字按升序排序,把所有的关键字串结成一个串,每个关键字之间插入分隔符,分隔符是关键字中所包含的字符以外的其它任意字符。
为了简化处理,在串的头部和尾部也加上分隔符。
因此,若某个Token为该串的子串,根据返回值,判断子串的头部和尾部是否同时为分隔符,若是则是一个关键字,否则仅为一般标识符。
这种方法避免了采用关键字树等复杂的数据结构和算法,编程较为简单。
笔者查看了Delphi中Pos函数的源代码,它采用了汇编代码,所以其运行效率十分高[3]。