# V2604. MISRA. Features from <stdarg.h> should not be used.

Данное диагностическое правило основано на руководстве 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);
    }

В приведенном выше коде есть несколько проблем, которые могут привести к неопределённому поведению (примечание: в списке перечислены не все опасности, содержащиеся в коде):

- В функции 'bar' вызывается макрос 'va_start', но не вызывается 'va_end'.
- Макрос 'va_arg' применяется к одному и тому же объекту 'va_list' в различных функциях. Проблема здесь в том, нет возможности проконтролировать состояние списка аргументов и количество извлеченных из него элементов после передачи в функцию.
- В функции 'baz' вызывается функция 'bar' с аргументами типа 'double', хотя она ожидает 'int'. Вызов данной функции может привести к потере данных.

Данная диагностика классифицируется как:

MISRA-C-2012-17.1 MISRA-C-2023-17.1