C++test对多变参数的函数打桩处理技巧

Posted 如是耳闻 -- 睡觉倍爽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++test对多变参数的函数打桩处理技巧相关的知识,希望对你有一定的参考价值。

 
代码样例
 
在如下的fun函数中存在printf语句,如果下面的代码片段想要达到100%的覆盖率,则需要考虑打桩printf函数,并且在桩中修改参数d所指向的值。
 
int fun(int a, int b)
{
char d[10] = "hello";
//char d[10];
printf("+++++++++++++%d%s\n", a, d);
if (d[0] == ‘t‘)
;
else
;

//puts(d);
return 1;
}
 
 
解决方法
 
     对于多变参数的打桩处理,需要考虑使用特别的方法,及stdarg.h头文件中定义的va_list,关于这部分介绍,可参见wiki: https://en.wikipedia.org/wiki/Variadic_function 。
     基于上面wiki的知识,我们则可以利用C++test在对应的printf用户桩中进行相关代码处理,代码片段如下所示:
 
EXTERN_C_LINKAGE int __attribute__((__cdecl__)) printf (const char * _MT_var4, ...) ;
EXTERN_C_LINKAGE int __attribute__((__cdecl__)) CppTest_Stub_printf (const char * _MT_var2, ...)
{
//static char c[]="ttt";

int arg2 = 0;
char * arg3=NULL;
         va_list ap;//设定参数列表容器
         puts("stub now");  
     
     va_start(ap, _MT_var2); //开始获取参数列表
 
arg2 = va_arg(ap,int);  //递进获取对应参数,需要注意: 第二个参数要指定对应准确的实际方法调用类型
      arg3 = va_arg(ap,char*); //递进获取参数,注意fun函数中的第三个参数是数组即指针类型
      puts(arg3);  
     if(CppTest_IsCurrentTestCase("TestSuite_PrinftTest_c_9d31e552_test_case_fun_1"))  //设定对应测试用例来修改d数组的值
          arg3[0] = ‘t‘;
 
      puts("printf arg3 again: ");
      puts(arg3);
va_end(ap);
}
 
 
最后可以看到,如上打桩后,fun函数可以成功实现覆盖率100%。
技术分享
 
 

以上是关于C++test对多变参数的函数打桩处理技巧的主要内容,如果未能解决你的问题,请参考以下文章

深入理解计算机系统CSAPP Ch7:静动态库制作与神奇的库打桩机制

C语言奇淫技巧之函数的可变参数

gostub源码分析

在C语言固件中使用功能的五个技巧

记录一种在C语言中的打桩实现及原理

记录一种在C语言中的打桩实现及原理