このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
va_list 引数が無効です
変数の引数リストが、va_end
での無効化後に使用されているか、va_start
または va_copy
で初期化されていない
説明
この欠陥は、変数 va_list
を vprintf
グループの関数の引数として使用する一方で、以下が該当する場合に発生します。
変数が、
va_start
またはva_copy
を使用して前もって初期化されていない。変数が、
va_end
を使用して前もって無効化され、かつ再初期化されていない。
たとえば、関数 vsprintf
を vsprintf (buffer,format, args)
として呼び出すとします。しかし、関数呼び出しの前に、va_list
変数 args
が次のいずれによっても初期化されていません。
va_start(args, paramName)
。paramName
は可変引数関数の最後の名前付き引数です。たとえば、関数定義void func(int n, char c, ...) {}
では、c
が最後の名前付き引数となります。va_copy(args, anotherList)
。anotherList
は別の有効な変数va_list
です。
リスク
初期化されていない va_list
引数の動作は未定義となります。初期化されていない va_list
引数で関数を呼び出すと、スタック オーバーフローの原因となることがあります。
修正方法
va_list
変数を関数の引数として使用する前に、va_start
または va_copy
で初期化します。
変数の使用がすべて終了してから、va_end
を使用しで変数をクリーンアップします。
例
結果情報
グループ: プログラミング |
言語: C | C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: INVALID_VA_LIST_ARG |
影響度: High |
バージョン履歴
R2015b で導入