Incorrect use of va_start

va_start назван в функции non-variadic или вызван вторым аргументом, который не является самым правым параметром функции variadic

Описание

Этот дефект происходит, когда вы используете va_start макрос способом, который нарушает его технические требования.

В функции variadic или функции с переменным количеством аргументов:

void multipleArgumentFunction(int someArg, int rightmostFixedArg, ...) {
    va_list myList;
    va_start(myList, rightmostFixedArg);
    ...
    va_end(myList);
}
va_start макрос инициализирует список аргументов переменной так, чтобы дополнительные аргументы к функции variadic после фиксированных параметров могли быть получены в списке. В предыдущем примере, va_start макрос инициализирует myList так, чтобы это могло получить аргументы после rightmostFixedArg.

Можно нарушить технические требования va_start несколькими способами. Например:

  • Вы вызываете va_start в функции non-variadic.

  • Второй аргумент va_start не самый правый фиксированный параметр функции variadic.

Риск

Нарушение технических требований va_start макрос может привести к ошибкам компиляции. Если компилятору не удается обнаружить нарушение, нарушение может привести к неопределенному поведению.

Фиксация

Убедитесь что:

  • va_start макрос используется в функции variadic

  • Второй аргумент va_start макрос является самым правым фиксированным параметром функции variadic.

Чтобы избежать неопределенного и заданного реализацией поведения, минимизируйте использование функций variadic. Используйте средства проверки для MISRA C:2012 Rule 17.1 или MISRA C++:2008 Rule 8-4-1 обнаружить использование функций variadic.

Примеры

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

#include <stdarg.h>

double addVariableNumberOfDoubles(int num, double* weight, ...) {
    double sum=0.0;
    va_list list;
    va_start(list, num);
    for(int i=0; i < num; i++) {
        sum+=weight[i]*va_arg(list, double);
    }
    va_end(list);
    return sum;
}

В этом примере, самом правом фиксированном параметре к addVariableNumberOfDoubles функцией является weight. Однако различный параметр используется в качестве второго аргумента к va_start макрос.

Коррекция — порядок переключателя фиксированных параметров функции Variadic

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

#include <stdarg.h>

double addVariableNumberOfDoubles(double* weight, int num, ...) {
    double sum=0.0;
    va_list list;
    va_start(list, num);
    for(int i=0; i < num; i++) {
        sum+=weight[i]*va_arg(list, double);
    }
    va_end(list);
    return sum;
}

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

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: VA_START_MISUSE
Удар: Средняя
Введенный в R2019a