完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
2个回答
|
|
程序插装(ProgramInstrumentation)概念最先是由J.G.Huang教授提出,是借助往被测程序中插入操作(称为“探针”),以便获取程序的控制流和数据流信息,从而实现测试目的的方法。在软件动态测试中,程序插装是一种基本的测试手段,应用广泛,是覆盖率测试、软件故障注入和动态性能分析的基础技术。
GCC(GNUComPIlerCollection)是一个高度优化,高度可移植,广泛使用的编译系统。它能处理多种语言,包括C/C++、Fortran、Java和Pascal等多种语言前端,而且后端支持几乎所有的处理器结构。GCC作为源码开放的软件,人们可以自由修改和使用;加入插装模块后,在GCC所支持的语言中都可插入相应的测试代码(这里只介绍C语言的插装模块)。本文将详细叙述如何修改GCC,使其在编译每个C函数时,分别将各个形式参数连同该函数名传递给一个指定函数。该指定函数的返回值赋予原来的形式参数,从而可以人为控制***装函数的每个参数实际值,进而完成各种规则下的测试。 |
|
|
|
GCC编译流程分析
编译器的工作是将源代码(通常使用高级语言编写)翻译成目标代码(通常是低级的目标代码或者机器语言)。在现代编译器的实现中,这个工作一般是分为两个阶段来实现的: 第一阶段,编译器的前端接收输入的源代码,经过词法、语法和语义分析等得到源程序的某种中间表示方式。 第二阶段,编译器的后端将前端处理生成的中间表示方式进行一些优化,并最终生成在目标机器上可运行的代码。 GCC编译器以一个函数为单位对经过预处理的输入源文件进行编译处理。根据GNU Bison(一个类似YACC但功能更强大的文法分析工具)生成的语法分析程序,前端完成语法、语义分析,建立语法树,并转换成中间代码。GCC内部使用了一种能对实际的体系结构做一种抽象的,与硬件平台无关的语言,这个中间语言就是RTL(Register Ttansfer Language)。通过修改源程序的RTL,可以改变、删除源程序,包括插入所需要的代码,由GCC后端处理并最终输出对应硬件平台的汇编码,源程序无需手工修改便可实现插装功能。 GCC的入口点main函数在文件main.c中。此函数非常简单,只有一条直接调用toplev_main函数的语句。toplev_main函数是在toplev.c文件中定义的,以下我们只关心与编译有关的源码,其他的暂时忽略。toplev_main中最重要的是调用了do_complile函数,这个函数从名字看就是做编译工作的;而在此之后,toplev_main函数就返回了。dD_compile函数也是在tokv.c中定义的,其中真正进行编译工作的是调用compilte_file函数。compik_file函数最终调用了一个钩子函数来分析(parse)整个输入文件: (*lang_hooks.parse_file)(set_yydebug); 这里的lang_hooks是一个全局变量,不同语言的前端对此赋以不同的值。对C语言来说,这条语句相当于调用了c-opts.c中的c_common_parse_file函数。c_com-mon_parse_file中调用了c-parse.c中的c_parse_file函数;在此函数中又调用了同文件中的yyparse函数,该函数负责解析C语言源文件,并转化为特殊的语法树结构。该函数是GNU bison将YACC转变为C语言而自动生成的,所以这段代码阅读起来比较困难,但我们并不关心语法分析的细节。在完成函数体的分析后,利用已经建立的tree结构生成RTL,优化后最终输出汇编码;自此C函数的编译就算结束了,这些是由yyparse调用finish_function函数完成的。finish_function函数中最重要的函数是tree_rest_of_compilation(定义在tree_optimize.c中),它是真正实现上述功能的函数。为了说明它所做的具体事情,我们将该函数做了删减,保留了关键的地方。 将函数各个部分展开成RTL形式后,调用函数rest_of_comPIlation将RTL输出为汇编码。至此,得到了一张清晰的GCC编译时的函数调用路线,如表1所列。 |
|
|
|
只有小组成员才能发言,加入小组>>
1905个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36357 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4393 浏览 0 评论
6045 浏览 1 评论
6762 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4210 浏览 0 评论
619浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
613浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
603浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
693浏览 2评论
792浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 04:43 , Processed in 0.985815 second(s), Total 80, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号