メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2012 Rule 17.1

The standard header file <stdarg.h> shall not be used

説明

ルール定義

The standard header file <stdarg.h> shall not be used 1 .

根拠

va_listva_argva_startva_end および va_copy の使用はルールにより禁止されています。

これらの機能は規格で動作が定義されていない方法で使用できます。次に例を示します。

  • va_start を関数内で呼び出すが、関数ブロックの終了前に対応する va_end を呼び出さない。

  • va_list 型の同じ変数に対し、異なる関数内で va_arg を呼び出す。

  • va_arg が構文 type va_arg (va_list ap, type) をもつ。

    ap から取得する引数の実際の型と互換性がない typeva_arg を呼び出す。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#include<stdarg.h>                      /* Non-compliant */
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_startva_listva_arg および va_end が使用されているため、ルールに違反します。

#include <stdarg.h>                     /* Non-compliant */
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);
}

この例では、関数 g および h の両方で、va_argva_list 型の同じ変数 ap に対して使用されています。g では、2 番目の引数は unsigned int であり、h では、2 番目の引数は double です。型の不一致は未定義の動作を発生させます。

チェック情報

グループ: 関数
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2014b で導入

すべて展開する


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.