Skip to content
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

Texのファイルで落ちます。 #539

Closed
KENCHjp opened this issue Oct 10, 2018 · 20 comments
Closed

Texのファイルで落ちます。 #539

KENCHjp opened this issue Oct 10, 2018 · 20 comments
Labels
🐛bug🦋 ■バグ修正(Something isn't working)
Milestone

Comments

@KENCHjp
Copy link
Member

KENCHjp commented Oct 10, 2018

\documentclass{jarticle}
\begin{document}

これはサンプルです。

\chapter{見出し}

\subsection{見出し}

\section{のあとに}

\subsubsection{落ちる?}

\end{document}

手持ちのv1では落ちない。v2.3.2.0では、上記のテキストを貼り付けて拡張子texで保存すると、動作を停止します。

@ds14050
Copy link
Contributor

ds14050 commented Oct 10, 2018

sakura.ini を削除した初期状態で開いて、a.tex として保存してみましたが普通に扱えました。2.3.2.0 です。何かのソフトが干渉しているというのがよくあるパターンですが……。

@berryzplus
Copy link
Contributor

berryzplus commented Oct 10, 2018

不具合っぽいので気にしてます。
ぼくも再現できませんでした・・・ 😢


ちょっと切り取りですが

a.tex として保存してみましたが普通に扱えました。

動作停止したファイルをzipに詰めて、
ここに貼り付け(=入力欄にドラッグ&ドロップ)してもらえれば何か分かるかも知れません。

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 10, 2018

あら、単純じゃないのね。

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 10, 2018

確かに自宅PCだと落ちないなぁ。。。

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 10, 2018

もっかい再現するPCで作ったファイル見てみます(&再現したらUPします)

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 10, 2018

同じPCのsakura.exeのみを別フォルダにコピーして実行するも再現せず。
同じPCのsakura.exeが入ったフォルダー事コピーして、sakura.exeに読み込ませると再現する。
そのフォルダのiniファイルを削除して実行するも再現せず。
iniファイルに何か残骸が残ってるのかも(v1からそのまま引き継いでてtexなんて初めて読み込んだので何か引き金を引いてるのかも)。もうちょっと調べます。

で、
http://sakura.qp.land.to/
こちらに報告があったものを再現させようとする過程で発生してるのですが、こちらの事象はiniファイルをクリアしても発生します。
一応検体をzip圧縮しました。このファイルでアウトライン解析(F11)するとサクラがこけます。
検体.zip
ただ必ずじゃないところが怪しいんですが。。。

@arigayas
Copy link

保存時の文字コードと改行コードはどうなってますか?

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 11, 2018

SJISのCRLFになってますね。

@berryzplus
Copy link
Contributor

アウトライン解析のバグなら、開いただけでは落ちないはずです。

アウトライン解析は無駄に高度なポインタ演算してて、c++解析でもcrashが発生してました。そん時は、自動インデントが発生する状況で間接的にアウトライン解析が起動されてたのが原因だったっぽいです。sf.net時代の話ね。

何かが原因でアウトライン解析が走った結果落ちてるのなら、アウトライン解析の問題としてまとめて対策できるかも知らんです。

@ds14050
Copy link
Contributor

ds14050 commented Oct 11, 2018

検体.zip で「動作を停止しました」。不思議なのはメニューから「アウトライン解析... F11」を実行するとなんでもないのに、F11 で解析すると停止することです。

(追記) デバッガではどちらもアクセス違反になるので、呼び出し経路の違いからくるスタックの厚みで耐えていただけとかそんな?

(追記) 話はそれますが BugReport/224 (BugReport/189 と同じ)は文字の間隔を2以上にすることで再現できます、再現を試みていたのなら。

@berryzplus
Copy link
Contributor

(追記) デバッガではどちらもアクセス違反になるので、呼び出し経路の違いからくるスタックの厚みで耐えていただけとかそんな?

スタックの厚みは関係ないっぽく見えます。
アクセス違反は WCHAR tmpstr[256] に 256文字目を書きに行くから起きる気配です。

void CDocOutline::MakeTopicList_tex(CFuncInfoArr* pcFuncInfoArr)

この処理が何をするコードで、
どんなデータを作りたいのか分からんので判断難しいです。

↓ナナメ読みした処理内容
たぶん、アウトライン解析をするメイン処理コードの一部。
解析した子ノードを表す「文字列データ」を作って、
アウトライン機能に渡す処理と思われる。

crashの直接原因は、「文字列データ」の上限255文字を超えるデータを作ろうとしたこと。

上限255文字を超えるデータを作りにいってるのがダメなのか(設計上ありえない?)、
上限255文字がダメなのか(上限が足りない?)、
データ受け渡しが文字列な時点で根底からダメなのか(I/F定義がおかしい?)、
ダメな理由を付けるのは難しくなさそう。
どうすればいいか考えるのは少し難しそう。

@ds14050
Copy link
Contributor

ds14050 commented Oct 11, 2018

  1. chapter>section>subsection>subsubsection からなる階層をアウトライン化しようとしているが、chapter>subsection や section>subsubsection のように、階層が連続しない場合(sabunSection>1)を想定していない雰囲気。
  2. そのときに stackSection の初期化されていない要素(※スキップされた階層に相当する部分)の数値(-858993460 など)を4文字分の secstr バッファに文字列化しようとしてあふれている。

のが直接の原因ではないでしょうか。

自分はアウトラインも TeX もまともな使用経験がないため、どういう結果を正解として修正すればいいのかわかりません。

@ds14050
Copy link
Contributor

ds14050 commented Oct 11, 2018

wcscat(tmpstr, secstr);
wcscat(tmpstr, szTitle);

という一連の行があるのに、各変数の定義がそれぞれ

WCHAR tmpstr[256];
WCHAR secstr[4];
wchar_t szTitle[256];

なのは問題かもしれません。潜在的な別の問題ではありますが。


(追記) 問題ありでした。以下のようなテキストをアウトライン解析すると tmpstr[] があふれます。リリースバイナリは落ちませんがデバッガが「Run-Time Check Failure #2 - Stack around the variable 'tmpstr' was corrupted.」と報告します。

\section{とってもとっても(中略)とっても長いセクション}
\subsection{とってもとっても(中略)とっても長いサブセクション}

@ds14050
Copy link
Contributor

ds14050 commented Oct 11, 2018

secstr が2桁までの連番しか想定していないのも問題でした。以下のような内容の100行を越えるテキストを TeX としてアウトライン解析すると、バージョン 2.3.2.0 が「動作を停止」します。

\section{a}
\section{a}
(同じ行を100行くらい省略)
\section{a}

5桁10桁の連番に対応できる必要はないかもしれませんが、安全にやり過ごせなければいけないでしょう。

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 11, 2018

残念ながら私もTeXは全然触ったことがなく今回初めて検体作りました^^;
有識者欲しいっすねぇ。

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 12, 2018

一応事象(開いただけで落ちる)が発生しているフォルダごと別PCへコピーして実行したら落ちないので、環境依存の様です。
なので開いただけで落ちる件はいったん忘れてください。
タイトル変えたほうがいいのかもしれませんが、アウトライン解析で落ちる件としてこのIssue残そうと思います。

@ds14050
Copy link
Contributor

ds14050 commented Oct 12, 2018

アウトライン解析をエディタウィンドウ内にドッキングしていると、エディタを再起動してもその状態が維持されているようです。これならファイルを sakura.exe アイコンにドロップして開いただけで落ちました(運良く落ちないこともあります。未初期化変数に何が入っているかによるのでしょう)。

@KENCHjp
Copy link
Member Author

KENCHjp commented Oct 12, 2018

@ds14050 さん、ビンゴです!

@ds14050
Copy link
Contributor

ds14050 commented Oct 12, 2018

もともとの TeX アウトライン

original_tex_outline

書き直した TeX アウトライン

rewritten_tex_outline

書き直した TeX アウトライン(内容を変えて2枚目)

rewritten_tex_outline2

違いは以下の通りです。

  • chapter, section, subsection, subsubsection というアウトライントピックを漏らさないこと。(1.0.1. SubSection の有無がそうです)
  • 飛ばした階層のトピック番号が 0 になること。(SubSubSection の番号が異なります)
  • 真っ当な階層構造であること。(Section と SubSubSection の階層構造が異なります)

しかしこれが現在の利用者に納得してもらえるのかはわかりません。

ネットでサンプルを検索したところ part, paragraph, subparagraph という階層もあるようでした。たとえば section から始まる小さな階層で文章を書くとき、chapter にあたる部分の番号が常に 0. として表示されるのは煩わしいかもしれません。part に追加対応するとなると 0.0. になってしまいます。深い階層から始まってより大きな構造があとから現れるイレギュラーな文書では曖昧になってしまいますが、0. というプリフィックスを削って表示する手が現実的かもしれません。


悪のりしました。配列に "part", "paragraph", "subparagraph" を追加するだけで階層を追加できます。最初に \part が出現するまでは \chapter が最上階層であるかのように 0. プリフィックスを省略しています。

rewritten_tex_outline3

もともとエディタが落ちていたようなイレギュラーな文書構造に対して、よりリーズナブルなアウトラインを与える一方、整然とした文書構造に対しては従来通りなので、ちょっとばかし仕様が変わるとしてもなんら問題はない気がしてきました。

@ds14050
Copy link
Contributor

ds14050 commented Oct 14, 2018

先のコメントで「整然とした文書構造に対しては従来通りなので、(中略)なんら問題はない気がしてきました。」と書きましたが、落ちるケースに注目するあまり正常ケースの検証はその時点ではまだでした。

次のようなマクロで、リリースバイナリが落ちないような、整然とした構造の TeX 文書を作成してみました。

generateTeXOutlineTopic.js.txt

マクロの出力サンプルを 2.0.3.1 (※2.3.2.0 と変わらないはずです)でアウトライン解析した結果が次のテキストです。

outline_sample_from_v2031.txt

section タグは必ずそのすぐ上の階層である chapter を親として持つように配置していますが、まれにアウトラインツリーの最上層に出現していることが見てとれます。

原因の根本はおそらく次の一行です。ループをまたぐ状態の伝搬が、連番を付する場合にのみ行われます。

if(!bNoNumber) lastSection = thisSection;

これが再現しないこと以外は、「整然とした文書構造に対しては従来通り」は概ね間違いないと思います。書き直した TeX アウトラインでは同じ文書が次のようにアウトライン化されます。

outline_sample_from_mine.txt


ふとした疑問ですが、TeX アウトラインは高度な処理をしているわけではありません。ルールファイルで間に合う処理であったならがっかりです。

@ds14050 ds14050 added the 🐛bug🦋 ■バグ修正(Something isn't working) label Oct 14, 2018
ds14050 added a commit to ds14050/sakura-clone that referenced this issue Oct 15, 2018
* Fix: トピックの階層が連続しない場合に、トピックが抜けたり、未初期化変数にアクセスして落ちないように。
* Fix: バッファ長より長いトピックタイトルで落ちないように。
* Fix: 3桁以上になる連番で落ちないように。
* Chg: 連番なしのトピックがあるときでも階層が正しくなるように。
ds14050 added a commit to ds14050/sakura-clone that referenced this issue Oct 15, 2018
* Fix: トピックの階層が連続しない場合に、トピックが抜けたり、未初期化変数にアクセスして落ちないように。
* Fix: バッファ長より長いトピックタイトルで落ちないように。
* Fix: 3桁以上になる連番で落ちないように。
* Chg: 連番なしのトピックがあるときでも階層が正しくなるように。
ds14050 added a commit to ds14050/sakura-clone that referenced this issue Oct 15, 2018
* Fix: トピックの階層が連続しない場合に、トピックが抜けたり、未初期化変数にアクセスして落ちないように。
* Fix: バッファ長より長いトピックタイトルで落ちないように。
* Fix: 3桁以上になる連番で落ちないように。
* Chg: 連番なしのトピックがあるときでも階層が正しくなるように。
ds14050 added a commit that referenced this issue Oct 17, 2018
* Fix: トピックの階層が連続しない場合に、トピックが抜けたり、未初期化変数にアクセスして落ちないように。
* Fix: バッファ長より長いトピックタイトルで落ちないように。
* Fix: 3桁以上になる連番で落ちないように。
* Chg: 連番なしのトピックがあるときでも階層が正しくなるように。
@m-tmatma m-tmatma added this to the next release milestone Oct 21, 2018
HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this issue Jun 11, 2019
* Fix: トピックの階層が連続しない場合に、トピックが抜けたり、未初期化変数にアクセスして落ちないように。
* Fix: バッファ長より長いトピックタイトルで落ちないように。
* Fix: 3桁以上になる連番で落ちないように。
* Chg: 連番なしのトピックがあるときでも階層が正しくなるように。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛bug🦋 ■バグ修正(Something isn't working)
Projects
None yet
Development

No branches or pull requests

5 participants