Почему va_arg (va_list, type) выдает предупреждение C6285? - PullRequest
1 голос
/ 18 июня 2020

Все работает, как задумано, и я получаю нужные мне значения из va_arg (va_list, type), но получаю это предупреждение везде, где я вызываю va_arg:

Warning C6285 (<non-zero constant> || <non-zero constant>) is always a non-zero constant. Did you intend to use the bitwise-and operator?

Пример code:

void Logger::log(LogLevel level, const char* location, uint32_t line, const char* format, ...)
{
    va_list arg_ptr;
    va_start(arg_ptr, format);

    while (*format) {
        // ...
        if (*format == 'd') { // 
            int i = va_arg(arg_ptr, int); // <-- Warning is reported here
            // ...
        }
        // ...
        ++format;
    }
    // ...
    va_end(arg_ptr);
}

Почему появляется это предупреждение и как от него избавиться?

Я использую Visual Studio Community 2019 с Visual C ++ 2019

1 Ответ

2 голосов
/ 18 июня 2020

C6### коды ошибок - это коды IntelliSense. Они основаны на эвристике и предназначены для привлечения внимания к потенциальным ошибкам, но также могут приводить к ложным срабатываниям, что, кажется, имеет место здесь; он, вероятно, запускается в реализации va_arg в CRT:

#define __crt_va_arg(ap, t)                                               \
    ((sizeof(t) > sizeof(__int64) || (sizeof(t) & (sizeof(t) - 1)) != 0) \  // <== Here
        ? **(t**)((ap += sizeof(__int64)) - sizeof(__int64))             \
        :  *(t* )((ap += sizeof(__int64)) - sizeof(__int64)))

Я бы просто проигнорировал это ...

Если это вас беспокоит, сообщите об этом поставщику: Справка Отправить отзыв Сообщить о проблеме ...

...