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

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Тип 'va\_list', а также макросы 'va\_arg', 'va\_start', 'va\_end' и 'va\_copy', необходимые для работы с функциями с переменным числом аргументов и определённые в заголовочном файле '<stdarg\.h\>', не должны использоваться\. Их неправильное использование часто становится причиной неопределённого поведения\.

Рассмотрим пример:

```cpp
#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'\. Вызов данной функции может привести к потере данных\.