JDimproved / JDim

2ch browser for linux
https://jdimproved.github.io/JDim/
GNU General Public License v2.0
44 stars 11 forks source link

スレビューでマウスホイールを使ってスクロールしたときに異常終了することがある #1390

Closed ma8ma closed 2 months ago

ma8ma commented 2 months ago

スレビューでマウスホイールを使ってスクロールしたときに異常終了することがある

バグの説明

なんかやたら落ちるようになったとエラーメッセージの報告がスレにありました。

/usr/include/c++/9/bits/stl_algo.h:3721: constexpr const _Tp& std::clamp(const _Tp&, const _Tp&, const _Tp&) [with _Tp = double]: Assertion '!(hi < lo)' failed. 中止 (コアダンプ)

https://next2ch.net/test/read.cgi/linux/1654053581/194-195n

試したところスレビューでマウスホイールを使ってスクロールしたときに異常終了することがあったので報告します。

再現の方法

  1. gccにある追加のエラーチェックを有効にしてjdimをビルドします。
    $ meson setup debug -Doptimization=g -Dcpp_args="-Wp,-D_GLIBCXX_ASSERTIONS"
  2. テスト用のキャッシュでjdimを起動します。
    $ JDIM_CACHE=$(pwd)/Test_new ./debug/src/jdim
  3. スレを開きます。
  4. マウスホイールで上へスクロールしてスレの一番上を表示します。
  5. JDimが異常終了してコンソールにエラーメッセージが表示されます。
    /usr/include/c++/13/bits/stl_algo.h:3669: constexpr const _Tp& std::clamp(const _Tp&, const _Tp&, const _Tp&) [with _Tp = double]: Assertion '!(__hi < __lo)' failed.
    中止 (コアダンプ)

snapのedgeチャンネルでも発生しました。

やりたかったこと・期待する結果

マウスホイールで上へスクロールしても異常終了しない。

スクリーンショット

なし

動作環境

masterブランチからビルド

[バージョン] JDim 0.11.0-20240504(git:368d7c54e6)
[ディストリ ] Ubuntu 23.10 (x86_64)
[パッケージ] バイナリ/ソース( <配布元> )
[ DE/WM ] KDE
[ gtkmm  ] 3.24.8
[ glibmm  ] 2.66.6
[ TLS lib ] GnuTLS 3.8.1
[ そ の 他 ] 

snap edgeチャンネル

[バージョン] JDim 0.11.0-20240504(git:368d7c54e6)
[ディストリ ] Ubuntu Core 20 (x86_64)
[パッケージ] Snap (JDimproved project)
[ DE/WM ] KDE
[ gtkmm  ] 3.24.3
[ glibmm  ] 2.64.4
[ TLS lib ] GnuTLS 3.6.13
[オプション ] '--with-pangolayout''--disable-compat-cache-dir'
[ そ の 他 ]

追加の情報

gdbのバックトレース

/usr/include/c++/13/bits/stl_algo.h:3669: constexpr const _Tp& std::clamp(const _Tp&, const _Tp&, const _Tp&) [with _Tp = double]: Assertion '!(__hi < __lo)' failed.

Thread 1 "jdim" received signal SIGABRT, Aborted.
__pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
44      ./nptl/pthread_kill.c: そのようなファイルやディレクトリはありません.
(gdb) bt
#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff60428e6 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff60268b7 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff64e219f in std::__glibcxx_assert_fail(char const*, int, char const*, char const*) () at /lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x000055555594a365 in std::clamp<double> (__val=@0x7fffffffcd18: 5149, __lo=@0x7fffffffcd40: 0, __hi=@0x7fffffffcd60: -51)
    at /usr/include/c++/13/bits/stl_algo.h:3669
#7  0x000055555593f99a in ARTICLE::DrawAreaBase::exec_scroll (this=this@entry=0x555556cedb30) at ../src/article/drawareabase.cpp:3286
(snip)
(gdb) frame 6
#6  0x000055555594a365 in std::clamp<double> (__val=@0x7fffffffcd18: 5149, __lo=@0x7fffffffcd40: 0, __hi=@0x7fffffffcd60: -51)
    at /usr/include/c++/13/bits/stl_algo.h:3669
3669          __glibcxx_assert(!(__hi < __lo));
(gdb) p __hi
$5 = (const double &) @0x7fffffffcd60: -51
(gdb) p __lo
$6 = (const double &) @0x7fffffffcd40: 0
(gdb) frame 7
#7  0x000055555593f99a in ARTICLE::DrawAreaBase::exec_scroll (this=this@entry=0x555556cedb30) at ../src/article/drawareabase.cpp:3286
3286        const int y_new = static_cast<int>(std::clamp<double>( adjust->get_upper() - adjust->get_page_size(), 0, y ));
mtasaka commented 2 months ago

原因は https://github.com/JDimproved/JDim/pull/1389 ですかね。

ma8ma commented 2 months ago

drawareabase.cppの条件がミスしてますね。 😫

https://github.com/JDimproved/JDim/commit/2a3cad6e5b08ee8a7b970865eb1245db73ef0643#diff-76982bc6007b9a280794a2bc21cadad24932195c7ddf30bd8eb87383816007dc

ここのy = hiがマイナスになりstd::clamp()の前提条件!(hi < lo)に反する状態を見落としていました。 std::clamp()では書けないのかな、ちょっと用事があるので夜に見てみます。