CPPNIUT使用过程常见问题FAQ
2012-08-05 09:55
519 查看
CPPNIUT使用过程常见问题FAQ
Z00165390 20101225
1. 如何对函数中一次或者多次malloc函数调用进行处理
Test.c
Void foo(void)
{
A = malloc(100);
If(NULL == A)
{
Return ;
}
.. .. ....
B =malloc(100);
If(NULL == B)
{
Return ;
}
}
常规的对 malloc打桩后,走到第一个malloc就会返回,无法覆盖第二个malloc函数。
处理方法:重构malloc函数进行封装
定义函数void *MALLOC_ARRAY(int32 length)
{
uint8*array = NULL;
if(NULL == (array = (uint8 *)malloc( sizeof(uint8) * length )) )
{
fprintf(stdout,"Memory Exhausted\n");
returnNULL;
}
memset(array, 0, length*sizeof(uint8));
return(void*)array;
}
然后源码调整为:
Void foo(void)
{
A = MALLOC_ARRAY (100);
.. .. .. ..
B =MALLOC_ARRAY (100);
}
然后再单独对这个新定义的函数void *MALLOC_ARRAY(int32 length)做一次打桩处理做UT即可覆盖Void foo(void)函数中所有的 malloc分支。
2. 对静态函数的打桩
static静态函数范围的为本文件,显然在另外一个页面中定义的ut函数是无法访问源码中定义的static函数。
处理方法:将static函数做一次封装
Static int foo(char argc, char* argv[])
{
Return0;
}
在源文件中对该函数进行封装,保持参数与原函数一致
int ut_foo(char argc, char* argv[])
{
Returnfoo(argc, argv);
}
然后只要对外部可访问的函数ut_foo做ut即可。
3、exit的处理方法
函数中使用了exit
int foo(char argc, char* argv[])
{
… …
If(NULL== a)
{
Exit;
}
Return0;
}
目前UT工具不支持直接对exit函数进行打桩,因此可以使用宏替换的方式处理。
首先在源码中定义一个函数
Void ExitError(char* filename,uint32 linenum)
{
Printf(“[error\]%s:%d\n”, filename, linenum);
Exit;
}
然后将foo()函数中所有的exit使用
ExitError((char*)__FILE__, __LINE__); Return;替换,上述foo()函数修改为
int foo(char argc, char* argv[])
{
… …
If(NULL== a)
{
ExitError((char*)__FILE__, __LINE__);
Return -1;
}
Return0;
}
然后只要对函数ExitError进行打桩即可避免目前库函数不能直接对exit进行打桩的限制。另外,对于这个新定义的ExitError函数中的exit函数做UT可以通过在源码中宏替换的方式进行处理。
int utExitError (void)
{
#defineExit return
ExitError((char*)__FILE__,__LINE__);
#undef Exit// 取消宏定义,避免对其它函数处理的影响
Return0;
}
Z00165390 20101225
1. 如何对函数中一次或者多次malloc函数调用进行处理
Test.c
Void foo(void)
{
A = malloc(100);
If(NULL == A)
{
Return ;
}
.. .. ....
B =malloc(100);
If(NULL == B)
{
Return ;
}
}
常规的对 malloc打桩后,走到第一个malloc就会返回,无法覆盖第二个malloc函数。
处理方法:重构malloc函数进行封装
定义函数void *MALLOC_ARRAY(int32 length)
{
uint8*array = NULL;
if(NULL == (array = (uint8 *)malloc( sizeof(uint8) * length )) )
{
fprintf(stdout,"Memory Exhausted\n");
returnNULL;
}
memset(array, 0, length*sizeof(uint8));
return(void*)array;
}
然后源码调整为:
Void foo(void)
{
A = MALLOC_ARRAY (100);
.. .. .. ..
B =MALLOC_ARRAY (100);
}
然后再单独对这个新定义的函数void *MALLOC_ARRAY(int32 length)做一次打桩处理做UT即可覆盖Void foo(void)函数中所有的 malloc分支。
2. 对静态函数的打桩
static静态函数范围的为本文件,显然在另外一个页面中定义的ut函数是无法访问源码中定义的static函数。
处理方法:将static函数做一次封装
Static int foo(char argc, char* argv[])
{
Return0;
}
在源文件中对该函数进行封装,保持参数与原函数一致
int ut_foo(char argc, char* argv[])
{
Returnfoo(argc, argv);
}
然后只要对外部可访问的函数ut_foo做ut即可。
3、exit的处理方法
函数中使用了exit
int foo(char argc, char* argv[])
{
… …
If(NULL== a)
{
Exit;
}
Return0;
}
目前UT工具不支持直接对exit函数进行打桩,因此可以使用宏替换的方式处理。
首先在源码中定义一个函数
Void ExitError(char* filename,uint32 linenum)
{
Printf(“[error\]%s:%d\n”, filename, linenum);
Exit;
}
然后将foo()函数中所有的exit使用
ExitError((char*)__FILE__, __LINE__); Return;替换,上述foo()函数修改为
int foo(char argc, char* argv[])
{
… …
If(NULL== a)
{
ExitError((char*)__FILE__, __LINE__);
Return -1;
}
Return0;
}
然后只要对函数ExitError进行打桩即可避免目前库函数不能直接对exit进行打桩的限制。另外,对于这个新定义的ExitError函数中的exit函数做UT可以通过在源码中宏替换的方式进行处理。
int utExitError (void)
{
#defineExit return
ExitError((char*)__FILE__,__LINE__);
#undef Exit// 取消宏定义,避免对其它函数处理的影响
Return0;
}
相关文章推荐
- 使用Python+Selenium过程中中常见的问题汇总
- 【转】CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题
- Linux使用过程中常见问题及其解决方法
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何声明定时器,使用定时器TON模块 TC3
- Vue2.0总结———vue使用过程常见的一些问题
- 在使用android studio过程中,使用gradle编译的时候总会出现一些问题,下面是几个常见问题的解决方法。
- Unity3d使用过程中常见的20个问题
- Unity3D使用过程中常见的20个问题
- Purus系统常见使用问题及解决方式FAQ 1
- 使用ProcessOnh绘制流程图的过程中一些常见的问题
- FAQ:关于 DB2 数据服务器使用的常见问题
- Android studio在使用过程中常见的问题及解决方法(不定期更新),androidstudi
- Ajax技术(5)--Ajax使用过程中常见问题汇总
- 【FAQ】RPM软件包使用常见问题
- Vue2.0总结———vue使用过程常见的一些问题
- C#.NET常见问题(FAQ)-使用SharpDevelop开发 如何切换设计视图和代码视图
- 《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题
- idea使用过程中的一些常见问题,做个笔记
- 使用Tomcat过程常见的问题
- [项目过程中所遇到的各种问题记录]编辑器篇——FCKeditor相关知识及各种常见使用问题