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;
}