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

MinGW: C++ の未定義動作によるクラッシュを修正する #1372

Merged
merged 3 commits into from
Aug 18, 2020

Conversation

k-takata
Copy link
Member

@k-takata k-takata commented Aug 16, 2020

PR の目的

C++ の未定義動作により、MinGWでビルドしたバイナリ(のRelease版)がクラッシュする問題を修正します。

(gccはNULLポインタに関する未定義動作を積極的に最適化に利用します。NULLポインタに対するメンバ関数の呼び出しは未定義動作であるため、gccは、メンバ関数が this==NULL で呼ばれることはないと判断し、メンバ関数内の if(this) チェックを最適化で削除してしまいます。これにより、実際にthis==NULL で呼ばれてしまうと、NULLポインタアクセスが発生してクラッシュしてしまいます。)

メンバ関数内での this が NULL かどうかのチェックをやめ、 メンバ関数を呼ぶ元でクラスポインタがNULLでないことをチェックするようにします。必要に応じて、チェック用の static 関数を用意し、それに差し替えます。

併せて、MinGW 用の Makefile が、msys2 の mintty 内から実行したときに正しく動かない問題があったので、修正しています。また、ヘッダファイルの依存関係の記述を修正し、githash.h, Funccode_enum.h, Funccode_define.h が自動で生成されるようにしました。#1375 に分離

カテゴリ

  • 不具合修正
  • ビルド関連
    • MinGWビルド

PR のメリット

MinGWビルド(Release版)が動くようになる。
(起動するようにはなりましたが、特定の操作で落ちる可能性は依然として残っています。)

PR のデメリット (トレードオフとかあれば)

逆にVC++ビルドに影響出る可能性あり。

テスト内容

MinGWビルド(Release版)が起動すること。
(いろいろ動かして落ちないこと。)
Ctrl+T を押してタグジャンプをしようとしたときに落ちないこと。

PR の影響範囲

CDocLine, CColorStrategy, EditNode, CMyWnd, CPrintPreview, CLayout, CEditWnd を使用している箇所に影響の可能性あり。

関連 issue, PR

Fix #601

参考資料

@k-takata k-takata added the MinGW MinGW label Aug 16, 2020
@AppVeyorBot
Copy link

Build sakura 1.0.3000 completed (commit 2e0a05038b by @k-takata)

@AppVeyorBot
Copy link

Build sakura 1.0.3001 completed (commit 8b1e2eb16c by @k-takata)

@k-takata
Copy link
Member Author

安全な形でやるなら、関数内の if(this) チェックは残したままで、MinGWで実際に問題が起きた呼び出し元にもチェックを追加するのがよいかも知れない。2重チェックになるかもしれないが、そこはコンパイラの最適化に期待したい。

完全な形で修正するなら、if(this) チェックの入ったメンバ関数は削除してしまって、コンパイルエラーになった箇所をすべてチェック入りの static 関数に置き換えればよいが、修正箇所が膨大な数になりそう。

@k-takata
Copy link
Member Author

安全な形でやるなら、関数内の if(this) チェックは残したままで、MinGWで実際に問題が起きた呼び出し元にもチェックを追加するのがよいかも知れない。2重チェックになるかもしれないが、そこはコンパイラの最適化に期待したい。

こちらの方針で修正完了。VC++ビルドへの影響は無くなったはず。
将来に向けた課題ということで、this チェックを行っている箇所には // TODO: Remove "this" check のコメントを追加。

EditorConfigの影響で、行末空白の差分が大量に出ているので、差分を見るときは空白を無視するとよい。GitHub上だと以下のリンクが使える。
https://github.com/sakura-editor/sakura/pull/1372/files?w=1

@AppVeyorBot
Copy link

Build sakura 1.0.3004 completed (commit 9beb48fe5e by @k-takata)

@k-takata k-takata marked this pull request as ready for review August 17, 2020 02:01
@AppVeyorBot
Copy link

Build sakura 1.0.3005 completed (commit 4c7d9e2a5c by @k-takata)

@k-takata
Copy link
Member Author

このPRの中で行っていたMinGWビルドシステムの改善を別PRに切り出しました。#1375

Based on the EditorConfig setting.
Stop calling member functions with this==NULL. This causes undefined
behavior on C++. This may work on VC++ but causes SEGV on MinGW.

Related: sakura-editor#601
Restore "this" check for safety on VC++.
Add TODO comments for the future work.
@AppVeyorBot
Copy link

Build sakura 1.0.3010 completed (commit 6d6a6fd6c2 by @k-takata)

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

問題ないと思います。

MinGW版Releaseビルドしたsakura.exeでエディタが起動しました。
MinGW版Releaseビルドしたsakura.exeでFunccode_enum.hを開いて、テキストカーソルがFunccode_x.hsrcにある状態でCtrl+Tしてタグジャンプが発動しました。

@@ -66,7 +66,12 @@ class CLayout
CLayoutInt GetIndent() const { return m_nIndent; } //!< このレイアウト行のインデントサイズを取得。単位は半角文字。 CMemoryIterator用

//取得インターフェース
CLogicInt GetLogicLineNo() const{ if(this)return m_ptLogicPos.GetY2(); else return CLogicInt(-1); } //$$$高速化
CLogicInt GetLogicLineNo() const{ if(this)return m_ptLogicPos.GetY2(); else return CLogicInt(-1); } //$$$高速化 // TODO: Remove "this" check
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビューとは関係ない話です。

//$$$高速化 みたいなコメントがあちこちに入っているんです。
なんかの思惑があって入れたコメントなんだと思うんですが、意図が不明なのでヤダなって思ってます。

たとえばこのコメントの場合、「高速化できるよ!」なのか「高速化したよ!(だから実装ビミョーだけど勘弁してね)」なのか不明だと思います。高速化できるよ!だとして、「ここの高速化って必要?」というのは分からないし、高速化したよ!だとして、「なんで高速化したの?」というのが分からないです。

ソリューション全体を \${2,} で正規表現検索すると似たようなものが沢山出てきます。
コメントはおおむね、問題のありそうな箇所に付けられているので問題提起のつもりで残したのかな?と思っています。可能であるならこれらのコメントを一掃したいですが、いつになるやら・・・。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あるいは、「高速化すべき」なのか…
一旦thisチェックを消した際にはコメントごと消したのですが、結局thisチェックを戻したので(しぶしぶ)一緒に復活させました。

@k-takata k-takata merged commit 361364c into sakura-editor:master Aug 18, 2020
@k-takata k-takata deleted the fix-mingw-build branch August 18, 2020 11:29
k-takata added a commit to k-takata/sakura that referenced this pull request Aug 24, 2020
Running the following command in ./sakura_core causes SEGV:
```
sakura.exe StdAfx.h -MTYPE=js -M="Down();Up();Right();Left();ShowFunckey();ShowMiniMap();ShowTab();SelectAll();GoFileEnd();GoFileTop();ShowFunckey();ShowMiniMap();ShowTab();ExitAll();"
```

This fixes it.

Related:
sakura-editor#1363 (comment), sakura-editor#601, sakura-editor#1372
@k-takata k-takata mentioned this pull request Aug 24, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
MinGW MinGW
Projects
None yet
Development

Successfully merging this pull request may close these issues.

C++ の未定義動作によりクラッシュする。(NULL)->MemberFunction();
3 participants