Ticket #25935

連続した長いひらがな・カタカナの入力で Segmentation fault

Open Date: 2011-08-07 18:38 Last Update: 2011-08-08 22:33

Reporter:
Owner:
(None)
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
3
Severity:
3
Resolution:
Fixed
File:
None

Details

\input luatexja.sty

あああああああああああああああああ(中略)あ

\bye

のように,ひらがな・カタカナを366文字以上続けて入力すると Segmentation fault が出ます. 間に漢字や記号などが挟まっていると(?)起こらないみたいなので,実用上は問題なさそうですが. 他の環境でも再現しますでしょうか?

Ticket History (3/10 Histories)

2011-08-07 18:38 Updated by: kmaeda
  • New Ticket "連続した長いひらがな・カタカナの入力で Segmentation fault" created
2011-08-07 18:39 Updated by: kmaeda
  • Priority Update from 5 - Medium to 3
  • Severity Update from 5 - Medium to 3
2011-08-07 18:58 Updated by: h7k
Comment

ほんとですね.とりあえずこちらの環境でも再現したので報告.
# こちらの環境は,LuaTeX 0.70.1(rev 4277,TeX Live 2011 収録のもの),Gentoo amd64 です.

2011-08-07 20:30 Updated by: h7k
Comment

LuaTeX 本体のバグのような気がしてきました.

以下のソースをタイプセットすると↓

%#!luatex b.tex
\directlua{
callback.register('hyphenate', 
  function (head,tail)
   for p in node.traverse_id(node.id('glyph'), head) do
      p.font=51 %★
   end
   print('>>> H1'); lang.hyphenate(head); print('>>> H2')
   return head
 end)}

a

\bye
Segmentation fault が発生しました(r4341 に更新しました)
This is LuaTeX, Version beta-0.71.0-2011080720 (rev 4341) 
 restricted \write18 enabled.
(./b.tex>>> H1
 
typeset segmentation fault at Sun Aug  7 20:25:03

しかし,★の行で示した数値を [0,50] の範囲内に収めると,文字がでるか否かはともかくとして pdf が作成されます.

2011-08-07 20:46 Updated by: h7k
Comment

上↑のコメントは変なことをいっていました(ロードしていないフォントを指定したから落ちたんですね).失礼しました.

その代わりといってはなんですが,次のソースはどうでしょう? (「あ」が366個なら Segmentation fault, 365個なら OK)

%#!luatex b.tex
\directlua{callback.register('hyphenate', 
  function (head,tail)
   print('>>> H1'); lang.hyphenate(head); print('>>> H2')
   return head
 end)}

ああああ(略)あああ

\bye

2011-08-07 21:04 Updated by: kmaeda
Comment

その代わりといってはなんですが,次のソースはどうでしょう?(「あ」が366個なら Segmentation fault, 365個なら OK)

確かに再現しますね.ということは,ハイファネーション絡み? ひらがな・カタカナで起こるのもこれと関係があるのでしょうか?

2011-08-08 19:37 Updated by: h7k
Comment

ハイフネーション絡みということで調べてみました. luatexdir/lang/texlang.h にある

#  define MAX_WORD_LEN 256      /* in chars */
を 512 にしたら,症状はおきなくなったようです.「あ」の連続が1単語として判定されて,MAX_WORD_LEN を超えてしまったのが原因の気がします.
# 366 に意味があるかなと思いましたが,ノートPC (Thinkpad X200, Gentoo amd64) だと境目が 367 だったので,やっぱり意味はないようです.

和文文字の連続のところで組み込み関数 lang.hyphenate が実行されない(or 適当に「単語区切りを入れる」)ようにすればいいんでしょうかね.

2011-08-08 20:50 Updated by: h7k
Comment

とりあえず, 関数 suppress_hyphenate_ja()(in: luatexja-core.lua (master) or pretreat.lua (kitagawa_test))に, 次の変更を施したら良さそうな気がします:

+ if p.subtype%2==1 then p.subtype = p.subtype - 1 end
  p.lang=lang_ja
LuaTeX Reference の説明によると,ハイフネーションは subtype の最下位ビットが 1 のノードに対して行われるようなので, これを逆手にとって,和文文字のノードの subtype の最下位を 0 にした,というわけです.

# 今まで使っていた p.lang=lang_ja はもういらないかもしれません.

2011-08-08 21:51 Updated by: kmaeda
Comment

とりあえず,関数 suppress_hyphenate_ja()(in: luatexja-core.lua (master) or pretreat.lua (kitagawa_test))に,次の変更を施したら良さそうな気がします

変更すると,確かに起きなくなりました.なるほど. 他の単語間にスペースを入れない言語でも同様の問題があるのか,というのが少し気になりますが,LuaTeX-ja での対応としてはとりあえずこれで良さそうに思います.

2011-08-08 22:33 Updated by: h7k
  • Resolution Update from None to Fixed
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2011-08-08 22:33
Comment

↑上の修正をコミットしました (commit b52131f, 9842262).

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login