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%。

时间: 2024-08-03 19:20:43

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

带有“非简单参数”的函数为什么不能包含 "use strict" 指令

非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值.2.剩余参数.3.参数解构.本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict" 指令: function f(foo = "bar") { "use strict" // SyntaxError: Illegal 'use strict' directive in function with non-simple parameter li

sdut 面向对象程序设计上机练习三(有默认参数的函数)

面向对象程序设计上机练习三(有默认参数的函数) Time Limit: 1000MS Memory limit: 65536K 题目描述 利用默认参数的函数实现求2个或3个整数的最大值. 输入 输入3个int型整数. 输出 输出第1.2个整数及其最大值: 输出第1.2.3个整数及其最大值. 示例输入 88 66 99 示例输出 88 66 88 88 66 99 99 既然题目要求是调用默认的函数,就不用自己去定义了: 机智灵活的运用默认函数.. #include <iostream> usi

函数参数、函数嵌套、作用域、名称空间

一.函数参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解. Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码. 1.位置参数 我们先写一个计算x2的函数: def power(x): return x *

Objective-C可变参数的函数实现

1.前言 相信接触过OC的对NSLog都很熟悉,细心查看NSLog的原始定义,会发现,他的原型如下: FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 路径在:OS X version/Frameworks/Foundation/NSObjCRuntime.h 注意到参数最后的...,这里是可变参数.这样,在调用时就可以根据需要传入相应个数的参数了. PS:其实在C#中也有params指定可变

C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数

在定义可变参数的函数之前,先来理解一下函数参数的传递原理: 1.函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈. 2.参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在执行函数的时候,从最后一个(最右边)参数开始入栈.因此栈底高地址,栈顶低地址,举个例子说明一下: void test(int a, float b, char c); 那么,在调用test函数的时候,实参char c先进栈,然后是float b,最后才是int a,因此在内存中变量的存放次序是c->

JavaScript进阶系列01,函数的声明,函数参数,函数闭包

本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调用我"); } 通过这种方式声明的函数属于Window对象,可以在任何地方调用,即在doSth方法的之前和之后都可以调用. 可以在doSth方法之前调用: doSth(); function doSth() { alert("可以在任何时候调用我"); } 可以在doSth方法之

C++函数:默认参数的函数

1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops); //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return; for(int i=0;i<loops,i++); } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但有时需要用相同的实参反复调用delay()函数.C++可以给参数定义默认值.如果将delay(

Golang中interface{}作为函数参数和函数返回值的使用

package main import (     "errors"     "fmt" ) type item struct {     Name string } func (i item) String() string {     return fmt.Sprintf("item name: %v", i.Name) } type person struct {     Name string     Sex  string } func

c++有默认参数的函数---4

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops): //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return: for(int i=0;i<loops,i++): } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但