pTeX で Segmentation Fault

pTeX で Segmentation Fault

- 北川 弘典 の投稿
返信数: 11
TeX Live svn 由来の (e-)pTeX を使っています
(コンパイル日は 1/8 です)が,
以下の ソース ptest-120308.tex を処理させると
segmentation fault が発生します.

% ptest-120308.tex ここから
\documentclass{beamer}
\begin{document}
\begin{frame}
\verb+\catcode+命令
\end{frame}
\end{document}
% ここまで

以下が端末への出力結果です:

This is e-pTeX, Version 3.1415926-p3.2-110825-2.3 (utf8.euc) (TeX Live 2012/dev)
restricted \write18 enabled.
entering extended mode
(./ptest-120308.tex
... 省略 ...
No file ptest-120308.nav.
! Missing number, treated as zero.
Segmentation fault

エンジンを ptex  にして platex.fmt を作った場合も,
同じ症状になります.

「! Missing number」エラーは \catcode による自然な
ものだと思いますが,この segfault の原因は何なのでしょうか?
北川 弘典 への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
ptex-base.ch
1552 行
s:=get_avail; info(s):=Lo(buffer[loc]);

info(s):=Lo(buffer[loc]);
でおこっているようです。buffer[loc] は 1 バイトとすると,
Lo(buffer[loc]) はおかしいような気もしますが...
仮にめくらめっぽうで
info(s):=Lo(info(loc));
とすると,segfault は無くなりました。

Akira Kakuto への返信

Re: pTeX で Segmentation Fault

- 北川 弘典 の投稿
> info(s):=Lo(buffer[loc]);
ありがとうございます.

> info(s):=Lo(info(loc));
> とすると,segfault は無くなりました。
tex.web のl. 6625 に
> |loc| is a pointer to the current node in the token list, i.e.,
> the node that will be read next.
とあることから,
たぶんこの Lo(info(loc)) で正しいのではないかと思います.
北川 弘典 への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
> たぶんこの Lo(info(loc)) で正しいのではないかと思います

実験によると,Lo なしで info(loc) のほうがわかりやすい
表示になると思うのですが,Lo は何のためにあるのでしょうか?

Akira Kakuto への返信

Re: pTeX で Segmentation Fault

- 北川 弘典 の投稿
なるほど,「\BAD.」の表示は Lo で上位バイトを消していたからだったんですね.

> 実験によると,Lo なしで info(loc) のほうがわかりやすい
> 表示になると思うのですが,Lo は何のためにあるのでしょうか?
pTeX-3.1.11 でも上位バイトを消していたので,単純にこれが「正しい」挙動だと思っていました.

調べてみると,Lo を安直に消すのも微妙な気がしてきました.どうするのが良い解決策なのでしょうか.

% ptest2-120308.tex
\catcode あ0
\end
% ここまで

これをコンパイルすると \catcode のところでエラーがでますが,
Lo なしだと,環境変数 MALLOC_PERTURB_ (以下mp)の
値によって「あ」の直後の文字の表示が異なります.
私の環境だと,以下のようになりました:
(右端の8桁の16進数は info(loc) の値です)
mp=15 : あ韶 f0f0f0f0
mp=16: あ闖 efefefef
mp=97: あ\BAD. 9e9e9e9e
mp=154: あ\IMPOSSIBLE. 65656565

Lo ありだと,上の4通りでは全部表示は「あ\BAD.」になりました.
よくわかりませんが,Lo を入れることで
端末に変なバイト列が出力されないようにしたかったのではないのでしょうか?
北川 弘典 への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
> Lo ありだと,上の4通りでは全部表示は「あ\BAD.」になりました.
> よくわかりませんが,Lo を入れることで
> 端末に変なバイト列が出力されないようにしたかったのではないの
>でしょうか?

よくわかりました。
ありがとうございます。

Akira Kakuto への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+ab}
\end{document}

の場合,latex では

! Missing number, treated as zero.
<to be read again>
a
l.3 \frame{\verb+\catcode+ab}

となるので,

\documentclass{article}
\begin{document}
\frame{\verb+\catcode+命令}
\end{document}

の場合,platex で

! Missing number, treated as zero.
<to be read again>

l.3 \frame{\verb+\catcode+命令}

でよいとすれば,link(start)=null のままでよい
ような気がするのですが,他のところで困るのでしょうか?
つまり,何もせずに
show_token_list(start,loc,100000);
だけにする。あるいはこの部分の change を無しにする。

Akira Kakuto への返信

Re: pTeX で Segmentation Fault

- 北川 弘典 の投稿
どうなんでしょう,私にはまだよくわかりません.

なお,teTeX3 + pTeX-3.1.10 (ptexenc なし) をコンパイルして確かめてみたら,
「\BAD.」は出力されませんでした:

