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