Тип данных variadic аргумента функции не совпадает с типом в вызове va_arg
Неправильный тип данных передал va_arg, когда тип данных в вызове va_arg
не совпадает с типом данных variadic аргумента функции, который читает va_arg
.
Например, вы передаете аргумент unsigned char
функции variadic func
. Из-за продвижения параметра по умолчанию аргумент продвинут на int
. Когда вы используете вызов va_arg
, который читает аргумент unsigned char
, несоответствие типов происходит.
void func (int n, ...) { ... va_list args; va_arg(args, unsigned char); ... } void main(void) { unsigned char c; func(1,c); }
В функции variadic (функционируют с переменным количеством аргументов), вы используете va_arg
, чтобы считать каждый аргумент из списка аргументов переменной (va_list
). Использование va_arg
не гарантирует, что там на самом деле существует аргумент, чтобы читать или что тип данных аргумента совпадает с типом данных в вызове va_arg
. Необходимо убедиться, что оба условия верны.
Чтение неправильного типа с вызовом va_arg
может привести к неопределенному поведению. Поскольку аргументы функции находятся на стеке, вы можете получить доступ к нежелательной области стека.
Убедитесь, что тип данных аргумента, переданного функции variadic, совпадает с типом данных в вызове va_arg
.
Аргументы функции variadic подвергаются продвижениям параметра по умолчанию. Типы данных аргумента функции variadic не могут быть определены от прототипа. Аргументы таких функций подвергаются продвижениям параметра по умолчанию (см. Секунду. 6.5.2.2 и 7.15.1.1 в Стандарте C99). Целочисленные аргументы подвергаются целочисленному продвижению и аргументам типа, float
продвинут на double
. Для целочисленных аргументов, если тип данных может быть представлен int
, например, char
или short
, это продвинуто на int
. В противном случае это продвинуто на unsigned int
. Все другие аргументы не подвергаются продвижению.
Чтобы избежать неопределенного и заданного реализацией поведения, минимизируйте использование функций variadic. Используйте средства проверки для MISRA C:2012 Rule 17.1
или MISRA C++:2008 Rule 8-4-1
, чтобы обнаружить использование функций variadic.
Группа: Программирование |
Язык: C | C++ |
Значение по умолчанию: на |
Синтаксис командной строки:
VA_ARG_INCORRECT_TYPE |
Влияние: носитель |
ID CWE: 686 |
Find defects (-checkers)
| Invalid va_list argument
| Too many va_arg calls for current argument list