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


     
    代码样例
     
    在如下的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;
    }
     
     
    解决方法
     
         对于多变参数的打桩处理,需要考虑使用特别的方法,及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%。
     
     
  • 相关阅读:
    埋点
    go 搭建web服务
    go的常见操作
    Zeus资源调度系统介绍
    支付系统中热点账户的性能问题
    redis
    集成Spring-Boot与gRPC,grpc-spring-boot-starter
    Spring Cloud灰度发布之Nepxion Discovery
    Spring Cloud Stream
    通过消息总线Spring Cloud Bus实现配置文件刷新(使用Kafka或RocketMQ)
  • 原文地址:https://www.cnblogs.com/kwang-cai/p/5613213.html
Copyright © 2020-2023  润新知