豚吐露@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

原因の一つとして考えられるのがCString.Format()。

VisualC++の指定子ってそもそもANSI C互換ではなくMSオリジナルの拡張仕様。
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つついたトコにある
Format string syntax checking。現在、無効な文字列は検出されます。たとえば、 printf 書式指定文字列の不正な型フィールド文字を使用した場合です。
ってトコがそうらしいんじゃが...こんな文から分かったら天才過ぎるわ。w

まぁ、例外情報が以下の場合はビンゴなので、フォーマット指定子を見なおしてみてください。
問題の署名:
問題イベント名: BEX
障害モジュールの名前: MSVCR90.dll
障害モジュールのバージョン: 9.0.30729.6161
障害モジュールのタイムスタンプ: 4dace5b9
例外オフセット: 000532cd
例外コード: c0000417
例外データ: 00000000
※バージョンとタイムスタンプが違えばオフセットが違う可能性も有り。大きくは違わないと思う。
※多分、メジャーバージョンが一致すれば例外コードが違う可能性はまず無い。


参考:書式指定文字列
書式
%[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type


なので、書式指定文字列をチェックする正規表現は
%([\-\+0\s#]+)?([\d\*]+)?(\.[\d\*]+)?(h|l|ll|I|I32|I64)?([ACEGSXacdefginopsux])
で良いハズ。大文字小文字区別してね。区別せんと『i』がひっかかる。
これにhitせんかったら間違った書式。

単純に書式指定部分を探したかったら
%([^ACEGSXacdefginopsux]*)([ACEGSXacdefginopsux])
でok。これも大文字小文字区別ね。



更新日: 2012年04月13日 (金) 11時01分28秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー