Too many va_arg calls for current argument list

Количество вызовов в va_arg превышает количество аргументов, переданных в вариадную функцию

Описание

Этот дефект возникает, когда количество вызовов va_arg превышает количество аргументов, переданных в соответствующую вариадную функцию. Анализ поднимает дефект только, когда вызывается вариадная функция.

Слишком много va_arg вызовов для текущего списка аргументов не вызывает дефекта, когда:

  • Количество вызовов в va_arg внутри вариадная функция неопределенна. Для примера, если вызовы выполняются из внешнего источника.

  • The va_list используется в va_arg недопустимо.

Риск

Когда вы звоните va_arg и нет следующего аргумента, доступного в va_list, поведение не определено. Вызов va_arg может повредить данные или вернуть неожиданный результат.

Зафиксировать

Убедитесь, что вы передаете правильное количество аргументов в вариадную функцию.

Примеры

расширить все

#include <stdarg.h>
#include <stddef.h>
#include <math.h>

/* variadic function defined with
* one named argument 'count'
*/
int variadic_func(int count, ...) {
    int result = -1;
    va_list ap;
    va_start(ap, count);
    if (count > 0) {
        result = va_arg(ap, int);
        count --;
        if (count > 0) {
/* No further argument available 
* in va_list when calling va_arg
*/	

            result += va_arg(ap, int);
        }
    }
    va_end(ap);
    return result;
}

void func(void) {

    (void)variadic_func(2, 100); 

}

В этом примере именованный аргумент и только один вариадный аргумент передаются в variadic_func() когда он вызывается внутрь func(). При втором вызове va_arg, дальнейший вариативный аргумент не доступен в ap и поведение не определено.

Коррекция - передайте правильное количество аргументов в вариадную функцию

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

#include <stdarg.h>
#include <stddef.h>
#include <math.h>

/* variadic function defined with
* one named argument 'count'
*/

int variadic_func(int count, ...) {
    int result = -1;
    va_list ap;
    va_start(ap, count);
    if (count > 0) {
        result = va_arg(ap, int);
        count --;
        if (count > 0) {

/* The correct number of arguments is
* passed to va_list when variadic_func()
* is called inside func()
*/			
            result += va_arg(ap, int); 
        }
    }
    va_end(ap);
    return result;
}

void func(void) {

    (void)variadic_func(2, 100, 200); 

} 

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

Группа: Программирование
Язык: C | C++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки : TOO_MANY_VA_ARG_CALLS
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 685
Введенный в R2018a