検索/置換でのフリーズや保護違反の防止のNo.39552
fzok4234 さん 22/01/31 14:19
 
こんにちは。いつも大変お世話になっております。


さて、検索 / 置換ダイアログでの正規表現の使用についてですが、最近正規表現 DL
L 側のトラブルが
秀丸エディタ本体のフリーズや保護違反を引き起こす問題が頻発したため、なるべく
早く改善してほしい
ことがいくつがございます。


1. 正規表現 DLL が例外を投げるなどクラッシュした場合、秀丸エディタ本体が丸
ごと保護違反で強制終了に
なったり、時には保護違反のメッセージ表示やダンプファイル出力すら無い完全なク
ラッシュが引き起こされて
しまいます。

この場合、特定の検索パターンが原因で正規表現 DLL がクラッシュしている状況だ
と、別のファイルのタブ上で
検索 / 置換ダイアログを開いただけでそのタブも落ちてしまいます。そのため、
「動作環境」の「プライバシー」
ページから検索 / 置換ヒストリを全て破棄しないといけなくなります。

これを防ぐために正規表現 DLL が投げた例外はきちんと補足した上で、秀丸エディ
タ本体の保護違反の扱いには
しないでちゃんとエラーメッセージを表示するようにしてもらいたいです。


2. 正規表現の処理に時間がかかっている場合、秀丸エディタ本体が応答無し状態に
なってしまいます。

この場合、処理を中止させるためには現時点ではハングアップチェッカーからそのタ
ブを強制終了させるしか
ない状況です。

このため、正規表現の実行に時間がかかっている場合は

 A. 「中断しますか ? ( はい / いいえ) 」というメッセージボックス。
 B. メニューバーや常駐秀丸エディタの「正規表現の中断」というメニューコマン
ド。

などを使っていつでも中止できるようにしてもらえれば助かります。


いずれも、マクロの実行時のエラーやフリーズならば普通にできることなので、正規
表現 DLL の実行時にも
同じアプローチでユーザーが対処できるようになっているほうがよいと思われます。

どうかよろしくお願いします。



[ ]
RE:39552 検索/置換でのフリーズや保護違No.39555
秀まるお2 さん 22/01/31 15:05
 
 すみません。こっちの発言見てないで先にコメント書いてしまいました。

 HmJre.dllのハングアップについては、一応、30秒以上固まったらタスクバー・
トレーに砂時計アイコンと通知が出てそこから中断できるようにしています。今回、
部分式で遅いケースについてはその通知が出ないケースがあったので、それは次の
バージョンで対処させていただきます。

> これを防ぐために正規表現 DLL が投げた例外はきちんと補足した上で、秀丸エデ
>ィタ本体の保護違反の扱いには
> しないでちゃんとエラーメッセージを表示するようにしてもらいたいです。

 そういう処理は可能ではありますが、現状で秀丸エディタがちゃんとログを出して
てHmJre.dllが原因かどうかはちゃんと判断可能でして、なんだかんだでバグの原因
も特定できています。なので、そこまではご勘弁ください。

