-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
\ifpdfprimitive のハッシュ値の衝突 #29
Comments
d079aaa で直したつもりです. |
私のところのテストケースは % Single-character primitives (ex_space, ital_corr)
\catcode`\X=14\relax
\catcode`\P=14\relax
\ifx\primitive\undefined
\ifx\pdfprimitive\undefined
\else
\catcode`\P=9\relax
% pdfTeX and e-(u)pTeX
P\ifpdfprimitive\ [1:TRUE]\else[1:FALSE]\fi
P\ifpdfprimitive\/[2:TRUE]\else[2:FALSE]\fi
P\ifpdfprimitive\-[3:TRUE]\else[3:FALSE]\fi
\fi
\else
\catcode`\X=9\relax
% XeTeX and LuaTeX
X\ifprimitive\ [1:TRUE]\else[1:FALSE]\fi
X\ifprimitive\/[2:TRUE]\else[2:FALSE]\fi
X\ifprimitive\-[3:TRUE]\else[3:FALSE]\fi
\fi
\end ですが(全部 TRUE になるはず), → おっと,フォーマットが fmtutil-user のものが残っていたみたいorz 直っているようです。失礼しました。 |
同じパッチが pdftex.web, xetex.web にも少しの offset または fuzz だけで当たりますが,pdfTeX が直る一方で XeTeX は期待する結果にならないので,XeTeX はまた別のところに問題があるのかも… |
pdfTeX では
ですが,XeTeX では扱える文字が増えて
となっています( |
d079aaa にはバグがありました. |
(てきとーなことを言ってみる) そもそも、通常のハッシュはともかくとして、このプリミティブ用のハッシュで「単文字を特別扱い」する必要ってあるんですかね?アクセスされる頻度は低そうですし。 |
(てきとーな疑問) XeTeXで例えば |
私も同じ疑問を持っていました。(eptex などの従来挙動は |
自分の予想としては、 あるいは、単文字の場合に --- old\pdfutils.ch 2017-04-25 06:02:26.000000000 +0900
+++ pdfutils.ch 2017-09-23 01:08:07.564214600 +0900
@@ -506,8 +506,8 @@
@!j,@!l:integer;
begin
if s<256 then begin
- p := s;
- if (p<0) or (prim_eq_level(p)<>level_one) then
+ p := s; l := length(s);
+ if (p<0) then
p := undefined_primitive;
end
else begin
@@ -515,6 +515,7 @@
if s = str_ptr then l := cur_length else l := length(s);
@<Compute the primitive code |h|@>;
p:=h+prim_base; {we start searching here; note that |0<=h<hash_prime|}
+end;
loop@+begin if prim_text(p)>0 then if length(prim_text(p))=l then
if str_eq_str(prim_text(p),s) then goto found;
if prim_next(p)=0 then
@@ -526,7 +527,6 @@
end;
p:=prim_next(p);
end;
- end;
found: prim_lookup:=p;
end;
(またてきとーなこと言ってる) |
12d0ee2 でそんな感じの処理にしています. |
動作チェックどうもありがとうございます.一箇所 end のインデント位置を直したり,行末の余計なスペースを削除したりしました.
eptexdir/ が texjporg にコミットされたあとにやっておきます. |
master ヘマージし,eptexdir/ は r45386 で(バージョン番号を 170924 にして)コミットしました。 |
r45394, r45395 確認しました。どうもありがとうございます。 |
今度は以下の挙動が気になってきました。 %#!eptex
\pdfprimitive\par\q % ! Undefined control sequence.
\pdfprimitive\ \q % no error
\pdfprimitive\/\q % ! Undefined control sequence.
\pdfprimitive\ [\q]\end % ! Undefined control sequence. |
全然わからないのですが,
と1行足すとエラーが出るようになりましたが,間違っている予感しかしません.衝突する |
本当だ! 以下のソース,あるいはその一行目と二行目を入れ替えたソースで,必ず二行目だけがエラーになるので, \pdfprimitive\ \q % no error
\pdfprimitive\vrule\q % error
\end → どうやら「垂直モードだとエラー」らしい。 |
今 4d4690f を試してみると,以下のソースが eptex / euptex で ok になりました。 %#!eptex
% description of the bug:
% in vertical mode, the error "! Undefined control sequence."
% does not appear
\def\MODE{%
\ifinner\message{I}\else\message{E}\fi
\ifvmode\message{V}\else\message{H}\fi
}
\MODE\ \MODE % => "\ " begins horizontal mode
\MODE\vrule\MODE % => "\vrule" begins horizontal mode
% ----- "\par" is ok
\MODE % => E V
\pdfprimitive\par\q % ! Undefined control sequence.
% ----- "\ " is wrong
\MODE % => E V
\pdfprimitive\ \q % no error
\MODE % => E H
\pdfprimitive\ \q % ! Undefined control sequence.
\MODE % => E V
\pdfprimitive\ \q % no error
% ----- "\vrule" is wrong
\MODE % => E V
\pdfprimitive\vrule\q % no error
\MODE % => E H
\pdfprimitive\vrule\q % ! Undefined control sequence.
\MODE % => E V
\pdfprimitive\vrule\q % no error
% -----
\MODE % => E V
\end pdftex に同じ変更を適用すると
が余分に出るので,そちらは要調整のようです。 |
こちらでは再現しませんでした,あれえ……. |
Windows 7 Professional Service Pack 1 (64bit) 上の MSVC12 (Visual Studio 2013) で Win32 バイナリをビルドしてみましたが (eptex.dll, pdftex.dll),これも Mac での結果と同一で
でした。私のパッチの当て方さえ間違っていなければ,環境依存の問題ではない気がします。 |
今,別PC(Gentoo Linux, amd64)でもう一回やってみたところ,再現しました.今日の朝のは何だったんだろう. 試していないので推測ですが, |
配列 |
テスト結果は eptex/euptex/pdftex/xetex 全て正常でした。ありがとうございます。 |
r45482 で e-(u)pTeX の部分だけコミットしました。pdfTeX / XeTeX の方のレポートはまたお願いしてもよろしいでしょうか? > @h-kitagawa さん |
数日前に報告しました.e-[u]pTeX 側は直ったということで,クローズします. |
次のテストソースで
|
私のところ (OS X 10.11.6 x86_64-darwin) では
でした。ちなみに luatex も似た感じです。
|
Fixed in r45956. |
\ifpdfprimitive (pdfTeX / e-pTeX) と \ifprimitive (XeTeX / LuaTeX) について,ツイッターのこの辺で見つかった挙動です。LuaTeX では正常のようですが,ほかでは誤った判定になる例があります。(例:現在の TeX Live では
\ifpdfprimitive\␣
が pdfTeX / e-pTeX / XeTeX で偽)ここからの連続ツイートの説明で納得しましたが,この誤判定は「プリミティブが
prim_table
に登録されるときに,単文字の名前と複数文字の名前に同じハッシュ値が与えられる」ことに起因します。LuaTeX では単文字の名前が特別扱いされないので誤動作は起きないようですが,それ以外では単文字のプリミティブ\␣
,\/
,\-
で問題が起きている(あるいは今後起きる可能性がある)ようです。The text was updated successfully, but these errors were encountered: