CPPNIUT使用过程常见问题FAQ

来源:互联网 发布:神雕群芳谱txt下载知轩 编辑:程序博客网 时间:2024/06/08 11:16

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;

}


原创粉丝点击