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