exponenta event banner

MISRA C:2012 Правило 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. Несоответствие типов приводит к неопределенному поведению.

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

Группа: Функция
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b