Open syuilo opened 4 years ago
やりたい
これって構文として用意する? それか組み込み関数の追加で実現?
とりあえず関数で事足りそう
Re:match(str, pat)
みたいな
というよりは正規表現を変数に入れたりしたときあるから正規表現という値を生成する関数を作った方が良いかも
Re:match(str, Re:new('[a-z]+'))
みたいな
エスケープを減らすために生文字列リテラルはあると便利
欲しいですね…(外部に作るのが面倒だったので、AiSciprtで昨今のスパムを捌いています)
ホスト側でタイムアウト時間を設定できるようにして超えたらError
を返すようにすればReDoSは回避できる?
そもそもタイムアウトのための標準的な機構がjsの正規表現にないかも? ブラウザでReDoSに耐性のある正規表現の選択肢としてはre2-wasmのような安全な正規表現エンジンのwasmバインディングを使うか、recheckなどで事前に計算量が爆発しないかをチェックする方法しか知らないです。 事前チェックは偽陰性があるかもしれない(よく見てないのでもしかしたら大丈夫なのかもしれない)し、recheckはScala.js製でサイズがでかい(bundlephobia見るとmin+gzipで1MBある)
タイムアウトできるライブラリはNode.jsのvmとか使ってるのでブラウザで動かない(Worker使ったらできるか?) ので、どうやっても全部ホスト側で用意しないといけなそう。
まあ完全に信頼されたコードしか実行されないことが保証されているユースケースではReDoSの心配は無視できるから、とりあえずネイティブの正規表現で実装してオプションで外部から正規表現エンジンを設定できるようにすると良さそう
正規表現エンジン実装するのは流石にめんどいから、ネイティブのものを使うことになると思うけど、そうするとReDoSが行えるようになってしまう だからAiScriptのホストが正規表現エンジンを用意するようにさせよう