Domanda

I've got some logging macros in my code along the lines of:

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

I know I can use LCOV_EXCL_START, LCOV_EXCL_STOP or LCOV_EXCL_LINE to suppress a branch. But that only works if I add it every place I call LOG_MSG:

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

I'd like to include that comment in the macro, but LCOV doesn't recognize it if I put it there. For example, this code still produces branches.

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

Is there a good way to suppress these branches in the macro itself?

È stato utile?

Soluzione

Why not turn the macro into function ?

like:

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
}

Altri suggerimenti

I can't figure out how to tack code onto an answer, but this is a response to the solution from @Jarod42. I'm not using C++0x so I modified his solution a bit:

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__);

the new lcov version 1.11 (or 1.12) introduce LCOV_EXCL_BR_LINE keyword. So in your case:

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

or, even better:

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

which survives precompiler comment stripping.

How about

#define LOG_MSG__LCOV_EXCL_BR_LINE LOG_MSG

and then replace any LOG_MSG calls that you don't want coverage-tested with the new macro LOG_MSG__LCOV_EXCL_BR_LINE. Would that work?

How about the solution which mentioned in: https://github.com/linux-test-project/lcov/issues/44#issuecomment-427449082

Change the lcovrc add:

lcov_excl_br_line = LCOV_EXCL_BR_LINE|LOG_MSG
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top