当方が開発中のプログラムで、ここ1年ほど潜在していた再現性の低いバグがあり、
最近になってようやく重い腰を上げてメスを入れ始めました。
大量のコメントアウト等で、必要最低限の関数呼び出しのみでテストしているうちに
ようやく目ぼしい部分を絞り込めてきたわけですが、いくらプログラムを読み直しても
その根源となる部分に辿り着けません。
Application Verifierとか、その他静的解析ツールを導入してあれやこれやと試しましたが、
最終的にDrawStringToHandle関数が悪さをしている…?のかと考えました。(アクセス違反が発生)
まず当然、関数に渡す引数(この場合表示する文字列ですが)を作成する周辺の文を
あたってみるのですが、特にバッファオーバーランなども見当たりません。
----------------------------------------------------------
とりあえずその部分のプログラムの内容を説明します。
簡単なスロットゲームのような形になっており、リール内の絵柄は文字(2byte文字なので厳密には文字列)になっています。
リールの配列は、[リールの数][そのリール内の文字数][実際の文字]という3次元配列であり、
[そのリール内の文字数]の部分は全部で4とし、リールの位置を格納してある配列…(A)を用いて
文字(列)をDrawStringToHandleで描画していました。(回すときは、配列(A)をインクリメントする)
○△■ ←データ構造上、これの次に来るのは一番下のもの。
○△■
○△■
○△■
元々ずいぶん前に作ったものなので、稚拙といいますか、記述にも誤りがある可能性もあると思い、
(とはいえ何日かけて読み返しても見つけられなかったのですが)思い切ってその部分を作り直しました。
今度は各リールごとに双方向に辿れるループする連結リストを作成し、ポインタで指したノードの文字(列)を
DrawStringToHandleで描画するというように変更し、コードの見た目も随分スッキリしました。が、状況は変わらず。
データそのものに問題があるのかと思い、連結リストの中身をfprintfで全部書き出してみましたが、何の問題もなく出力成功。
そしてつい先程、ただのDrawStringで試したところ、これも何事もなく通過しました。
どうしてもDrawStringToHandleで呼ぶとアクセス違反が起こってしまう。
ただ、DrawStringToHandleなんて他でもたくさん使ってるので、ここだけエラーが出るのも変な話ですが。。
(この前の全く報告されていなかったフォントの一件もあるので、まさか…とか思わなかったりしないでもないんですが)
1週間ほどコレにかかりっきりでも解決の手掛かりが得られなかったので、ちょっと投げてみました。