Skip to content

yet-another-migemo-dict を利用すると panic してしまう #1

@tokuhirom

Description

@tokuhirom

https://github.com/oguna/yet-another-migemo-dict/releases/tag/v0.4 で配布されている migemo-compact-dict.zip を利用して

cargo build && ./target/debug/rustmigemo -d $HOME/Downloads/migemo-compact-dict

と実行したときに、's' や 'h' などの特定のクエリを実行したときに、panic してしまいます。

QUERY: s
thread 'main' panicked at src/migemo/regex_generator.rs:252:83:
called `Option::unwrap()` on a `None` value
stack backtrace:
   0: rust_begin_unwind
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:645:5
   1: core::panicking::panic_fmt
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking.rs:72:14
   2: core::panicking::panic
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking.rs:144:5
   3: core::option::Option<T>::unwrap
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/option.rs:931:21
   4: rustmigemo::migemo::regex_generator::RegexGenerator::generate_stub
             at ./src/migemo/regex_generator.rs:252:14
   5: rustmigemo::migemo::regex_generator::RegexGenerator::generate
             at ./src/migemo/regex_generator.rs:186:5
   6: rustmigemo::migemo::query::query_a_word
             at ./src/migemo/query.rs:40:21
   7: rustmigemo::migemo::query::query
             at ./src/migemo/query.rs:51:23
   8: rustmigemo::main
             at ./src/main.rs:98:26
   9: core::ops::function::FnOnce::call_once
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
diff --git src/migemo/regex_generator.rs src/migemo/regex_generator.rs
index 9ec12b8..111fe60 100644
--- src/migemo/regex_generator.rs
+++ src/migemo/regex_generator.rs
@@ -249,6 +249,10 @@ impl RegexGenerator {
                                {
                                        buf.push('\\');
                                }
+                               println!("TMP====");
+                               println!("{:?}", tmp.as_ref().unwrap().code);
+                               println!("{:?}", tmp.as_ref().unwrap().code as u32);
+                               println!("{:?}", std::char::from_u32(tmp.as_ref().unwrap().code as u32));
                                buf.push(::std::char::from_u32(tmp.as_ref().unwrap().code as u32).unwrap());
                                if operator.newline.len() > 0 {
                                        buf.push_str(&operator.newline);

のように printf debug をしますと、以下のようになります。

(前略)
TMP====
40635
40635
Some('麻')
TMP====
40653
40653
Some('黍')
TMP====
55362
55362
None
thread 'main' panicked at src/migemo/regex_generator.rs:256:83:
called `Option::unwrap()` on a `None` value
stack backtrace:
   0: rust_begin_unwind
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/std/src/panicking.rs:645:5
   1: core::panicking::panic_fmt
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking.rs:72:14
   2: core::panicking::panic
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/panicking.rs:144:5
   3: core::option::Option<T>::unwrap
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/option.rs:931:21
   4: rustmigemo::migemo::regex_generator::RegexGenerator::generate_stub
             at ./src/migemo/regex_generator.rs:256:14
   5: rustmigemo::migemo::regex_generator::RegexGenerator::generate
             at ./src/migemo/regex_generator.rs:186:5
   6: rustmigemo::migemo::query::query_a_word
             at ./src/migemo/query.rs:40:21
   7: rustmigemo::migemo::query::query
             at ./src/migemo/query.rs:51:23
   8: rustmigemo::main
             at ./src/main.rs:98:26
   9: core::ops::function::FnOnce::call_once
             at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/library/core/src/ops/function.rs:250:5

よって、意図しない 55362 によってエラーになっているようです。
コードの詳細は追っていないのですが、 55362 は十六進数で 0xD842 なのでUnicodeのHigh Surrogates (U+D842) だと思います。サロゲートペアに現在の rustmigemo が対応していないにもかかわらず、yet-another-migemo-dict には surrogate pair で表現されるような文字列が含まれているために発生しているのかなと想像しています。

  1. サロゲートペアに対応するように rustmigemo を修正する
  2. サロゲートペアで表現されるような文字は重要度が低いと考えて辞書の生成時点で除外してしまう。

などの対応策が考えられるのかなと思いました。

(なお、https://github.com/oguna/migemo-compact-dict-latest の辞書では問題なく動作しております)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions