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

Spell Check plugin crashes with color-variant-selector emojis #1272

Open
xiota opened this issue Sep 11, 2023 · 19 comments
Open

Spell Check plugin crashes with color-variant-selector emojis #1272

xiota opened this issue Sep 11, 2023 · 19 comments

Comments

@xiota
Copy link
Contributor

xiota commented Sep 11, 2023

Spell Check plugin crashes whenever I paste text containing: πŸ˜€οΈ or πŸ™‚οΈ. I believe they are ZWJ emojis because searching for them in a search engine produces the following in the location bar: πŸ˜€%EF%B8%8F πŸ™‚%EF%B8%8F.

Pasting the non-ZWJ versions, πŸ˜€ and πŸ™‚, does not cause the plugin to crash.

Using Geany/Geany plugins 1.38

Using GTK+ v3.24.38 and GLib v2.78.0

@elextr
Copy link
Member

elextr commented Sep 12, 2023

Spell Check plugin crashes whenever I paste text containing: πŸ˜€οΈ or πŸ™‚οΈ. I believe they are ZWJ emojis

WFM latest git Geany with default backend and en_AU dictionary, perhaps its dependent on your backend and/or language.

Just for the record they are Characters U+1F900 and U+1F982 here followed by VS16 colour variant selector not ZWJ.

Here they show as grinning and smiling rather than the symbols shown in the Unicode chart, but they are recent Unicode IIUC so maybe my font has not caught up yet.

@xiota
Copy link
Contributor Author

xiota commented Sep 12, 2023

Note: Occurs when "Toggle spell check" option is enabled. Disabling the option, no crash.

Same problem with 27af15f with reverts to allow use with Geany 1.38 (5e13096 and 01b19d2). Unable to build for Geany git/1.39 because Lua appears to require another Scintilla update.

Language doesn't seem to matter. I tried en_AU, en_GB, en_US. Font setting for editor and symbol list don't seem to matter. Tried Hack, Noto Sans, Courier Prime.

Installed emoji font is noto-fonts-emoji 20220920.

Don't know how to tell what backend is being used.

Terminal output:

