va_start вызывается в непараметрической функции или вызывается со вторым аргументом, который не является самым правым параметром вариадической функции
Этот дефект возникает при использовании va_start макро таким образом, который нарушает его спецификации.
В переменной функции или функции с переменным числом аргументов:
void multipleArgumentFunction(int someArg, int rightmostFixedArg, ...) {
va_list myList;
va_start(myList, rightmostFixedArg);
...
va_end(myList);
}va_start макрос инициализирует список переменных аргументов, так что дополнительные аргументы для переменной функции после фиксированных параметров могут быть зафиксированы в списке. В предыдущем примере va_start инициализация макроса myList чтобы он мог фиксировать аргументы после rightmostFixedArg.Вы можете нарушить спецификации va_start несколькими способами. Например:
Вы звоните va_start в неизменяемой функции.
Второй аргумент va_start не является самым правым фиксированным параметром переменной функции.
Нарушение технических требований va_start макрос может привести к ошибкам компиляции. Если компилятору не удается обнаружить нарушение, нарушение может привести к неопределенному поведению.
Убедитесь, что:
va_start макрос используется в переменной функции
Второй аргумент va_start макрос является самым правым фиксированным параметром переменной функции.
Во избежание неопределенного и определяемого реализацией поведения сведите к минимуму использование различных функций. Используйте шашки для MISRA C:2012 Rule 17.1 или MISRA C++:2008 Rule 8-4-1 обнаружение использования вариадных функций.
| Группа: Программирование |
| Язык: 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