手札カードの切り取りやコピーでエラー

Issue #5 resolved
k4nagatsuki repo owner created an issue

多数のカードを含むシナリオで次の現象が発生するとの事。

  • アクセス違反やウィジェットがdispose済みとのエラーが出る事がある。
  • 一度発生すると何度でも出るが、他のキャストカードの手札を編集した後は発生しない。

Comments (11)

  1. k4nagatsuki reporter
    • changed status to open

    音声関係の障害でstatic this関係がスレッドごとに実行されることに気づいたので、とりあえず手許のDWT2の該当箇所を修正してみる。これでしばらく様子見。

  2. k4nagatsuki reporter

    いつの間にかテーブルビューが壊れているのを確認。static thisは関係ない模様。

  3. k4nagatsuki reporter

    ホイールスクロールを繰り返すと時折Tableの表示が固まるのを確認。

    死んでおらず、再描画がほぼされなくなっている様子(稀に表示が改まる)。WM_PAINTイベントは発生しているので、その処理に問題がある模様。問題箇所は特定できず。SWT.VIRTUALは関係なかった。

    エラーは発生しないので、手札カードの件とは無関係であると思われる。

  4. k4nagatsuki reporter

    Tableはマルチバイト文字を長々と表示すると表示がおかしくなる。

  5. k4nagatsuki reporter

    確定ではないが、*.exe.manifestによってVisual StyleをOnにしなければ発生しなくなる。

  6. k4nagatsuki reporter

    アクセス違反等が発生する件は、これまでの報告から推定すると、

    • スペックが低いほど出やすい傾向にある
    • 大きなシナリオを編集するほど出やすい傾向にある
    • たまにAccess ViolationではなくMemory errorが出る

    よってWindows API関数でメモリ確保に失敗、その失敗のエラーをライブラリ内でチェックしそこねているのではないか、と推定。

    budを使用して-gつきのフルコンパイル・リンクを行い、具体的なエラー発生箇所を特定する予定。

  7. k4nagatsuki reporter
    OS.MoveMemory (plvfi.item.pszText, StrToTCHARz( buffer[0..length_] ), length_ * 2);
    

    Table.dのこの箇所でアクセス違反の発生を確認。マルチバイト文字列絡みの問題であるように思える。

  8. k4nagatsuki reporter
    (_tcslen(StrToTCHARz( buffer[0..length_] )) + 1) * 2
    

    これが本来あるべき長さ。

    文字列"a日本語"の場合、tcslen()の結果は4になるが、"a日本語".lengthは10になる。そのため、元のコードではMoveMemory()で6バイト分の範囲外アクセスが発生する。結果はランダムなエラーとなりうる。

  9. Log in to comment