On Tue, 8 Sep 2020 at 19:56, Yonggang Luo <luoyonggang@gmail.com> wrote:
>
> This is the compiling error:
> ../ui/curses.c: In function 'curses_refresh':
> ../ui/curses.c:256:5: error: 'next_maybe_keycode' may be used uninitialized in this function [-Werror=maybe-uninitialized]
> 256 | curses2foo(_curses2keycode, _curseskey2keycode, chr, maybe_keycode)
> | ^~~~~~~~~~
> ../ui/curses.c:302:32: note: 'next_maybe_keycode' was declared here
> 302 | enum maybe_keycode next_maybe_keycode;
> | ^~~~~~~~~~~~~~~~~~
> ../ui/curses.c:256:5: error: 'maybe_keycode' may be used uninitialized in this function [-Werror=maybe-uninitialized]
> 256 | curses2foo(_curses2keycode, _curseskey2keycode, chr, maybe_keycode)
> | ^~~~~~~~~~
> ../ui/curses.c:265:24: note: 'maybe_keycode' was declared here
> 265 | enum maybe_keycode maybe_keycode;
> | ^~~~~~~~~~~~~
> cc1.exe: all warnings being treated as errors
> Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> ---
> ui/curses.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/ui/curses.c b/ui/curses.c
> index 12bc682cf9..e4f9588c3e 100644
> --- a/ui/curses.c
> +++ b/ui/curses.c
> @@ -262,7 +262,7 @@ static int curses2foo(const int _curses2foo[], const int _curseskey2foo[],
> static void curses_refresh(DisplayChangeListener *dcl)
> {
> int chr, keysym, keycode, keycode_alt;
> - enum maybe_keycode maybe_keycode;
> + enum maybe_keycode maybe_keycode = CURSES_KEYCODE;
>
> curses_winch_check();
>
> @@ -299,7 +299,7 @@ static void curses_refresh(DisplayChangeListener *dcl)
>
> /* alt or esc key */
> if (keycode == 1) {
> - enum maybe_keycode next_maybe_keycode;
> + enum maybe_keycode next_maybe_keycode = CURSES_KEYCODE;
> int nextchr = console_getch(&next_maybe_keycode);
>
> if (nextchr != -1) {
The problem here is that the compiler hasn't noticed that it's
impossible to return something other than -1 from console_getch()
without initializing next_maybe_keycode.
There are two possible reasons for this:
(1) your gcc is a bit old -- newer gcc are better at working
out this kind of thing. But you said on irc that you're using
gcc 10.2.0, which is new...
(2) this is a variant of the problem with the system headers
that causes us to have to redefine assert() in osdep.h, only
with abort() (ie abort() is perhaps not marked as noreturn in
the system headers). If this theory is true, then changing
the abort() in console_getch() to instead be g_assert_not_reached()
would be a different way to avoid the warnings (and if that works
we should probably fix up abort() the way we do assert()).
Tried
g_assert_not_reached still not fixes the issue, and I verified
on debug build, either g_assert_not_reached or abort, the compiling error doesn't appear,
the debug build are the build that configured with --enable-debug-info --enable-debug
this compiling error only appear in release build.
thanks
-- PMM