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