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