# V1107. Function was declared as accepting unspecified number of parameters. Consider explicitly specifying the function parameters list.

Анализатор обнаружил декларацию функции с неуточнённым количеством параметров и её вызов с ненулевым количеством аргументов. Такой вызов может свидетельствовать об ошибке в коде. Возможно, планировалось вызвать другую функцию с похожим именем.

В языке С существует возможность объявить функцию с неуточнённым количеством параметров:

    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.