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;
}
- CPPNIUT使用过程常见问题FAQ
- 【FAQ】RPM软件包使用常见问题
- Gforge5 使用过程中的FAQ
- Loadrunner 使用过程常见问题
- RPM软件包使用常见问题 ----------- { rpm 使用 答疑 FAQ (Linux) }
- 关于BACnet协议栈使用的常见问题回答FAQ
- 阿里云幸运券领取,使用教程及常见问题FAQ
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何使用断点
- C#.NET常见问题(FAQ)-delegate委托链如何使用
- C#.NET常见问题(FAQ)-如何使用变量访问控件属性
- C#.NET常见问题(FAQ)-如何使用变量动态添加控件
- C#.NET常见问题(FAQ)-如何使用右下角托盘图标notifyIcon
- minij2ee常见问题(FAQ)
- Solaris常见问题解答 (FAQ)
- linux常见问题FAQ
- MP3常见问题FAQ
- JBuilderX 常见问题FAQ
- DWF常见问题faq
- cocos2d学习记录(六)-切片动画
- poj 2349 Arctic Network
- poj 3376 Finding Palindromes
- s:if中% #
- C++类别转换之char*与string的互转换
- CPPNIUT使用过程常见问题FAQ
- delete与delete [] 真正区别
- android学习-DDMS使用
- hdu 1999-不可摸数
- 乱谈SQL Server数据库视图
- 人件--读书笔记2
- 01.struts2_msb
- 进行链表的排序的一种方法,
- golang信号量处理