MISRA C:2012 Rule 17.1

Функции < stdarg.h > не должны использоваться

Описание

Определение правила

Не должны использоваться функции < stdarg.h >.

Объяснение

Правило запрещает использование va_list, va_arg, va_start, va_end, и va_copy.

Можно использовать эти функции в тех случаях, когда поведение не задано в Стандарте. Для образца:

  • Вы вызываете va_start в функции, но не вызывайте соответствующую va_end до окончания работы функционального блока.

  • Вы вызываете va_arg в различных функциях на одной переменной типа va_list.

  • va_arg имеет синтаксис type va_arg (va_list ap, type).

    Вы вызываете va_arg с type что несовместимо с фактическим типом аргумента, полученного из ap.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include<stdarg.h>
void f2(int n, ...) {
    int i;
    double val;
    va_list vl;                         /* Non-compliant */

    va_start(vl, n);                    /* Non-compliant */

    for(i = 0; i < n; i++)
    {
        val = va_arg(vl, double);         /* Non-compliant */
    }

    va_end(vl);                         /* Non-compliant */
}

В этом примере правило нарушается из-за va_start, va_list, va_arg и va_end используются.

#include <stdarg.h>
void h(va_list ap) {                    /* Non-compliant */
    double y;

    y = va_arg(ap, double );              /* Non-compliant */
}

void g(unsigned short n, ...) {
    unsigned int x;
    va_list ap;                         /* Non-compliant */

    va_start(ap, n);                    /* Non-compliant */
    x = va_arg(ap, unsigned int);       /* Non-compliant */

    h(ap);

    /* Undefined - ap is indeterminate because va_arg used in h () */
    x = va_arg(ap, unsigned int);       /* Non-compliant */

}

void f(void) {
    /* undefined - uint32_t:double type mismatch when g uses va_arg () */
    g(1, 2.0, 3.0);
}

В этом примере va_arg используется в той же переменной ap типа va_list в обеих функциях g и h. В g, второй аргумент unsigned int и в h, второй аргумент double. Это несоответствие типов вызывает неопределенное поведение.

Проверяйте информацию

Группа: Функция
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2014b