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
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](https://www.unicode.org/charts/PDF/U1F900.pdf) followed by VS16 [colour variant selector](https://en.wikipedia.org/wiki/Variation_Selectors_(Unicode_block)) 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.
Note: Occurs when "Toggle spell check" option is enabled. Disabling the option, no crash.
Same problem with 27af15f9 with reverts to allow use with Geany 1.38 (5e130960bc6b9f3b3158cdb35d27f6bba03ba3c5 and 01b19d2d401f49f220157f28cc5e53de491f71a9). 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.
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).
Unable to build for Geany git/1.39 because Lua appears to require another Scintilla update.
Just disable Geanylua `--disable-geanylua`
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.
geany git/3787677de; without rebuilding plugins, same issue.
Rebuilding geany-plugins 27af15f9 for geany-git (without reverts), same issue. Following obtained from this build.
<details> <summary>Configure output.</summary>
``` 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 ``` </details>
<details> <summary>gdb backtrace</summary>
``` /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) ``` </details>
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.
I built and installed geany as a package, but looking through the [PKGBUILD](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=geany-git), don't see anything turning off debug.
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 :-(.
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?)
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.
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?
Geany no longer aborts with `if (width == 0) return;` pasted on a new line after `scintilla/gtk/PlatGTK.cxx:610`.
Committed fix with [652df8](https://sourceforge.net/p/scintilla/code/ci/652df80a41a010f404be51410d921f2d...).
Neat thanks, @xiota now you just need to add the patch to https://github.com/geany/geany/pull/3551
Isn't that too convoluted? Creating a PR for a PR?
I think you can create a PR on the fork @kugel- used to make the PR, not on the actual Geany repo[^1], 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.
[^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
@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. What if the `PLATFORM_ASSERT` is 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) ```
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.
github-comments@lists.geany.org