exponenta event banner

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

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

Описание

Этот дефект возникает при использовании 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
Воздействие: Высокое
ИДЕНТИФИКАТОР CWE: 628
Представлен в R2015b