例外コード c0000417 [日記]
先日、こんな報告がありました。
例外 不明なソフトウェア例外(0xc0000417)がアプリケーションの0x0042d637で発生しました。
なんだろう、これ……
Visual Studio のインストールフォルダの中を探った所、次のファイルの中に見つかりました。
MicrosoftSDKs\Windows\v6.0A\Include\ntstatus.h
// // MessageId: STATUS_INVALID_CRUNTIME_PARAMETER // // MessageText: // // An invalid parameter was passed to a C runtime function. // #define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417L)
「Cのランタイム関数に渡したパラメータが間違ってます」と言うことらしいです。
この定数が使われるところを調べてみたところ、
Visual Studio 2008(?)で導入されたセキュリティ強化版のC言語の関数(CRT)が使っているみたいです。
ちなみに、セキュリティ強化版CRTとは、C言語の標準関数の末尾に "_s
" が付いています。
例えば、strcpy_s
とかstrcat_s
とか。
この手の関数で、引数に問題があるということは、
文字列用の配列のサイズが不足している(バッファオーバーフロー)ということでしょうか。
そんな感じです。
ちなみに、_set_invalid_parameter_handler()
を使って、エラーがあった時の挙動を変えられます。
ところで、MicrosoftSDKs\Windows\v5.0\Include\ntstatus.h
には記載されていないので、もしかして Vista 専用?
オマケで、エラーの発生箇所のアドレス付近を逆アセンブルしてみました。
0042D62B XOR EAX,EAX 0042D62D PUSH EAX 0042D62E PUSH EAX 0042D62F PUSH EAX 0042D630 PUSH EAX 0042D631 PUSH EAX 0042D632 CALL 0042D605h 0042D637 ADD ESP,14h 0042D63A RETN
なんだろうな、これ。
C言語風に書き直すと、こんな感じ。
func(0, 0, 0, 0, 0);
セキュリティ強化版CRTに関係しそうな関数で、これっぽいものを探してみたところ、該当しそうなものが1つ見つかりました。
_set_invalid_parameter_handler()
に指定する関数のプロトタイプは、次のようになっています。
void _invalid_parameter( const wchar_t * expression, const wchar_t * function, const wchar_t * file, unsigned int line, uintptr_t pReserved );
引数が5つです。
しかも、MSDNによると
『すべてのパラメータの値は、CRT ライブラリのデバッグ バージョンを使用する場合を除いて、NULL になっています』
とのことなので、5つ引数に0を指定して関数呼び出ししていることになります。
本当に、これなのかは不明ですけどね。
もっとも、それが分かったから、どうなんだ、と言う感じですが……。
今日の一冊 | |
|
コメント 0