Недопустимый va_list аргумент

Список аргументов переменной, используемый после аннулирования с va_end или не инициализированный с va_start или va_copy

Описание

Недопустимый va_list аргумент происходит, когда вы используете переменную va_list в качестве аргумента к функции в группе vprintf, но:

  • Вы не инициализируете переменную ранее с помощью va_start или va_copy.

  • Вы делаете недействительным переменную ранее с помощью va_end и не повторно инициализируете его.

Например, вы вызываете функциональный vsprintf как vsprintf (buffer,format, args). Однако перед вызовом функции, вы не инициализируете переменную va_list args с помощью любого из следующего:

  • va_start(args, paramName). paramName является последним параметром, передаваемым по имени функции аргумента переменной. Например, для функционального определения void func(int n, char c, ...) {}, c является последним параметром, передаваемым по имени.

  • va_copy(args, anotherList). anotherList является другой допустимой переменной va_list.

Риск

Поведение неинициализированного аргумента va_list не определено. Вызывание функции с неинициализированным аргументом va_list может вызвать переполнения стека.

Фиксация

Перед использованием переменной va_list как аргумент функции инициализируйте его с va_start или va_copy.

Очистите переменную с помощью va_end только после всего использования переменной.

Примеры

развернуть все

#include <stdarg.h>
#include <stdio.h>

int call_vfprintf(int line, const char *format, ...) {
    va_list ap;
    int r=0;
    
    va_start(ap, format);
    r = vfprintf(stderr, format, ap);
    va_end(ap);

    r += vfprintf(stderr, format, ap);
    return r;
}

В этом примере переменная va_list ap используется в функции vfprintf, после того, как макрос va_end будет назван.

Исправление — вызывает va_end после Используя переменную va_list

Одно возможное исправление должно вызвать va_end только после всего использования переменной va_list.

#include <stdarg.h>
#include <stdio.h>

int call_vfprintf(int line, const char *format, ...) {
    va_list ap;
    int r=0;
    
    va_start(ap, format);
    r = vfprintf(stderr, format, ap);
    r += vfprintf(stderr, format, ap);
    va_end(ap);
    
    return r;
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: на
Синтаксис командной строки: INVALID_VA_LIST_ARG
Влияние: высоко
ID CWE: 628

Введенный в R2015b