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.
Группа: Программирование |
Язык: 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