Правило 17.1 MISRA C:2012

Функции <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.

Обменивайтесь сообщениями в отчете

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#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: необходимый
Язык: C90, C99

Введенный в R2014b