Тип данных второго аргумента к va_start
макрос приводит к неопределенному поведению
Этот дефект происходит когда второй аргумент va_start
макрос имеет один из этих типов данных:
Тип данных, который изменяется при перенесении продвижению параметра по умолчанию.
Например, char
и short
подвергнитесь продвижению int
или unsigned int
и float
подвергается продвижению double
. Типы int
и double
не изменяйтесь при продвижении параметра по умолчанию.
(C только), тип регистра или тип данных объявляются с register
спецификатор.
(Только C++) тип справочных данных.
(Только C++) тип данных, который имеет нетривиального конструктора копии или нетривиального конструктора перемещения.
В функции variadic или функции с переменным количеством аргументов:
void multipleArgumentFunction(int someArg, short rightmostFixedArg, ...) { va_list myList; va_start(myList, rightmostFixedArg); ... va_end(myList); }
va_start
макрос инициализирует список аргументов переменной так, чтобы дополнительные аргументы к функции variadic после фиксированных параметров могли быть получены в списке. Согласно C11 и C++ 14 Стандартов, если вы используете один из отмеченных типов данных для второго аргумента va_start
макрос (например, rightmostFixedArg
в предыдущем примере), поведение не определено.Если тип данных вовлекает нетривиального конструктора копии, поведение задано реализацией. Например, ли конструктор копии вызывается в вызове va_start
зависит от компилятора.
При использовании va_start
макрос, попытайтесь использовать типы int
, unsigned int
или double
для самого правого именованного параметра функции variadic. Затем используйте этот параметр в качестве второго аргумента va_start
макрос.
Например, в этом примере, самый правый именованный параметр функции variadic имеет поддерживаемый тип данных int
:
void multipleArgumentFunction(int someArg, int rightmostFixedArg, ...) { va_list myList; va_start(myList, rightmostFixedArg); ... va_end(myList); }
Чтобы избежать неопределенного и заданного реализацией поведения, минимизируйте использование функций variadic. Используйте средства проверки для MISRA C:2012 Rule 17.1
или MISRA C++:2008 Rule 8-4-1
обнаружить использование функций variadic.
Группа: Программирование |
Язык: C | C++ |
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки:
VA_START_INCORRECT_TYPE |
Удар: носитель |
Find defects (-checkers)
| Incorrect data type passed to va_arg
| Incorrect use of va_start
| Too many va_arg calls for current argument list