Анализатор обнаружил декларацию функции с неуточнённым количеством параметров и её вызов с ненулевым количеством аргументов. Такой вызов может свидетельствовать об ошибке в коде. Возможно, планировалось вызвать другую функцию с похожим именем.
В языке С существует возможность объявить функцию с неуточнённым количеством параметров:
void foo();
Может показаться, что такая декларация объявляет функцию, не принимающую параметров, как в C++. Однако это не так, и следующий код успешно скомпилируется:
void foo();
void bar()
{
foo("%d %d %d", 1, 2, 3); // No compiler checks
}
При декларации функции 'foo' программист мог подразумевать одно из следующих поведений.
Вариант N1. Функция 'foo' не должна была принимать параметров, и компилятор должен был выдать ошибку. В таком случае до C23 в декларации функции следует явно указать 'void' в списке параметров:
void foo(void);
void bar()
{
foo("%d %d %d", 1, 2, 3); // Compile-time error
}
Вариант N2. Функция 'foo' является вариативной и может принимать переменное количество параметров. В таком случае следует явно во время декларации указать эллипсис ('...').
void foo1(const char *, ...); // since C89
void foo2(...); // since C23
void bar()
{
foo1("%d %d %d", 1, 2, 3); // ok since C89
foo2("%d %d %d", 1, 2, 3); // ok since C23
}
Примечание. Начиная с C23, компиляторы обязаны рассматривать следующие декларации как декларации функций, не принимающих параметров:
void foo(); // Takes no parameters
void bar(void); // Takes no parameters
Анализатор знает об этом поведении и не выдаёт срабатывания для таких деклараций, начиная с C23.