.......
关于可变参数函数的相关概念和语法参见附件中的文章。C++test对可变参数函数的打桩方法,下面以printf函数为例进行分享:
printf函数定义为:
int printf (const char *__format, ...)
{
register int __retval;
__builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
__retval = __mingw_vprintf( __format, __local_argv );
__builtin_va_end( __local_argv );
return __retval;
}
这是个典型的含有可变参数的函数,如果有如下代码:
char d[10] = "hello";
printf("+++++++++++++%d\n", ret, d);
if (d[0] == 't')
;
else
;
想要通过对printf函数进行打桩,来修改d[0]的值,使if条件成立,来增加覆盖率,可以对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, ...)
{
va_list ap;
va_start(ap, _MT_var2);
int s = va_arg(ap, int);
char *p= va_arg(ap, char *);
*p='t';
return 0;
}
这样即可实现在桩函数中对的d[0]进行修改,而不需要修改源代码。根据实际情境,适当利用可变参数函数打桩可用来提高覆盖率。以上谨供参考。