Как исключить ветви 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

Есть ли хороший способ подавить эти ветви в самом макросе?

4 ответа

Решение

Почему бы не превратить макрос в функцию?

лайк:

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
}

Новая версия 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");

который выживает перед зачисткой комментария прекомпилятора.

Я не могу понять, как прикрепить код к ответу, но это ответ на решение @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__);

Как насчет

#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, Будет ли это работать?

Как насчет решения, упомянутого в: https://github.com/linux-test-project/lcov/issues/44#issuecomment-427449082

Измените lcovrc add:

lcov_excl_br_line = LCOV_EXCL_BR_LINE|LOG_MSG
Другие вопросы по тегам