% a.tex ここから(実際は EUC)
\toks0={あ}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end
% ここまで

--- TeX Live svn での結果:\BAD. が残っている
This is pTeX, Version 3.1415926-p3.2 (utf8.euc) (TeX Live 2012/dev) (format=ptex 2012.3.8) 9 MAR 2012 21:24
restricted \write18 enabled.
%&-line parsing enabled.
**a.tex
(./a.tex
! Missing number, treated as zero.

あ\BAD.
l.2 ...r\expandafter\catcode\expandafter\the\toks0

? x
No pages of output.

--- teTeX3 下の pTeX-3.1.10 (ptexenc なし)
This is pTeX, Version 3.141592-p3.1.10 (euc) (Web2C 7.5.4) (format=ptex-euc 2012.3.9) 9 MAR 2012 21:24
**a.tex
(./a.tex
! Missing number, treated as zero.


l.2 ...r\expandafter\catcode\expandafter\the\toks0

? x
No pages of output.

「\catcode あ0」の場合だと,3.1.10 でも「あ0」の表示になりました.
北川 弘典 への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
--- ptex-base.ch.orig Thu Mar 08 23:08:24 2012
+++ ptex-base.ch Sat Mar 10 07:41:53 2012
@@ -1483,17 +1483,6 @@
{|state| code at start of line}
@z

-@x [22.311] l.6986 - pTeX: label
-@p procedure show_context; {prints where the scanner is}
-label done;
-var old_setting:0..max_selector; {saved |selector| setting}
-@y
-@p procedure show_context; {prints where the scanner is}
-label done, done1;
-var old_setting:0..max_selector; {saved |selector| setting}
-@!s: pointer; {temporary pointer}
-@z
-
@x [22.316] l.7110 - pTeX: init kcode_pos
@d begin_pseudoprint==
begin l:=tally; tally:=0; selector:=pseudo;
@@ -1535,32 +1524,6 @@
for q:=1 to n do print_char(" "); {print |n| spaces to begin line~2}
if m+n<=error_line then p:=first_count+m else p:=first_count+(error_line-n-3);
if trick_buf2[(p-1) mod error_line]=1 then p:=p-1;
-@z
-
-@x [22.319] l.7157 - pTeX: adjust kanji code token
-@ @<Pseudoprint the token list@>=
-begin_pseudoprint;
-if token_type<macro then show_token_list(start,loc,100000)
-else show_token_list(link(start),loc,100000) {avoid reference count}
-@y
-@ @<Pseudoprint the token list@>=
-begin_pseudoprint;
-if token_type<macro then
- begin if (token_type=backed_up)and(loc<>null) then
- begin if (link(start)=null)and(check_kanji(info(start))) then {|wchar_token|}
- begin cur_input:=input_stack[base_ptr-1];
- s:=get_avail; info(s):=Lo(info(loc));
- cur_input:=input_stack[base_ptr];
- link(start):=s;
- show_token_list(start,loc,100000);
- free_avail(s);link(start):=null;
- goto done1;
- end;
- end;
- show_token_list(start,loc,100000);
- end
-else show_token_list(link(start),loc,100000); {avoid reference count}
-done1:
@z

@x [24.341] l.7479 - pTeX: set last_chr


のように,この部分に関する changes を全て無くすると,

(1)
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+命令}
\end{document}

! Missing number, treated as zero.
<to be read again>

l.3 \frame{\verb+\catcode+命令}


(2)
\catcode あ0
\end

! Missing number, treated as zero.
<to be read again>

l.1 \catcode あ
0


(3)
\toks0={あ}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end

! Missing number, treated as zero.
<to be read again>

l.2 ...r\expandafter\catcode\expandafter\the\toks0


のように,これらの例については全てもっともらしく
なるのですけど,ちょっとこわいです。


なお,latex, tex では
(1)
\documentclass{article}
\begin{document}
\frame{\verb+\catcode+ab}
\end{document}

! Missing number, treated as zero.
<to be read again>
a
l.3 \frame{\verb+\catcode+ab}


(2)
\catcode a0
\end

! Missing number, treated as zero.
<to be read again>
a
l.1 \catcode a
0


(3)
\toks0={a}
\expandafter\expandafter\expandafter\catcode\expandafter\the\toks0
\end

! Missing number, treated as zero.
<to be read again>
a
l.2 ...r\expandafter\catcode\expandafter\the\toks0
Akira Kakuto への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
日本語対応は show_token_list で終わっており,
show_context は変更しない方が良いような気が
しますが,よくわからないので,わかったら
教えてください。

Akira Kakuto への返信

Re: pTeX で Segmentation Fault

- Akira Kakuto の投稿
常に Hi(info(s))=0 なので,どう考えても
link(start):=s は \BAD. を出力するだけ
の意味しか無いと考え,link(start):=s をやめておきました。
問題が生じたら revert します。