/usr/include/c++/12.1.1/bits/stl_vector.h:1142: std::vector<_Tp, _Alloc>::const_reference std::vector<_Tp, _Alloc>::operator[](size_type) const [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; const_reference = const unsigned char&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.
Aborted (core dumped)

@xiota xiota changed the title Spell Check plugin crashes with ZWJ emojis Spell Check plugin crashes with color-variant-selector emojis Sep 12, 2023
@elextr
Copy link
Member

elextr commented Sep 12, 2023

Note: Occurs when "Toggle spell check" option is enabled. Disabling the option, no crash.

Ok, but still doesn't crash, maybe its been fixed.

Don't know how to tell what backend is being used.

Neither do I, but I think its probably chosen by configure.

Terminal output:

Can you run Geany under GDB and get a backtrace when it crashes (don't forget to continue if needed so you get it all before you paste).

@elextr
Copy link
Member

elextr commented Sep 12, 2023

Unable to build for Geany git/1.39 because Lua appears to require another Scintilla update.

Just disable Geanylua --disable-geanylua

@elextr
Copy link
Member

elextr commented Sep 12, 2023

I just noticed that your terminal output shows it aborts (not crashes) in the C++ library, so thats not Geany code, either the spell checker or Scintilla, but the backtrace will tell.

@xiota
Copy link
Contributor Author

xiota commented Sep 12, 2023

Forgot to mention earlier, using GTK+ v3.24.38 and GLib v2.78.0

geany git/3787677de; without rebuilding plugins, same issue.

Rebuilding geany-plugins 27af15f for geany-git (without reverts), same issue. Following obtained from this build.

Configure output.
aclocal: installing 'build/cache/glib-gettext.m4' from '/usr/share/aclocal/glib-gettext.m4'
aclocal: installing 'build/cache/intltool.m4' from '/usr/share/aclocal/intltool.m4'
aclocal: installing 'build/cache/libtool.m4' from '/usr/share/aclocal/libtool.m4'
aclocal: installing 'build/cache/ltoptions.m4' from '/usr/share/aclocal/ltoptions.m4'
aclocal: installing 'build/cache/ltsugar.m4' from '/usr/share/aclocal/ltsugar.m4'
aclocal: installing 'build/cache/ltversion.m4' from '/usr/share/aclocal/ltversion.m4'
aclocal: installing 'build/cache/lt~obsolete.m4' from '/usr/share/aclocal/lt~obsolete.m4'
aclocal: installing 'build/cache/nls.m4' from '/usr/share/aclocal/nls.m4'
aclocal: installing 'build/cache/pkg.m4' from '/usr/share/aclocal/pkg.m4'
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'build/cache'.
libtoolize: copying file 'build/cache/libtool.m4'
libtoolize: copying file 'build/cache/ltoptions.m4'
libtoolize: copying file 'build/cache/ltsugar.m4'
libtoolize: copying file 'build/cache/ltversion.m4'
libtoolize: copying file 'build/cache/lt~obsolete.m4'
You should update your 'aclocal.m4' by running aclocal.
configure.ac:14: warning: The macro `AC_PROG_CC_C99' is obsolete.
configure.ac:14: You should run autoupdate.
./lib/autoconf/c.m4:1659: AC_PROG_CC_C99 is expanded from...
configure.ac:14: the top level
configure.ac:17: warning: The macro `AC_PROG_LIBTOOL' is obsolete.
configure.ac:17: You should run autoupdate.
build/cache/libtool.m4:100: AC_PROG_LIBTOOL is expanded from...
configure.ac:17: the top level
configure.ac:21: warning: The macro `GLIB_GNU_GETTEXT' is obsolete.
configure.ac:21: You should run autoupdate.
build/cache/glib-gettext.m4:366: GLIB_GNU_GETTEXT is expanded from...
build/cache/glib-gettext.m4:466: AM_GLIB_GNU_GETTEXT is expanded from...
build/i18n.m4:1: GP_I18N is expanded from...
configure.ac:21: the top level
configure.ac:21: warning: The macro `AC_TRY_LINK' is obsolete.
configure.ac:21: You should run autoupdate.
./lib/autoconf/general.m4:2920: AC_TRY_LINK is expanded from...
lib/m4sugar/m4sh.m4:692: _AS_IF_ELSE is expanded from...
lib/m4sugar/m4sh.m4:699: AS_IF is expanded from...
./lib/autoconf/general.m4:2249: AC_CACHE_VAL is expanded from...
./lib/autoconf/general.m4:2270: AC_CACHE_CHECK is expanded from...
build/cache/glib-gettext.m4:51: GLIB_LC_MESSAGES is expanded from...
build/cache/glib-gettext.m4:366: GLIB_GNU_GETTEXT is expanded from...
build/cache/glib-gettext.m4:466: AM_GLIB_GNU_GETTEXT is expanded from...
build/i18n.m4:1: GP_I18N is expanded from...
configure.ac:21: the top level
configure.ac:21: warning: The macro `AC_TRY_LINK' is obsolete.
configure.ac:21: You should run autoupdate.
./lib/autoconf/general.m4:2920: AC_TRY_LINK is expanded from...
lib/m4sugar/m4sh.m4:692: _AS_IF_ELSE is expanded from...
lib/m4sugar/m4sh.m4:699: AS_IF is expanded from...
./lib/autoconf/general.m4:2249: AC_CACHE_VAL is expanded from...
./lib/autoconf/general.m4:2270: AC_CACHE_CHECK is expanded from...
lib/m4sugar/m4sh.m4:699: AS_IF is expanded from...
./lib/autoconf/headers.m4:89: _AC_CHECK_HEADER_COMPILE is expanded from...
./lib/autoconf/headers.m4:56: AC_CHECK_HEADER is expanded from...
build/cache/glib-gettext.m4:150: GLIB_WITH_NLS is expanded from...
build/cache/glib-gettext.m4:366: GLIB_GNU_GETTEXT is expanded from...
build/cache/glib-gettext.m4:466: AM_GLIB_GNU_GETTEXT is expanded from...
build/i18n.m4:1: GP_I18N is expanded from...
configure.ac:21: the top level
configure.ac:21: warning: The macro `AC_TRY_LINK' is obsolete.
configure.ac:21: You should run autoupdate.
./lib/autoconf/general.m4:2920: AC_TRY_LINK is expanded from...
lib/m4sugar/m4sh.m4:699: AS_IF is expanded from...
./lib/autoconf/headers.m4:89: _AC_CHECK_HEADER_COMPILE is expanded from...
./lib/autoconf/headers.m4:56: AC_CHECK_HEADER is expanded from...
build/cache/glib-gettext.m4:150: GLIB_WITH_NLS is expanded from...
build/cache/glib-gettext.m4:366: GLIB_GNU_GETTEXT is expanded from...
build/cache/glib-gettext.m4:466: AM_GLIB_GNU_GETTEXT is expanded from...
build/i18n.m4:1: GP_I18N is expanded from...
configure.ac:21: the top level
configure.ac:21: warning: The macro `AC_OUTPUT_COMMANDS' is obsolete.
configure.ac:21: You should run autoupdate.
./lib/autoconf/status.m4:1025: AC_OUTPUT_COMMANDS is expanded from...
build/cache/glib-gettext.m4:150: GLIB_WITH_NLS is expanded from...
build/cache/glib-gettext.m4:366: GLIB_GNU_GETTEXT is expanded from...
build/cache/glib-gettext.m4:466: AM_GLIB_GNU_GETTEXT is expanded from...
build/i18n.m4:1: GP_I18N is expanded from...
configure.ac:21: the top level
configure.ac:24: warning: The macro `AC_HELP_STRING' is obsolete.
configure.ac:24: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
build/geany.m4:1: _GP_GEANY_LIBDIR is expanded from...
build/geany.m4:16: GP_GEANY_PKG_CONFIG_PATH_PUSH is expanded from...
build/geany.m4:31: GP_CHECK_GEANY is expanded from...
configure.ac:24: the top level
configure.ac:46: warning: The macro `AC_HELP_STRING' is obsolete.
configure.ac:46: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
build/geanylua.m4:1: GP_CHECK_GEANYLUA is expanded from...
configure.ac:46: the top level
configure.ac:51: warning: The macro `AC_HELP_STRING' is obsolete.
configure.ac:51: You should run autoupdate.
./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from...
build/geanyvc.m4:1: GP_CHECK_GEANYVC is expanded from...
configure.ac:51: the top level
configure.ac:12: installing './compile'
configure.ac:17: installing './config.guess'
configure.ac:17: installing './config.sub'
configure.ac:4: installing './install-sh'
configure.ac:4: installing './missing'
addons/src/Makefile.am: installing './depcomp'
parallel-tests: installing './test-driver'
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether UID '1000' is supported by ustar format... yes
checking whether GID '1000' is supported by ustar format... yes
checking how to create a ustar tar archive... gnutar
checking whether make supports nested variables... (cached) yes
checking whether make supports the include directive... yes (GNU style)
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed
checking whether gcc understands -c and -o together... yes
checking dependency style of gcc... gcc3
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for wchar.h... yes
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking whether _XOPEN_SOURCE should be defined... no
checking for gcc... (cached) gcc
checking whether the compiler supports GNU C... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to enable C11 features... (cached) none needed
checking whether gcc understands -c and -o together... (cached) yes
checking dependency style of gcc... (cached) gcc3
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking how to print strings... printf
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for fgrep... /usr/bin/grep -F
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
checking the name lister (/usr/bin/nm -B) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop
checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /usr/bin/ld option to reload object files... -r
checking for file... file
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for dlltool... no
checking how to associate runtime and link libraries... printf %s\n
checking for ar... ar
checking for archiver @FILE support... @
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for sysroot... no
checking for a working dd... /usr/bin/dd
checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1
checking for mt... no
checking if : is a manifest tool... no
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... yes
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no
checking whether NLS is requested... yes
checking for intltool >= 0.35.0... 0.51.0 found
checking for intltool-update... /usr/bin/intltool-update
checking for intltool-merge... /usr/bin/intltool-merge
checking for intltool-extract... /usr/bin/intltool-extract
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
checking for perl... /usr/bin/perl
checking for perl >= 5.8.1... 5.38.0
checking for XML::Parser... ok
checking for locale.h... yes
checking for LC_MESSAGES... yes
checking for CFPreferencesCopyAppValue... no
checking for CFLocaleCopyCurrent... no
checking for libintl.h... yes
checking for ngettext in libc... yes
checking for dgettext in libc... yes
checking for bind_textdomain_codeset... yes
checking for msgfmt... (cached) /usr/bin/msgfmt
checking for dcgettext... yes
checking if msgfmt accepts -c... yes
checking for gmsgfmt... (cached) /usr/bin/msgfmt
checking for xgettext... (cached) /usr/bin/xgettext
checking for catalogs to be installed...  be ca da de el es fr gl it ja kk nl pt pt_BR ru tr uk zh_CN
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for GEANY... yes
checking for CHECK... no
checking for cppcheck... /usr/bin/cppcheck
checking for the C compiler flag to treat warnings as errors... -Werror
checking whether the C compiler understands -Wall... yes
checking whether the C compiler understands -Wimplicit-function-declaration... yes
checking whether the C compiler understands -Wmissing-parameter-type... yes
checking whether the C compiler understands -Wold-style-declaration... yes
checking whether the C compiler understands -Wpointer-arith... yes
checking whether the C compiler understands -Wshadow... yes
checking whether the C compiler understands -Wundef... yes
checking whether the C compiler understands -Wwrite-strings... yes
checking whether the linker understands -Wl,-z,defs... yes
checking for AUTOCLOSE... yes
checking for AUTOMARK... yes
checking for COMMANDER... yes
checking for UTILSLIB... yes
checking for VTE... yes
checking for util.h... no
checking for pty.h... yes
checking for libutil.h... no
checking for DEFINEFORMAT... yes
checking for GEANYGENDOC... yes
checking for rst2html... no
checking for LUA... yes
checking for GMODULE... yes
checking for GTKSPELL... yes
checking for gpgrt-config... /usr/bin/gpgrt-config
configure: Use gpgrt-config with /usr/lib as gpg-error-config
configure: Use gpgrt-config as gpgme-config
checking for GPGME - version >= 0.4.2... yes
checking for fdopen... yes
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking for GENIUSPASTE... yes
checking for GITCHANGEBAR... yes
checking for library containing mkd_compile... -lmarkdown
checking for mkdio.h... yes
checking for MARKDOWN... yes
checking for GLIB... yes
checking for LIBXML... yes
checking for VTE... yes
checking for UTILSLIB... yes
checking for util.h... (cached) no
checking for pty.h... (cached) yes
checking for libutil.h... (cached) no
checking for ENCHANT_2_2... yes
checking for ENCHANT... yes
checking for creat... yes
checking for UPDATECHECKER... yes
checking for glib-mkenums... /usr/bin/glib-mkenums
checking whether the GTK version in use is compatible with plugin webhelper... yes
checking for WEBHELPER... yes
checking for WORKBENCH... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating addons/Makefile
config.status: creating addons/src/Makefile
config.status: creating autoclose/Makefile
config.status: creating autoclose/src/Makefile
config.status: creating automark/Makefile
config.status: creating automark/src/Makefile
config.status: creating codenav/Makefile
config.status: creating codenav/src/Makefile
config.status: creating commander/Makefile
config.status: creating commander/src/Makefile
config.status: creating debugger/Makefile
config.status: creating debugger/src/Makefile
config.status: creating debugger/img/Makefile
config.status: creating defineformat/Makefile
config.status: creating defineformat/src/Makefile
config.status: creating geanyctags/Makefile
config.status: creating geanyctags/src/Makefile
config.status: creating geanydoc/Makefile
config.status: creating geanydoc/src/Makefile
config.status: creating geanydoc/tests/Makefile
config.status: creating geanyextrasel/Makefile
config.status: creating geanyextrasel/src/Makefile
config.status: creating geanygendoc/Makefile
config.status: creating geanygendoc/src/Makefile
config.status: creating geanygendoc/data/Makefile
config.status: creating geanygendoc/data/filetypes/Makefile
config.status: creating geanygendoc/docs/Makefile
config.status: creating geanyinsertnum/Makefile
config.status: creating geanyinsertnum/src/Makefile
config.status: creating latex/Makefile
config.status: creating latex/doc/Makefile
config.status: creating latex/src/Makefile
config.status: creating geanylua/examples/edit/Makefile
config.status: creating geanylua/examples/scripting/Makefile
config.status: creating geanylua/examples/info/Makefile
config.status: creating geanylua/examples/work/Makefile
config.status: creating geanylua/examples/dialogs/Makefile
config.status: creating geanylua/examples/Makefile
config.status: creating geanylua/docs/Makefile
config.status: creating geanylua/Makefile
config.status: creating geanymacro/Makefile
config.status: creating geanymacro/src/Makefile
config.status: creating geanyminiscript/Makefile
config.status: creating geanyminiscript/src/Makefile
config.status: creating geanynumberedbookmarks/Makefile
config.status: creating geanynumberedbookmarks/src/Makefile
config.status: creating geanyprj/Makefile
config.status: creating geanyprj/src/Makefile
config.status: creating geanyvc/Makefile
config.status: creating geanyvc/src/Makefile
config.status: creating geanypg/Makefile
config.status: creating geanypg/src/Makefile
config.status: creating geniuspaste/Makefile
config.status: creating geniuspaste/data/Makefile
config.status: creating geniuspaste/src/Makefile
config.status: creating git-changebar/Makefile
config.status: creating git-changebar/data/Makefile
config.status: creating git-changebar/src/Makefile
config.status: creating keyrecord/Makefile
config.status: creating keyrecord/src/Makefile
config.status: creating lineoperations/Makefile
config.status: creating lineoperations/src/Makefile
config.status: creating lipsum/Makefile
config.status: creating lipsum/src/Makefile
config.status: creating markdown/Makefile
config.status: creating markdown/src/Makefile
config.status: creating markdown/docs/Makefile
config.status: creating markdown/peg-markdown/Makefile
config.status: creating markdown/peg-markdown/peg-0.1.9/Makefile
config.status: creating overview/Makefile
config.status: creating overview/data/Makefile
config.status: creating overview/overview/Makefile
config.status: creating pairtaghighlighter/Makefile
config.status: creating pairtaghighlighter/src/Makefile
config.status: creating pohelper/Makefile
config.status: creating pohelper/data/Makefile
config.status: creating pohelper/src/Makefile
config.status: creating pretty-printer/Makefile
config.status: creating pretty-printer/src/Makefile
config.status: creating projectorganizer/Makefile
config.status: creating projectorganizer/src/Makefile
config.status: creating scope/Makefile
config.status: creating scope/data/Makefile
config.status: creating scope/docs/Makefile
config.status: creating scope/src/Makefile
config.status: creating sendmail/Makefile
config.status: creating sendmail/src/Makefile
config.status: creating shiftcolumn/Makefile
config.status: creating shiftcolumn/src/Makefile
config.status: creating spellcheck/Makefile
config.status: creating spellcheck/src/Makefile
config.status: creating treebrowser/Makefile
config.status: creating treebrowser/src/Makefile
config.status: creating tableconvert/Makefile
config.status: creating tableconvert/src/Makefile
config.status: creating updatechecker/Makefile
config.status: creating updatechecker/src/Makefile
config.status: creating vimode/Makefile
config.status: creating vimode/src/Makefile
config.status: creating webhelper/Makefile
config.status: creating webhelper/src/Makefile
config.status: creating workbench/Makefile
config.status: creating workbench/src/Makefile
config.status: creating xmlsnippets/Makefile
config.status: creating xmlsnippets/src/Makefile
config.status: creating utils/Makefile
config.status: creating utils/src/Makefile
config.status: creating Makefile
config.status: creating po/Makefile.in
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
config.status: executing default-1 commands
config.status: executing po/stamp-it commands

geany-plugins-1.39

  Build Environment:
    Geany version:                1.39 (GTK3)
    Install prefix:               /usr
    Datadir:                      /usr/share/geany-plugins
    Libdir:                       /usr/lib/geany-plugins
    Docdir:                       /usr/share/doc/geany-plugins
    Plugins path:                 /usr/lib/geany

  Build Features:
    Unit tests:                   no
    Static code checking:         yes
    Extra C compiler warnings:    yes
    Extra linker options:         yes

  Plugins:
    Addons:                       yes
    Autoclose:                    yes
    Automark:                     yes
    CodeNav:                      yes
    Commander:                    yes
    Debugger:                     yes
    Defineformat:                 yes
    GeanyCtags:                   yes
    GeanyDoc:                     yes
    GeanyExtraSel:                yes
    GeanyGenDoc:                  yes
    GeanyInsertNum:               yes
    LaTeX:                        yes
    GeanyLua:                     yes
    GeanyMacro:                   yes
    GeanyMiniScript:              yes
    GeanyNumberedBookmarks:       yes
    GeanyPrj:                     yes
    GeanyVC:                      yes
    GeanyPG:                      yes
    GeniusPaste:                  yes
    GitChangeBar:                 yes
    Keyrecord:                    yes
    LineOperations:               yes
    Lipsum:                       yes
    Markdown:                     yes
    Overview:                     yes
    PairTagHighlighter:           yes
    PoHelper:                     yes
    Pretty Printer:               yes
    ProjectOrganizer:             yes
    Scope:                        yes
    Sendmail:                     yes
    ShiftColumn:                  yes
    Spellcheck:                   yes
    TreeBrowser:                  yes
    Tableconvert:                 yes
    Updatechecker:                yes
    Vimode:                       yes
    WebHelper:                    yes
    Workbench:                    yes
    XMLSnippets:                  yes

  Features:
    GeanyVC GtkSpell support:     yes
    Markdown library:             libmarkdown
    Utility library:              yes
    Utility library VTE support:  yes
gdb backtrace
/usr/include/c++/13.2.1/bits/stl_vector.h:1125: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; reference = unsigned char&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.

Thread 1 "geany" received signal SIGABRT, Aborted.
__pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
44            return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0;
(gdb) bt
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
#1  0x00007ffff768e8a3 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78
#2  0x00007ffff763e668 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3  0x00007ffff76264b8 in __GI_abort () at abort.c:79
#4  0x00007ffff66dd3b2 in std::__glibcxx_assert_fail(char const*, int, char const*, char const*)
    (file=<optimized out>, line=<optimized out>, function=<optimized out>, condition=<optimized out>)
    at /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/debug.cc:61
#5  0x00007ffff7bc2fe5 in  () at /usr/lib/libgeany.so.0
#6  0x00007ffff7c31edb in  () at /usr/lib/libgeany.so.0
#7  0x00007ffff7c2b924 in  () at /usr/lib/libgeany.so.0
#8  0x00007ffff7c2bdf1 in  () at /usr/lib/libgeany.so.0
#9  0x00007ffff7c2d14a in  () at /usr/lib/libgeany.so.0
#10 0x00007ffff7c2d8f5 in  () at /usr/lib/libgeany.so.0
#11 0x00007ffff7c0af7c in  () at /usr/lib/libgeany.so.0
#12 0x00007ffff7bca862 in  () at /usr/lib/libgeany.so.0
#18 0x00007ffff6bf8d34 in <emit signal 'draw' on instance 0x5555566a2220 [GtkDrawingArea]>
    (instance=instance@entry=0x5555566a2220, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3675
    #13 0x00007ffff6e85039 in _gtk_marshal_BOOLEAN__BOXEDv
    (closure=0x5555566a2380, return_value=0x7fffffffbc20, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555555670cc0) at gtk/gtkmarshalers.c:130
    #14 0x00007ffff7135e9c in gtk_widget_draw_marshallerv
    (closure=0x5555566a2380, return_value=0x7fffffffbc20, instance=0x5555566a2220, args=0x7fffffffbd00, marshal_data=0x0, n_params=1, param_types=0x555555670cc0) at ../gtk/gtk/gtkwidget.c:979
    #15 0x00007ffff6bf8b73 in _g_closure_invoke_va
    (param_types=0x555555670cc0, n_params=<optimized out>, args=0x7fffffffbd00, instance=0x5555566a2220, return_value=0x7fffffffbc20, closure=0x5555566a2380) at ../glib/gobject/gclosure.c:895
    #16 signal_emit_valist_unlocked
    (instance=instance@entry=0x5555566a2220, signal_id=signal_id@entry=71, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffbd00)
    at ../glib/gobject/gsignal.c:3516
    #17 0x00007ffff6bf8c77 in g_signal_emit_valist
    (instance=0x5555566a2220, signal_id=71, detail=0, var_args=var_args@entry=0x7fffffffbd00) at ../glib/gobject/gsignal.c:3355
#19 0x00007ffff71484d3 in gtk_widget_draw_internal
    (widget=0x5555566a2220 [GtkDrawingArea], cr=0x55555676a410, clip_to_size=<optimized out>) at ../gtk/gtk/gtkwidget.c:7077
#20 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=<optimized out>, child=0x5555566a2220 [GtkDrawingArea], cr=0x55555676a410) at ../gtk/gtk/gtkcontainer.c:3854
#21 0x00007ffff7bca0cf in  () at /usr/lib/libgeany.so.0
#22 0x00007ffff6e8c34d in _gtk_marshal_BOOLEAN__BOXED
    (closure=0x555555670e20, return_value=0x7fffffffc090, param_values=0x7fffffffc120, marshal_data=<optimized out>, invocation_hint=<optimized out>, n_param_values=<optimized out>) at gtk/gtkmarshalers.c:84
#23 0x00007ffff7135db3 in _gtk_marshal_BOOLEAN__BOXED
    (marshal_data=0x7ffff7bca0f0, invocation_hint=<optimized out>, param_values=0x7fffffffc120, n_param_values=2, return_value=0x7fffffffc0--Type <RET> for more, q to quit, c to continue without paging--c
90, closure=0x555555670e20) at gtk/gtkmarshalers.c:70
#24 gtk_widget_draw_marshaller
    (closure=0x555555670e20, return_value=0x7fffffffc090, n_param_values=2, param_values=0x7fffffffc120, invocation_hint=<optimized out>, marshal_data=0x7ffff7bca0f0) at ../gtk/gtk/gtkwidget.c:951
#25 0x00007ffff6bd96c0 in g_closure_invoke
    (closure=0x555555670e20, return_value=0x7fffffffc090, n_param_values=2, param_values=0x7fffffffc120, invocation_hint=0x7fffffffc070)
    at ../glib/gobject/gclosure.c:832
#26 0x00007ffff6c080ea in signal_emit_unlocked_R.isra.0
    (node=node@entry=0x7fffffffc210, detail=detail@entry=0, instance=instance@entry=0x55555668e410, emission_return=emission_return@entry=0x7fffffffc290, instance_and_params=instance_and_params@entry=0x7fffffffc120) at ../glib/gobject/gsignal.c:4020
#27 0x00007ffff6bf8335 in signal_emit_valist_unlocked
    (instance=instance@entry=0x55555668e410, signal_id=signal_id@entry=71, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffc370)
    at ../glib/gobject/gsignal.c:3625
#28 0x00007ffff6bf8c77 in g_signal_emit_valist (instance=0x55555668e410, signal_id=71, detail=0, var_args=var_args@entry=0x7fffffffc370)
    at ../glib/gobject/gsignal.c:3355
#29 0x00007ffff6bf8d34 in g_signal_emit (instance=instance@entry=0x55555668e410, signal_id=<optimized out>, detail=detail@entry=0)
    at ../glib/gobject/gsignal.c:3675
#30 0x00007ffff71484d3 in gtk_widget_draw_internal
    (widget=0x55555668e410 [ScintillaObject], cr=0x55555676a410, clip_to_size=<optimized out>) at ../gtk/gtk/gtkwidget.c:7077
#31 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=container@entry=0x5555566b1850 [GtkBox], child=0x55555668e410 [ScintillaObject], cr=cr@entry=0x55555676a410)
    at ../gtk/gtk/gtkcontainer.c:3854
#32 0x00007ffff6f0a576 in gtk_container_draw (widget=0x5555566b1850 [GtkBox], cr=0x55555676a410) at ../gtk/gtk/gtkcontainer.c:3674
#33 0x00007ffff6eb5f01 in gtk_box_draw_contents
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, unused=0x0) at ../gtk/gtk/gtkbox.c:453
#34 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#35 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x5555566ae510 [GtkCssCustomGadget], cr=0x55555676a410)
    at ../gtk/gtk/gtkcssgadget.c:885
#36 0x00007ffff6eb6475 in gtk_box_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkbox.c:462
#37 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x5555566b1850 [GtkBox], cr=0x55555676a410, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#38 0x00007ffff6f0a465 in gtk_container_propagate_draw (container=<optimized out>, child=0x5555566b1850 [GtkBox], cr=0x55555676a410)
    at ../gtk/gtk/gtkcontainer.c:3854
#39 0x00007ffff70159a6 in gtk_notebook_draw_stack
    (gadget=<optimized out>, cr=0x55555676a410, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, unused=0x0) at ../gtk/gtk/gtknotebook.c:2545
#40 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#41 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c27030 [GtkCssCustomGadget], cr=0x55555676a410)
    at ../gtk/gtk/gtkcssgadget.c:885
#42 0x00007ffff6ebf0da in gtk_box_gadget_draw
    (gadget=<optimized out>, cr=0x55555676a410, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkboxgadget.c:512
#43 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c26f30 [GtkBoxGadget], cr=0x55555676a410) at ../gtk/gtk/gtkcssgadget.c:885
#44 0x00007ffff70159fc in gtk_notebook_draw (widget=<optimized out>, cr=0x55555676a410) at ../gtk/gtk/gtknotebook.c:2560
#45 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555c27a00 [GtkNotebook], cr=0x55555676a410, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#46 0x00007ffff6f0a465 in gtk_container_propagate_draw (container=<optimized out>, child=0x555555c27a00 [GtkNotebook], cr=0x55555676a410)
    at ../gtk/gtk/gtkcontainer.c:3854
#47 0x00007ffff70278c9 in gtk_paned_render
    (gadget=<optimized out>, cr=0x55555676a410, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, data=0x0) at ../gtk/gtk/gtkpaned.c:1818
#48 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#49 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c092c0 [GtkCssCustomGadget], cr=0x55555676a410)
    at ../gtk/gtk/gtkcssgadget.c:885
#50 0x00007ffff701f885 in gtk_paned_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkpaned.c:1782
#51 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555c08390 [GtkHPaned], cr=0x55555676a410, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#52 0x00007ffff6f0a465 in gtk_container_propagate_draw (container=<optimized out>, child=0x555555c08390 [GtkHPaned], cr=0x55555676a410)
    at ../gtk/gtk/gtkcontainer.c:3854
#53 0x00007ffff70278c9 in gtk_paned_render
    (gadget=<optimized out>, cr=0x55555676a410, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, data=0x0) at ../gtk/gtk/gtkpaned.c:1818
#54 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#55 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c06a70 [GtkCssCustomGadget], cr=0x55555676a410)
    at ../gtk/gtk/gtkcssgadget.c:885
#56 0x00007ffff701f885 in gtk_paned_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkpaned.c:1782
#57 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555c067a0 [GtkVPaned], cr=0x55555676a410, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#58 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=container@entry=0x555555b3fff0 [GtkVBox], child=0x555555c067a0 [GtkVPaned], cr=cr@entry=0x55555676a410)
    at ../gtk/gtk/gtkcontainer.c:3854
#59 0x00007ffff6f0a576 in gtk_container_draw (widget=0x555555b3fff0 [GtkVBox], cr=0x55555676a410) at ../gtk/gtk/gtkcontainer.c:3674
#60 0x00007ffff6eb5f01 in gtk_box_draw_contents
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, unused=0x0) at ../gtk/gtk/gtkbox.c:453
#61 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#62 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555b40160 [GtkCssCustomGadget], cr=0x55555676a410)
    at ../gtk/gtk/gtkcssgadget.c:885
#63 0x00007ffff6eb6475 in gtk_box_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkbox.c:462
#64 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555b3fff0 [GtkVBox], cr=0x55555676a410, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#65 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=container@entry=0x555555b3d970 [GtkWindow], child=0x555555b3fff0 [GtkVBox], cr=cr@entry=0x55555676a410)
    at ../gtk/gtk/gtkcontainer.c:3854
#66 0x00007ffff6f0a576 in gtk_container_draw (widget=0x555555b3d970 [GtkWindow], cr=0x55555676a410) at ../gtk/gtk/gtkcontainer.c:3674
#67 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555b3d970 [GtkWindow], cr=0x55555676a410, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#68 0x00007ffff71532e3 in gtk_widget_render
    (widget=0x555555b3d970 [GtkWindow], window=0x555556777800 [GdkX11Window], region=<optimized out>) at ../gtk/gtk/gtkwidget.c:17610
#69 0x00007ffff6fef91b in gtk_main_do_event (event=0x7fffffffd0d0) at ../gtk/gtk/gtkmain.c:1844
#70 gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1691
#71 0x00007ffff7ebdb87 in _gdk_event_emit (event=0x7fffffffd0d0) at ../gtk/gdk/gdkevents.c:73
#72 _gdk_event_emit (event=0x7fffffffd0d0) at ../gtk/gdk/gdkevents.c:67
#73 0x00007ffff7ecf982 in _gdk_window_process_updates_recurse_helper (window=0x555556777800 [GdkX11Window], expose_region=<optimized out>)
    at ../gtk/gdk/gdkwindow.c:3874
#74 0x00007ffff7ed3fd8 in gdk_window_process_updates_internal (window=0x555556777800 [GdkX11Window]) at ../gtk/gdk/gdkwindow.c:4020
#75 0x00007ffff7ed41f5 in gdk_window_process_updates_with_mode (recurse_mode=<optimized out>, window=<optimized out>)
    at ../gtk/gdk/gdkwindow.c:4215
#76 gdk_window_process_updates_with_mode (window=<optimized out>, recurse_mode=<optimized out>) at ../gtk/gdk/gdkwindow.c:4186
#80 0x00007ffff6bf8d34 in <emit signal 'paint' on instance 0x555556777ac0 [GdkFrameClockIdle]>
    (instance=instance@entry=0x555556777ac0, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3675
    #77 0x00007ffff6bf8b73 in _g_closure_invoke_va
    (param_types=0x0, n_params=<optimized out>, args=0x7fffffffd400, instance=0x555556777ac0, return_value=0x0, closure=0x555556777b60)
    at ../glib/gobject/gclosure.c:895
    #78 signal_emit_valist_unlocked
    (instance=instance@entry=0x555556777ac0, signal_id=signal_id@entry=32, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd400)
    at ../glib/gobject/gsignal.c:3516
    #79 0x00007ffff6bf8c77 in g_signal_emit_valist
    (instance=0x555556777ac0, signal_id=32, detail=0, var_args=var_args@entry=0x7fffffffd400) at ../glib/gobject/gsignal.c:3355
#81 0x00007ffff7ecae69 in _gdk_frame_clock_emit_paint (frame_clock=0x555556777ac0 [GdkFrameClockIdle]) at ../gtk/gdk/gdkframeclock.c:657
#82 gdk_frame_clock_paint_idle (data=0x555556777ac0) at ../gtk/gdk/gdkframeclockidle.c:597
#83 0x00007ffff7eb76ae in gdk_threads_dispatch (data=0x555556866ab0, data@entry=<error reading variable: value has been optimized out>)
    at ../gtk/gdk/gdk.c:769
#84 0x00007ffff6ad439e in g_timeout_dispatch (source=0x55555671d960, callback=<optimized out>, user_data=<optimized out>)
    at ../glib/glib/gmain.c:5121
#85 0x00007ffff6ad2f19 in g_main_dispatch (context=0x555555640b40) at ../glib/glib/gmain.c:3476
#86 0x00007ffff6b312b7 in g_main_context_dispatch_unlocked (context=0x555555640b40) at ../glib/glib/gmain.c:4284
#87 g_main_context_iterate_unlocked.isra.0 (context=0x555555640b40, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
    at ../glib/glib/gmain.c:4349
#88 0x00007ffff6ad3b47 in g_main_loop_run (loop=0x555555c2eca0) at ../glib/glib/gmain.c:4551
#89 0x00007ffff6fecf6f in gtk_main () at ../gtk/gtk/gtkmain.c:1329
#90 0x00007ffff7a92155 in main_lib () at /usr/lib/libgeany.so.0
#91 0x00007ffff7627cd0 in __libc_start_call_main (main=main@entry=0x555555555020, argc=argc@entry=1, argv=argv@entry=0x7fffffffd848)
    at ../sysdeps/nptl/libc_start_call_main.h:58
#92 0x00007ffff7627d8a in __libc_start_main_impl
    (main=0x555555555020, argc=1, argv=0x7fffffffd848, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd838) at ../csu/libc-start.c:360
#93 0x0000555555555055 in  ()
(gdb)

@elextr
Copy link
Member

elextr commented Sep 12, 2023

I am using the same git version of Geany and plugins as you.

Hmmm, dunno why there are no symbols for libgeany in the backtrace, I thought it defaulted to a debug build that has symbols, are you absolutely sure you ran the git built version, not a system installed version (which usually don't have symbols)?

The problem is in the C++ library called from libgeany, which means from Scintilla since Geany is C not C++, but without symbols its not possible to trace where and why it goes wrong.

But its less likely to be anything specific about the spell checker except it triggers something in Scintilla.

@xiota
Copy link
Contributor Author

xiota commented Sep 12, 2023

I built and installed geany as a package, but looking through the PKGBUILD, don't see anything turning off debug.

Tried rebuilding with debug package. Is this what you need?
/usr/include/c++/13.2.1/bits/stl_vector.h:1125: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; reference = unsigned char&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.

Thread 1 "geany" received signal SIGABRT, Aborted.
__pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
44            return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0;
(gdb) bt
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
#1  0x00007ffff768e8a3 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78
#2  0x00007ffff763e668 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3  0x00007ffff76264b8 in __GI_abort () at abort.c:79
#4  0x00007ffff66dd3b2 in std::__glibcxx_assert_fail(char const*, int, char const*, char const*)
    (file=file@entry=0x7ffff7d1b3c0 "/usr/include/c++/13.2.1/bits/stl_vector.h", line=line@entry=1125, function=function@entry=0x7ffff7d1b2e8 "std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; reference = unsigned char&; size_type = long unsi"..., condition=condition@entry=0x7ffff7d0ab55 "__n < this->size()")
    at /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/debug.cc:61
#5  0x00007ffff7bc2fe5 in std::vector<unsigned char, std::allocator<unsigned char> >::operator[](unsigned long)
    (this=0x7fffffffa9c0, __n=0) at /usr/include/c++/13.2.1/bits/stl_vector.h:1123
#6  std::vector<unsigned char, std::allocator<unsigned char> >::operator[](unsigned long) (__n=<optimized out>, this=<optimized out>)
    at /usr/include/c++/13.2.1/bits/stl_vector.h:1123
#7  Scintilla::SurfaceImpl::DrawRGBAImage(Scintilla::Internal::PRectangle, int, int, unsigned char const*)
    (this=this@entry=0x555555ff2ed0, rc=..., width=0, height=<optimized out>, pixelsImage=<optimized out>) at gtk/PlatGTK.cxx:623
#8  0x00007ffff7c31edb in Scintilla::Internal::Indicator::Draw(Scintilla::Internal::Surface*, Scintilla::Internal::PRectangle const&, Scintilla::Internal::PRectangle const&, Scintilla::Internal::PRectangle const&, Scintilla::Internal::Indicator::State, int) const
    (this=<optimized out>, surface=0x555555ff2ed0, rc=<optimized out>, rcLine=<optimized out>, rcCharacter=..., state=<optimized out>, value=1) at src/XPM.h:52
#9  0x00007ffff7c2b924 in DrawIndicator(int, Sci::Position, Sci::Position, Scintilla::Internal::Surface*, Scintilla::Internal::ViewStyle const&, Scintilla::Internal::LineLayout const*, int, Scintilla::Internal::PRectangle, Sci::Position, int, Scintilla::Internal::Indicator::State, int, bool, int)
    (indicNum=0, startPos=startPos@entry=4, endPos=endPos@entry=7, surface=surface@entry=0x555555ff2ed0, vsDraw=..., ll=ll@entry=0x5555567dd0d0, xStart=83, rcLine=..., secondCharacter=7, subLine=0, state=Scintilla::Internal::Indicator::State::normal, value=1, bidiEnabled=false, tabWidthMinimumPixels=2) at src/EditView.cxx:1197
#10 0x00007ffff7c2bdf1 in DrawIndicators(Scintilla::Internal::Surface*, Scintilla::Internal::EditModel const&, Scintilla::Internal::ViewStyle const&, Scintilla::Internal::LineLayout const*, Sci::Line, int, Scintilla::Internal::PRectangle, int, Sci::Position, bool, int)
    (surface=surface@entry=0x555555ff2ed0, model=..., vsDraw=..., ll=ll@entry=0x5555567dd0d0, line=line@entry=0, xStart=xStart@entry=83, rcLine=..., subLine=0, lineEnd=7, under=false, tabWidthMinimumPixels=2) at src/EditView.cxx:1222
#11 0x00007ffff7c2d14a in Scintilla::Internal::EditView::DrawLine(Scintilla::Internal::Surface*, Scintilla::Internal::EditModel const&, Scintilla::Internal::ViewStyle const&, Scintilla::Internal::LineLayout const*, long, long, int, Scintilla::Internal::PRectangle, int, Scintilla::Internal::DrawPhase)
    (this=this@entry=0x555556067c20, surface=surface@entry=0x555555ff2ed0, model=..., vsDraw=..., ll=ll@entry=0x5555567dd0d0, line=line@entry=0, lineVisible=0, xStart=83, rcLine=..., subLine=0, phase=510) at src/EditView.cxx:2285
#12 0x00007ffff7c2d8f5 in Scintilla::Internal::EditView::PaintText(Scintilla::Internal::Surface*, Scintilla::Internal::EditModel const&, Scintilla::Internal::PRectangle, Scintilla::Internal::PRectangle, Scintilla::Internal::ViewStyle const&)
    (this=this@entry=0x555556067c20, surfaceWindow=surfaceWindow@entry=0x5555569b2970, model=..., rcArea=..., rcClient=..., vsDraw=...)
    at src/EditView.cxx:2465
#13 0x00007ffff7c0af7c in Scintilla::Internal::Editor::Paint(Scintilla::Internal::Surface*, Scintilla::Internal::PRectangle)
    (this=this@entry=0x555556067590, surfaceWindow=0x5555569b2970, rcArea=...) at src/Editor.cxx:1814
c
#14 0x00007ffff7bca862 in Scintilla::Internal::ScintillaGTK::DrawTextThis(_cairo*) (this=0x555556067590, cr=0x55555696e300)
--Type <RET> for more, q to quit, c to continue without paging--c
    at /usr/include/c++/13.2.1/bits/unique_ptr.h:199
#20 0x00007ffff6bf8d34 in <emit signal 'draw' on instance 0x55555678b970 [GtkDrawingArea]>
    (instance=instance@entry=0x55555678b970, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3675
    #15 0x00007ffff6e85039 in _gtk_marshal_BOOLEAN__BOXEDv
    (closure=0x55555678bad0, return_value=0x7fffffffb6b0, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555555671e90) at gtk/gtkmarshalers.c:130
    #16 0x00007ffff7135e9c in gtk_widget_draw_marshallerv
    (closure=0x55555678bad0, return_value=0x7fffffffb6b0, instance=0x55555678b970, args=0x7fffffffb790, marshal_data=0x0, n_params=1, param_types=0x555555671e90) at ../gtk/gtk/gtkwidget.c:979
    #17 0x00007ffff6bf8b73 in _g_closure_invoke_va
    (param_types=0x555555671e90, n_params=<optimized out>, args=0x7fffffffb790, instance=0x55555678b970, return_value=0x7fffffffb6b0, closure=0x55555678bad0) at ../glib/gobject/gclosure.c:895
    #18 signal_emit_valist_unlocked
    (instance=instance@entry=0x55555678b970, signal_id=signal_id@entry=71, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffb790)
    at ../glib/gobject/gsignal.c:3516
    #19 0x00007ffff6bf8c77 in g_signal_emit_valist
    (instance=0x55555678b970, signal_id=71, detail=0, var_args=var_args@entry=0x7fffffffb790) at ../glib/gobject/gsignal.c:3355
#21 0x00007ffff71484d3 in gtk_widget_draw_internal
    (widget=0x55555678b970 [GtkDrawingArea], cr=0x55555696e300, clip_to_size=<optimized out>) at ../gtk/gtk/gtkwidget.c:7077
#22 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=<optimized out>, child=0x55555678b970 [GtkDrawingArea], cr=0x55555696e300) at ../gtk/gtk/gtkcontainer.c:3854
#23 0x00007ffff7bca0cf in Scintilla::Internal::ScintillaGTK::DrawThis(_cairo*) (this=0x555556067590, cr=0x55555696e300)
    at ./src/Platform.h:277
#24 0x00007ffff6e8c34d in _gtk_marshal_BOOLEAN__BOXED
    (closure=0x555555671ff0, return_value=0x7fffffffbb20, param_values=0x7fffffffbbb0, marshal_data=<optimized out>, invocation_hint=<optimized out>, n_param_values=<optimized out>) at gtk/gtkmarshalers.c:84
#25 0x00007ffff7135db3 in _gtk_marshal_BOOLEAN__BOXED
    (marshal_data=0x7ffff7bca0f0 <Scintilla::Internal::ScintillaGTK::DrawMain(_GtkWidget*, _cairo*)>, invocation_hint=<optimized out>, param_values=0x7fffffffbbb0, n_param_values=2, return_value=0x7fffffffbb20, closure=0x555555671ff0) at gtk/gtkmarshalers.c:70
#26 gtk_widget_draw_marshaller
    (closure=0x555555671ff0, return_value=0x7fffffffbb20, n_param_values=2, param_values=0x7fffffffbbb0, invocation_hint=<optimized out>, marshal_data=0x7ffff7bca0f0 <Scintilla::Internal::ScintillaGTK::DrawMain(_GtkWidget*, _cairo*)>) at ../gtk/gtk/gtkwidget.c:951
#27 0x00007ffff6bd9626 in g_closure_invoke
    (closure=0x555555671ff0, return_value=0x7fffffffbb20, n_param_values=2, param_values=0x7fffffffbbb0, invocation_hint=0x7fffffffbb00)
    at ../glib/gobject/gclosure.c:832
#28 0x00007ffff6c080ea in signal_emit_unlocked_R.isra.0
    (node=node@entry=0x7fffffffbca0, detail=detail@entry=0, instance=instance@entry=0x555556777b10, emission_return=emission_return@entry=0x7fffffffbd20, instance_and_params=instance_and_params@entry=0x7fffffffbbb0) at ../glib/gobject/gsignal.c:4020
#29 0x00007ffff6bf8335 in signal_emit_valist_unlocked
    (instance=instance@entry=0x555556777b10, signal_id=signal_id@entry=71, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffbe00)
    at ../glib/gobject/gsignal.c:3625
#30 0x00007ffff6bf8c77 in g_signal_emit_valist (instance=0x555556777b10, signal_id=71, detail=0, var_args=var_args@entry=0x7fffffffbe00)
    at ../glib/gobject/gsignal.c:3355
#31 0x00007ffff6bf8d34 in g_signal_emit (instance=instance@entry=0x555556777b10, signal_id=<optimized out>, detail=detail@entry=0)
    at ../glib/gobject/gsignal.c:3675
#32 0x00007ffff71484d3 in gtk_widget_draw_internal
    (widget=0x555556777b10 [ScintillaObject], cr=0x55555696e300, clip_to_size=<optimized out>) at ../gtk/gtk/gtkwidget.c:7077
#33 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=container@entry=0x5555567a6520 [GtkBox], child=0x555556777b10 [ScintillaObject], cr=cr@entry=0x55555696e300)
    at ../gtk/gtk/gtkcontainer.c:3854
#34 0x00007ffff6f0a576 in gtk_container_draw (widget=0x5555567a6520 [GtkBox], cr=0x55555696e300) at ../gtk/gtk/gtkcontainer.c:3674
#35 0x00007ffff6eb5f01 in gtk_box_draw_contents
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, unused=0x0) at ../gtk/gtk/gtkbox.c:453
#36 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#37 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x5555567a65c0 [GtkCssCustomGadget], cr=0x55555696e300)
    at ../gtk/gtk/gtkcssgadget.c:885
#38 0x00007ffff6eb6475 in gtk_box_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkbox.c:462
#39 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x5555567a6520 [GtkBox], cr=0x55555696e300, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#40 0x00007ffff6f0a465 in gtk_container_propagate_draw (container=<optimized out>, child=0x5555567a6520 [GtkBox], cr=0x55555696e300)
    at ../gtk/gtk/gtkcontainer.c:3854
#41 0x00007ffff70159a6 in gtk_notebook_draw_stack
    (gadget=<optimized out>, cr=0x55555696e300, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, unused=0x0) at ../gtk/gtk/gtknotebook.c:2545
#42 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#43 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c26da0 [GtkCssCustomGadget], cr=0x55555696e300)
    at ../gtk/gtk/gtkcssgadget.c:885
#44 0x00007ffff6ebf0da in gtk_box_gadget_draw
    (gadget=<optimized out>, cr=0x55555696e300, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkboxgadget.c:512
#45 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c26ca0 [GtkBoxGadget], cr=0x55555696e300) at ../gtk/gtk/gtkcssgadget.c:885
#46 0x00007ffff70159fc in gtk_notebook_draw (widget=<optimized out>, cr=0x55555696e300) at ../gtk/gtk/gtknotebook.c:2560
#47 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555c27770 [GtkNotebook], cr=0x55555696e300, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#48 0x00007ffff6f0a465 in gtk_container_propagate_draw (container=<optimized out>, child=0x555555c27770 [GtkNotebook], cr=0x55555696e300)
    at ../gtk/gtk/gtkcontainer.c:3854
#49 0x00007ffff70278c9 in gtk_paned_render
    (gadget=<optimized out>, cr=0x55555696e300, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, data=0x0) at ../gtk/gtk/gtkpaned.c:1818
#50 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#51 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c083a0 [GtkCssCustomGadget], cr=0x55555696e300)
    at ../gtk/gtk/gtkcssgadget.c:885
#52 0x00007ffff701f885 in gtk_paned_draw (widget=widget@entry=0x555555c08100 [GtkHPaned], cr=<optimized out>)
    at ../gtk/gtk/gtkpaned.c:1782
#53 0x00007ffff6e8c34d in _gtk_marshal_BOOLEAN__BOXED
    (closure=0x555555671ff0, return_value=0x7fffffffc6e0, param_values=0x7fffffffc770, marshal_data=<optimized out>, invocation_hint=<optimized out>, n_param_values=<optimized out>) at gtk/gtkmarshalers.c:84
#54 0x00007ffff7135db3 in _gtk_marshal_BOOLEAN__BOXED
    (marshal_data=0x7ffff701f870 <gtk_paned_draw>, invocation_hint=<optimized out>, param_values=0x7fffffffc770, n_param_values=2, return_value=0x7fffffffc6e0, closure=0x555555671ff0) at gtk/gtkmarshalers.c:70
#55 gtk_widget_draw_marshaller
    (closure=0x555555671ff0, return_value=0x7fffffffc6e0, n_param_values=2, param_values=0x7fffffffc770, invocation_hint=<optimized out>, marshal_data=0x7ffff701f870 <gtk_paned_draw>) at ../gtk/gtk/gtkwidget.c:951
#56 0x00007ffff6bd96c0 in g_closure_invoke
    (closure=0x555555671ff0, return_value=0x7fffffffc6e0, n_param_values=2, param_values=0x7fffffffc770, invocation_hint=0x7fffffffc6c0)
    at ../glib/gobject/gclosure.c:832
#57 0x00007ffff6c080ea in signal_emit_unlocked_R.isra.0
    (node=node@entry=0x7fffffffc860, detail=detail@entry=0, instance=instance@entry=0x555555c08100, emission_return=emission_return@entry=0x7fffffffc8e0, instance_and_params=instance_and_params@entry=0x7fffffffc770) at ../glib/gobject/gsignal.c:4020
#58 0x00007ffff6bf8335 in signal_emit_valist_unlocked
    (instance=instance@entry=0x555555c08100, signal_id=signal_id@entry=71, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffc9c0)
    at ../glib/gobject/gsignal.c:3625
#59 0x00007ffff6bf8c77 in g_signal_emit_valist (instance=0x555555c08100, signal_id=71, detail=0, var_args=var_args@entry=0x7fffffffc9c0)
    at ../glib/gobject/gsignal.c:3355
#60 0x00007ffff6bf8d34 in g_signal_emit (instance=instance@entry=0x555555c08100, signal_id=<optimized out>, detail=detail@entry=0)
    at ../glib/gobject/gsignal.c:3675
#61 0x00007ffff71484d3 in gtk_widget_draw_internal (widget=0x555555c08100 [GtkHPaned], cr=0x55555696e300, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7077
#62 0x00007ffff6f0a465 in gtk_container_propagate_draw (container=<optimized out>, child=0x555555c08100 [GtkHPaned], cr=0x55555696e300)
    at ../gtk/gtk/gtkcontainer.c:3854
#63 0x00007ffff70278c9 in gtk_paned_render
    (gadget=<optimized out>, cr=0x55555696e300, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, data=0x0) at ../gtk/gtk/gtkpaned.c:1818
#64 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#65 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555c067e0 [GtkCssCustomGadget], cr=0x55555696e300)
    at ../gtk/gtk/gtkcssgadget.c:885
#66 0x00007ffff701f885 in gtk_paned_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkpaned.c:1782
#67 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555c06510 [GtkVPaned], cr=0x55555696e300, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#68 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=container@entry=0x555555b3fd60 [GtkVBox], child=0x555555c06510 [GtkVPaned], cr=cr@entry=0x55555696e300)
    at ../gtk/gtk/gtkcontainer.c:3854
#69 0x00007ffff6f0a576 in gtk_container_draw (widget=0x555555b3fd60 [GtkVBox], cr=0x55555696e300) at ../gtk/gtk/gtkcontainer.c:3674
#70 0x00007ffff6eb5f01 in gtk_box_draw_contents
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>, unused=0x0) at ../gtk/gtk/gtkbox.c:453
#71 0x00007ffff6f0ad71 in gtk_css_custom_gadget_draw
    (gadget=<optimized out>, cr=<optimized out>, x=<optimized out>, y=<optimized out>, width=<optimized out>, height=<optimized out>)
    at ../gtk/gtk/gtkcsscustomgadget.c:159
#72 0x00007ffff6f17bdc in gtk_css_gadget_draw (gadget=0x555555b3fed0 [GtkCssCustomGadget], cr=0x55555696e300)
    at ../gtk/gtk/gtkcssgadget.c:885
#73 0x00007ffff6eb6475 in gtk_box_draw (widget=<optimized out>, cr=<optimized out>) at ../gtk/gtk/gtkbox.c:462
#74 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555b3fd60 [GtkVBox], cr=0x55555696e300, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#75 0x00007ffff6f0a465 in gtk_container_propagate_draw
    (container=container@entry=0x555555b3d680 [GtkWindow], child=0x555555b3fd60 [GtkVBox], cr=cr@entry=0x55555696e300)
    at ../gtk/gtk/gtkcontainer.c:3854
#76 0x00007ffff6f0a576 in gtk_container_draw (widget=0x555555b3d680 [GtkWindow], cr=0x55555696e300) at ../gtk/gtk/gtkcontainer.c:3674
#77 0x00007ffff71483ba in gtk_widget_draw_internal (widget=0x555555b3d680 [GtkWindow], cr=0x55555696e300, clip_to_size=<optimized out>)
    at ../gtk/gtk/gtkwidget.c:7084
#78 0x00007ffff71532e3 in gtk_widget_render
    (widget=0x555555b3d680 [GtkWindow], window=0x555556884780 [GdkX11Window], region=<optimized out>) at ../gtk/gtk/gtkwidget.c:17610
#79 0x00007ffff6fef91b in gtk_main_do_event (event=0x7fffffffd0d0) at ../gtk/gtk/gtkmain.c:1844
#80 gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1691
#81 0x00007ffff7ebdb87 in _gdk_event_emit (event=0x7fffffffd0d0) at ../gtk/gdk/gdkevents.c:73
#82 _gdk_event_emit (event=0x7fffffffd0d0) at ../gtk/gdk/gdkevents.c:67
#83 0x00007ffff7ecf982 in _gdk_window_process_updates_recurse_helper (window=0x555556884780 [GdkX11Window], expose_region=<optimized out>)
    at ../gtk/gdk/gdkwindow.c:3874
#84 0x00007ffff7ed3fd8 in gdk_window_process_updates_internal (window=0x555556884780 [GdkX11Window]) at ../gtk/gdk/gdkwindow.c:4020
#85 0x00007ffff7ed41f5 in gdk_window_process_updates_with_mode (recurse_mode=<optimized out>, window=<optimized out>)
    at ../gtk/gdk/gdkwindow.c:4215
#86 gdk_window_process_updates_with_mode (window=<optimized out>, recurse_mode=<optimized out>) at ../gtk/gdk/gdkwindow.c:4186
#90 0x00007ffff6bf8d34 in <emit signal 'paint' on instance 0x555556884710 [GdkFrameClockIdle]>
    (instance=instance@entry=0x555556884710, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3675
    #87 0x00007ffff6bf8b73 in _g_closure_invoke_va
    (param_types=0x0, n_params=<optimized out>, args=0x7fffffffd400, instance=0x555556884710, return_value=0x0, closure=0x5555568940b0)
    at ../glib/gobject/gclosure.c:895
    #88 signal_emit_valist_unlocked
    (instance=instance@entry=0x555556884710, signal_id=signal_id@entry=32, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd400)
    at ../glib/gobject/gsignal.c:3516
    #89 0x00007ffff6bf8c77 in g_signal_emit_valist
    (instance=0x555556884710, signal_id=32, detail=0, var_args=var_args@entry=0x7fffffffd400) at ../glib/gobject/gsignal.c:3355
#91 0x00007ffff7ecae69 in _gdk_frame_clock_emit_paint (frame_clock=0x555556884710 [GdkFrameClockIdle]) at ../gtk/gdk/gdkframeclock.c:657
#92 gdk_frame_clock_paint_idle (data=0x555556884710) at ../gtk/gdk/gdkframeclockidle.c:597
#93 0x00007ffff7eb76ae in gdk_threads_dispatch (data=0x5555569a8260, data@entry=<error reading variable: value has been optimized out>)
    at ../gtk/gdk/gdk.c:769
#94 0x00007ffff6ad439e in g_timeout_dispatch (source=0x5555569a75f0, callback=<optimized out>, user_data=<optimized out>)
    at ../glib/glib/gmain.c:5121
#95 0x00007ffff6ad2f19 in g_main_dispatch (context=0x555555640c90) at ../glib/glib/gmain.c:3476
#96 0x00007ffff6b312b7 in g_main_context_dispatch_unlocked (context=0x555555640c90) at ../glib/glib/gmain.c:4284
#97 g_main_context_iterate_unlocked.isra.0 (context=0x555555640c90, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
    at ../glib/glib/gmain.c:4349
#98 0x00007ffff6ad3b47 in g_main_loop_run (loop=0x555555c3eaf0) at ../glib/glib/gmain.c:4551
#99 0x00007ffff6fecf6f in gtk_main () at ../gtk/gtk/gtkmain.c:1329
#100 0x00007ffff7a92155 in main_lib (argc=<optimized out>, argv=<optimized out>) at libmain.c:1256
#101 0x00007ffff7627cd0 in __libc_start_call_main
    (main=main@entry=0x555555555020 <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffd848)
    at ../sysdeps/nptl/libc_start_call_main.h:58
#102 0x00007ffff7627d8a in __libc_start_main_impl
    (main=0x555555555020 <main>, argc=1, argv=0x7fffffffd848, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd838) at ../csu/libc-start.c:360
#103 0x0000555555555055 in _start ()
(gdb)

@elextr
Copy link
Member

elextr commented Sep 12, 2023

There is nothing turning it on either, who knows what weird distro package builds do ;-)

I suggest that if building from git it is best to actually do that, there are far fewer moving parts:

cd ~; mkdir my_git_geany; cd my_git_geany
git clone https://github.com/geany/geany.git
cd geany; ./autogen.sh --prefix= /absolute_path_to_home/my_git_geany; make install
cd ..
git clone https://github.com/geany/geany-plugins.git
cd geany-plugins;
./autogen.sh --prefix= /absolute_path_to_home/my_git_geany --with-geany-libdir= /absolute_path_to_home/my_git_geany/lib
make install
cd ../bin; ./geany -c ../config

Note:

  1. everything is in ~/my_git_geany, so just rm -rf it when done
  2. does not use your config, so it won't break a session you are doing
  3. does not use sudo so can't accidentally damage a system install

I did try to have this incantation added to the readme or install as the simplest build method, but there were so many objections from people complaining it did not comply with their idea of a "proper" way to build and other variations and complications and whatifs that I gave up and so everyone is left on their own :-(.

@elextr
Copy link
Member

elextr commented Sep 12, 2023

Ok, your backtrace came in while I was typing.

The problem appears to be in Scintilla trying to draw an indicator, probably the squiggly underscore marking spelling.

@nyamatongwe can you tell from that if Geany is passing invalid parameters to Scintilla or if its triggering a corner case in Scintilla (maybe applying the indicator between the base emoji and the vs16?)

Edit: PlatGTK.cxx:623 indexing a vector with 0, which probably means the vector is empty.

Edit edit: and that explains why it does not crash here, indexing an empty vector is unchecked and UB but @xiota is using a checked version of libc++ so it aborts instead.

@nyamatongwe
Copy link

The width passed to SurfaceImpl::DrawRGBAImage is 0 (probably due to marking a zero-width character) so the bitmap vector size is 0. It is calling std::vector::operator[0] which is out-of-bounds but shouldn't be checked or cause a failure.

Add a check for empty size at the top of SurfaceImpl::DrawRGBAImage and it will likely be happy.

@elextr
Copy link
Member

elextr commented Sep 12, 2023

which is out-of-bounds but shouldn't ... cause a failure.

It is undefined behaviour, so it can do anything, including aborting, which is what the version of stdlibc++ used by the OP decides to do, even if mine and yours and most others don't.

@xiota as you are the only one with a standard library that conveniently aborts can you try adding a line after scintilla/gtk/PlatGTK.cxx:610 (which should be the SurfaceImpl::DrawRGBAImage function) with:

    if(width == 0)return;

and see if it still aborts?

@xiota
Copy link
Contributor Author

xiota commented Sep 12, 2023

Geany no longer aborts with if (width == 0) return; pasted on a new line after scintilla/gtk/PlatGTK.cxx:610.

@nyamatongwe
Copy link

Committed fix with 652df8.

@elextr
Copy link
Member

elextr commented Sep 13, 2023

Neat thanks, @xiota now you just need to add the patch to geany/geany#3551

@xiota
Copy link
Contributor Author

xiota commented Sep 13, 2023

Isn't that too convoluted? Creating a PR for a PR?

@elextr
Copy link
Member

elextr commented Sep 13, 2023

I think you can create a PR on the fork @kugel- used to make the PR, not on the actual Geany repo1, and he can just merge it to his PR if ok. Otherwise it will wait for the next Scintilla release and "somebody" making a new PR for that, but since it is undefined behaviour it would be good to fix sooner.

Additionally it could be added as a separate PR on current Scintilla in Geany, but it might still need to be added to the upgrade PR so it doesn't get removed or cause merge conflicts.

Footnotes

  1. I've never done it, but github mentions adding more commits and the branch and fork name to use at the bottom of all PRs ↩

@xiota
Copy link
Contributor Author

xiota commented Sep 13, 2023

@nyamatongwe

When I tested, I put the conditional return statement before the PLATFORM_ASSERT line:

void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) {
	if (width == 0) return;

	PLATFORM_ASSERT(context);

I noticed in your commit that you put it after. Could PLATFORM_ASSERT be the origin of the abort?

 void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) {
 	PLATFORM_ASSERT(context);
+	if (width == 0)
+		return;
 	if (rc.Width() > width)

@elextr
Copy link
Member

elextr commented Sep 13, 2023

The backtrace shows that the abort you are seeing is not from the PLATFORM_ASSERT.

Anyway since the assert and the new if are testing different things they can be in either order. Also the assert is most likely compiled out in most builds.

Best to put exactly what Neil did to avoid merge issues later.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants