Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для С. Тип 'va_list', а также макросы 'va_arg', 'va_start', 'va_end' и 'va_copy', необходимые для работы с функциями с переменным числом аргументов и определённые в заголовочном файле '<stdarg.h>', не должны использоваться. Их неправильное использование часто становится причиной неопределённого поведения.
Рассмотрим пример:
#include <stdint.h> #include <stdarg.h> void foo(va_list args) { double y; y = va_arg(args, int); } void bar(uint16_t count, ...) { uint16_t x; va_list ap; va_start (ap, count); // <= x = va_arg (ap, int); foo(ap); x = va_arg (ap, int); } void baz(void) { bar(1.25, 10.07); }
В приведенном выше коде есть несколько проблем, которые могут привести к неопределённому поведению (примечание: в списке перечислены не все опасности, содержащиеся в коде):
Данная диагностика классифицируется как:
|