[ ]
RE:39555 検索/置換でのフリーズや保護違No.39556
秀まるお2 さん 22/01/31 16:09
 
 30秒がもしも長すぎるようでしたら、

  (?#timeout=10)

 みたいな指定をすると10秒でアイコン&通知表示するとかって対応する作戦がい
いかもしれません。

 何か簡単に対応できる案があれば対応してもいいかなぁと思います。

[ ]
RE:39555 検索/置換でのフリーズや保護違No.39557
fzok4234 さん 22/01/31 16:29
 
> HmJre.dllのハングアップについては、一応、30秒以上固まったらタスクバー・
>トレーに
> 砂時計アイコンと通知が出てそこから中断できるようにしています。今回、部分式
>で遅いケースに
> ついてはその通知が出ないケースがあったので、それは次のバージョンで対処させ
>ていただきます。

問題が「個々の正規表現 DLL」にあるとして個別に対処することを検討されているよ
うですね。しかし、
結論から申し上げればこれは「秀丸エディタ本体」側で対処しなければならない問題
とみています。


実は、hmonig.dll でも重い正規表現パターンでのフリーズ状態やクラッシュは度々
発生しています。
しかも、クラッシュの場合は保護違反メッセージ / ダンプファイル無しの状態の上、
一度検索ヒストリを
破棄した後で再度同じ検索パターンを入力してもクラッシュが再現しないという「神
出鬼没」状態です。
また、hmonig.dll には重い処理の中断用の「砂時計アイコン」のような便利な物は
備わっていません。

さらに、JRE32.dll 互換の正規表現 DLL の API 仕様は公開されたものであり、誰で
も正規表現 DLL の
記述は可能です。つまり、ユーザーが自作した正規表現 DLL のバグが秀丸エディタ
本体のフリーズや
クラッシュの原因になったりもします。

また、その他のサードパーティ製の正規表現 DLL にはどんなバグが潜んでいるのか
分からず、いつでも
粗悪 DLL をつかまされるリスクがあります。最悪、わざと while ( 1 ) {} でフ
リーズさせたり、
throw ; で例外を投げたり 0 で除算したりしてクラッシュさせる正規表現 DLL がば
らまかれる危険も
あります。

さすがにシステムを破壊したり他のパソコンに感染増殖する完全な「ウィルス DLL」
ともなれば
当局による検挙 / 処罰の対象になる上、アンチウィルスアプリのメーカーも駆除の
対象として扱うために
動きだし、直ちに社会から葬り去られることでしょう。しかし、極東の島国たる日本
だけで普及している
中堅エディタとしての秀丸エディタ本体がフリーズ / クラッシュするだけの「極め
て軽微な被害」と
見なされてしまえば、社会から葬られることなくいつまでもサイバー空間を漂流し続
けてしまいます。


以上の観点から、この問題は個々の正規表現 DLL で対処すべきではなく、正規表現
DLL の実行環境を
提供する「ホストアプリ」としての秀丸エディタ本体側で対処すべきであると思われ
ます。正規表現 DLL も
秀丸マクロと同様、所詮は秀丸エディタ本体を実行環境とする「ゲストアプリ」に過
ぎません。

しかし、秀丸マクロの実行ではフリーズ / クラッシュへの対応がきちんとできてい
るのに、正規表現 DLL の
実行ではそれができないのはおかしな話である、という構図になっております。


> そういう処理は可能ではありますが、現状で秀丸エディタがちゃんとログを出して
>てHmJre.dllが
> 原因かどうかはちゃんと判断可能でして、なんだかんだでバグの原因も特定できて
>います。
> なので、そこまではご勘弁ください。

これは何も秀丸エディタ本体を丸ごと保護違反で落としてまでダンプファイルを出力
させる必要はないのでは
と思います。すなわち、秀丸エディタ本体の実行は継続させたまま正規表現 DLL だ
けを安全に閉じた上で、
その「正規表現 DLL のデバッグ専用のダンプファイル」の出力を行う機能を新たに
秀丸エディタ本体に
実装することで実現できるのではないでしょうか。



[ ]
RE:39557 検索/置換でのフリーズや保護違No.39558
秀丸担当 さん 22/01/31 17:22
 

秀丸エディタ本体側は、かなり限定的なのですが50000文字以上の対象テキストのと
きに、時間がかかる場合に画面右下に時間がかかっているバルーンが出るようになっ
ています。
それが限定的すぎるので、次のβ版では(?<>)のネストがあるときは常にやる予定で
した。
HmJreの通知もあって被ることになって少々恰好悪いですが、無いよりかはいいと思
います。
未知のdllの他の条件もありそうということで、hmjre.dllでなければ常にチェックす
るようにしようかと思います。

中断は強制終了で、最後に可能であれば保存を試みる方式になります。
本体側から見るとDLLはネイティブコードのブラックボックスなので、無視してその
まま続行するのはやめておこうと思います。

[ ]
RE:39558 検索/置換でのフリーズや保護違No.39559
fzok4234 さん 22/01/31 23:20
 
> 秀丸エディタ本体側は、かなり限定的なのですが50000文字以上の対象テキストの
>ときに、
> 時間がかかる場合に画面右下に時間がかかっているバルーンが出るようになってい
>ます。
> それが限定的すぎるので、次のβ版では(?<>)のネストがあるときは常にやる予定
>でした。
> HmJreの通知もあって被ることになって少々恰好悪いですが、無いよりかはいいと
>思います。
> 未知のdllの他の条件もありそうということで、hmjre.dllでなければ常にチェック
>するように
> しようかと思います。

実装の検討ありがとうございます。


> 中断は強制終了で、最後に可能であれば保存を試みる方式になります。
> 本体側から見るとDLLはネイティブコードのブラックボックスなので、無視してそ
>のまま続行するのは
> やめておこうと思います。

ただ、このやり方だと検索 / 置換ヒストリに残っている問題の正規表現パターンに
より、次回改めて
検索 / 置換ダイアログを開いただけで再びフリーズ / クラッシュが発生してしまい
ます。また、ヒストリの
特定の項目だけを

 ・抜き出してテキストファイルなどにメモする。
 ・再度フリーズ / クラッシュさせないため選択して削除する。

するためには、現状では必ず検索 / 置換ダイアログを開いて入力欄の右側の↓マー
クをクリックする操作を
しないといけないのですが、この操作自体がフリーズ / クラッシュ発生のために不
可能となっていて完全に
詰んだ状態になります。

その結果、「動作環境」の「プライバシー」からヒストリを全て破棄して回復させる
以外に道がなくなって
しまいます。

これでは、ユーザーが問題を引き起こす正規表現パターンを特定して対処するトラブ
ルシューティングが
不可能になってしまいます。また、各正規表現 DLL のベンダーへのバグ報告にも大
きく支障をきたします。

よって、上記の「中断は強制終了で最後に可能であれば保存を試みる方式」を実装す
る前には、

 ・検索 / 置換ダイアログを一切開くこと無しで、ヒストリの全ての項目を Unicod
e テキストファイルに
  バックアップする。
 ・検索 / 置換ダイアログを一切開くこと無しで、このバックアップテキストから
ヒストリの特定の項目を
  選択してリストアする。

というような、トラブルシューティング目的の「ヒストリのエクスポート / イン
ポート」機能を先に必ず
実装しないといけません。お忙しいところ誠に恐縮ですが、こちらの機能の実装から
から先にご検討いただければ
幸いです。

重ね重ねよろしくお願い申し上げます。



[ ]
RE:39559 検索/置換でのフリーズや保護違No.39560
秀丸担当 さん 22/02/01 09:46
 
検索ダイアログの操作中に問題になるとしたら、操作中に検索が働くようなオプショ
ンのどれかが働いているのだと思います。
複雑な正規表現をテストする場合、[その他]→[動作環境]→[検索]→[すべて検索]の、
「ヒット候補の表示」の3つのオプションを全部OFFにして、[その他]→[動作環境]
→[検索]の「リアルタイム検索」もOFFにしておくといいです。

DLLの関数の呼び出し中に中断して続行するのは、ハングアップチェッカーがごにょ
ごにょにしているのでできる可能性がありそうな感じで書いてしまいましたが、普通
は不可能なことで、すみませんが不可能ということでお願いします。


[ ]
RE:39560 検索/置換でのフリーズや保護違No.39561
fzok4234 さん 22/02/01 15:43
 
> 複雑な正規表現をテストする場合、[その他]→[動作環境]→[検索]→[すべて検索]
>の、
> 「ヒット候補の表示」の3つのオプションを全部OFFにして、[その他]→[動作環
>境]→[検索]の
> 「リアルタイム検索」もOFFにしておくといいです。

問題の回避方法のご教示ありがとうございます。

一応、ヘルプの「トラブル対処の例」のページとかにこのことを書き加えておいた方
がよいと思います。


[ ]