Тип данных второго аргумента к va_start макрос приводит к неопределенному поведению
Неправильные данные о типе, переданные 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