va_start назван в функции non-variadic или вызван вторым аргументом, который не является самым правым параметром функции variadic
Неправильное использование va_start происходит, когда вы используете макрос 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.
| Группа: Программирование |
| Язык: C | C++ |
| Значение по умолчанию: на |
Синтаксис командной строки:
VA_START_MISUSE |
| Влияние: носитель |
Find defects (-checkers) | Incorrect data type passed to va_arg | Incorrect type data passed to va_start | Too many va_arg calls for current argument list