豚吐露@wiki
VS2003からVS2008にbuild環境を変えたら実行時に例外が発生するようになった
最終更新:
Bot(ページ名リンク)
-
view
Visual Studio .Net 2003からVisual Studio 2008にbuild環境を変えたら実行時に例外が発生するようになった。
Windows XP SP3
Visual Studio .Net 2003
Visual C++ 2003/MFC71
Visual Studio 2005
Visual C++ 2005/MFC80
Visual Studio 2008
Visual C++ 2008/MFC90
Visual Studio .Net 2003
Visual C++ 2003/MFC71
Visual Studio 2005
Visual C++ 2005/MFC80
Visual Studio 2008
Visual C++ 2008/MFC90
原因の一つとして考えられるのがCString.Format()。
VisualC++の指定子ってそもそもANSI C互換ではなくMSオリジナルの拡張仕様。
http://msdn.microsoft.com/ja-jp/library/hf4y5e3w(v=vs.90).aspx
なので、ANSIのフォーマット指定子使ってると、表示されなかったりするのがVS2003まで...
http://msdn.microsoft.com/ja-jp/library/hf4y5e3w(v=vs.90).aspx
なので、ANSIのフォーマット指定子使ってると、表示されなかったりするのがVS2003まで...
VS .Net 2003 | format指示子がMSの仕様と合っていなかった場合、無視され空欄で表示される。 |
VS 2008 | format指示子がMSの仕様と合っていなかった場合、例外が発生する。 |
どうもCRTのセキュリティ強化の関係で仕様が変わったみたいなのでVS2005以降が対象。
http://msdn.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx
上のURLつついたトコにある
http://msdn.microsoft.com/ja-jp/library/8ef0s5kh(VS.80).aspx
上のURLつついたトコにある
Format string syntax checking。現在、無効な文字列は検出されます。たとえば、 printf 書式指定文字列の不正な型フィールド文字を使用した場合です。
ってトコがそうらしいんじゃが...こんな文から分かったら天才過ぎるわ。w
まぁ、例外情報が以下の場合はビンゴなので、フォーマット指定子を見なおしてみてください。
問題の署名: | |
問題イベント名: | BEX |
障害モジュールの名前: | MSVCR90.dll |
障害モジュールのバージョン: | 9.0.30729.6161 |
障害モジュールのタイムスタンプ: | 4dace5b9 |
例外オフセット: | 000532cd |
例外コード: | c0000417 |
例外データ: | 00000000 |
※バージョンとタイムスタンプが違えばオフセットが違う可能性も有り。大きくは違わないと思う。
※多分、メジャーバージョンが一致すれば例外コードが違う可能性はまず無い。
※多分、メジャーバージョンが一致すれば例外コードが違う可能性はまず無い。
なので、書式指定文字列をチェックする正規表現は
%([\-\+0\s#]+)?([\d\*]+)?(\.[\d\*]+)?(h|l|ll|I|I32|I64)?([ACEGSXacdefginopsux])
で良いハズ。大文字小文字区別してね。区別せんと『i』がひっかかる。
これにhitせんかったら間違った書式。
これにhitせんかったら間違った書式。
単純に書式指定部分を探したかったら
%([^ACEGSXacdefginopsux]*)([ACEGSXacdefginopsux])
でok。これも大文字小文字区別ね。
更新日: 2012年04月13日 (金) 11時01分28秒