zoukankan      html  css  js  c++  java
  • 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%。
     
     
  • 相关阅读:
    张礼鑫(帮别人名字作诗)
    千年的守望
    感恩
    转载:像成功人士一样释放压力,快乐并高效着
    50个MBA精粹 [推荐]
    赚钱不是人生的全部
    世界上最权威的68句创业名言,哪一句让你获益匪浅
    郝雪涛只爱薛乙静(帮恋人名字作诗)
    心爱的,你为何还不来为我们的爱情赴约
    中国,请还我一个诗的天堂
  • 原文地址:https://www.cnblogs.com/kwang-cai/p/5613213.html
Copyright © 2011-2022 走看看