如何在宏中排除lcov分支

时间:2014-01-03 15:08:05

标签: c++ code-coverage gcov lcov

我的代码中有一些日志宏:

#define LOG_MSG (pri, msg, ... ) \
    if (pri > PriorityLevel ) \
        printf( msg, ##\__VA_ARGS__);

我知道我可以使用LCOV_EXCL_START,LCOV_EXCL_STOP或LCOV_EXCL_LINE来抑制分支。但是只有在我调用LOG_MSG的每个地方添加它时才有效:

LOG_MSG(ERROR, "An Error has occurred\n");//LCOV_EXCL_LINE

我想在宏中包含该注释,但如果我把它放在那里,LCOV就不会识别它。例如,此代码仍然生成分支。

#define LOG_MSG (pri, msg, ... ) \
    if (pri > PriorityLevel ) \
        printf( msg, ##\__VA_ARGS__);//LCOV_EXCL_LINE

有没有一种很好的方法来抑制宏本身的这些分支?

5 个答案:

答案 0 :(得分:2)

新的lcov版本1.11(或1.12)引入了LCOV_EXCL_BR_LINE关键字。所以在你的情况下:

LOG_MSG(ERROR, "An Error has occurred\n"); //LCOV_EXCL_BR_LINE

或者,甚至更好:

LOG_MSG(ERROR, "An Error has occurred\n"); (void)("LCOV_EXCL_BR_LINE");

在预编译器评论剥离后幸免于难。

答案 1 :(得分:1)

为什么不将宏转为功能?

像:

template <typename ... Ts>
void LOG_MSG(int priority, const std::string& message, Ts&&...ts)
{
    if (priority > PriorityLevel)
        printf(message.c_str(), std::forward<Ts>(ts)...);
    // Or more appropriate stuff
}

答案 2 :(得分:0)

我无法弄清楚如何将代码添加到答案中,但这是对@ Jarod42解决方案的回应。我没有使用C ++ 0x所以我稍微修改了他的解决方案:

void LogMsgFunc( U32 pri, const char* msg, ... )
{
    //LCOV_EXCL_START
    va_list variableArgumentList;
    va_start( variableArgumentList, msg );
    if ( pri <= PriorityLevel ) 
    { 
        vfprintf( stderr, msg, variableArgumentList );
    }    
    va_end( variableArgumentList );
    //LCOV_EXCL_STOP
}

#define LOG_MSG (pri, msg, ... ) \
    LogMsgFunc(pri, msg, ##__VA_ARGS__);

答案 3 :(得分:0)

怎么样

#define LOG_MSG__LCOV_EXCL_BR_LINE LOG_MSG

然后替换您不希望使用新宏LOG_MSG进行覆盖测试的所有LOG_MSG__LCOV_EXCL_BR_LINE来电。那会有用吗?

答案 4 :(得分:0)

https://github.com/linux-test-project/lcov/issues/44#issuecomment-427449082

中提到的解决方案如何?

更改lcovrc添加:

lcov_excl_br_line = LCOV_EXCL_BR_LINE|LOG_MSG