メインコンテンツ

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

現在の引数リストに対する va_arg 呼び出しが多すぎます

va_arg の呼び出しの数が可変個引数関数に渡される引数の数を超えている

説明

この欠陥は、va_arg の呼び出しの数が、対応する可変個引数関数に渡される引数の数を超えている場合に発生します。解析では、可変個引数関数が呼び出される場合にのみ欠陥が報告されます。

[現在の引数リストに対する va_arg 呼び出しが多すぎます] では、次の場合には欠陥を報告しません。

  • 可変個引数関数内の va_arg の呼び出しの数が不確定である。たとえば、呼び出しが外部ソースからのものである場合です。

  • va_arg で使用される va_list が無効である。

リスク

va_arg を呼び出すとき、va_list 内に使用可能な次の引数がないと、動作が未定義になります。va_arg の呼び出しによって、データが破損したり、予期しない結果が返されたりする可能性があります。

修正方法

適切な数の引数を可変個引数関数に渡すようにします。

すべて展開する

#include <stdarg.h>
#include <stddef.h>
#include <math.h>

/* variadic function defined with
* one named argument 'count'
*/
int variadic_func(int count, ...) {
    int result = -1;
    va_list ap;
    va_start(ap, count);
    if (count > 0) {
        result = va_arg(ap, int);
        count --;
        if (count > 0) {
/* No further argument available 
* in va_list when calling va_arg
*/	

            result += va_arg(ap, int);
        }
    }
    va_end(ap);
    return result;
}

void func(void) {

    (void)variadic_func(2, 100); 

}

この例では、func() 内で呼び出されたときに、名前付き引数と可変個引数が 1 つだけ variadic_func() に渡されます。va_arg の 2 番目の呼び出しでは、ap で使用可能な可変個引数がそれ以上ないため、動作が未定義になります。

修正 — 適切な数の引数を可変個引数関数に渡す

1 つの修正方法として、適切な数の引数を可変個引数関数に渡すようにします。

#include <stdarg.h>
#include <stddef.h>
#include <math.h>

/* variadic function defined with
* one named argument 'count'
*/

int variadic_func(int count, ...) {
    int result = -1;
    va_list ap;
    va_start(ap, count);
    if (count > 0) {
        result = va_arg(ap, int);
        count --;
        if (count > 0) {

/* The correct number of arguments is
* passed to va_list when variadic_func()
* is called inside func()
*/			
            result += va_arg(ap, int); 
        }
    }
    va_end(ap);
    return result;
}

void func(void) {

    (void)variadic_func(2, 100, 200); 

} 

結果情報

グループ: プログラミング
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: TOO_MANY_VA_ARG_CALLS
影響度: Medium

バージョン履歴

R2018a で導入