On Sun, Mar 29, 2026 at 12:07:31PM +0200, Rene Kita wrote:
> I had some time and wanted to see how mutt compiles with more warnings
> enabled, i.e. CFLAGS='-Wall -Wcast-qual -Werror
> -Wimplicit-function-declaration -Wimplicit-int -Wnull-dereference
> -Wold-style-definition -Wredundant-decls -Wstrict-prototypes
> -Wstring-compare -Wtype-limits -Wuninitialized -Wunused'
>
> Turns out there's a lot the compiler complains about, especially when it
> comes to some const usage. The following patches are a result of this
> experiment and are far from a complete fix.
>
> This series depends on the proposed reformatting from Kevin. It's
> untested besides compilation and CI.
Below is the shortened build log with the remaining errors after my 9
patches were applied. Adding more const to avoid these errors leads to
more errors somewhere else in the call chain. There are other errors
which come from -Wtype-limits and -Wredundant-decls.
Most prominent example is imap_next_word which is called in a lot of
functions taking const char * as an parameter. We do cast away the const
there. imap_next_word does not modify the string, but will return the
string in the end. This means if we let imap_next_word take a const
char * we also need to return a const char *. But this does not work
everywhere it is used.
What is the general opinion here regarding such compiler flags and how
to handle such situations?
For me -Wcast-qual is one of the most important flags. I prefer to use
less const if needed to make the build pass without warnings.
Suppressing warnings should only be used when interacting with
interfaces not under our control.
--
[...]
command.c: In function ‘imap_cmd_trailer’:
command.c:224:22: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
224 | s = imap_next_word((char *)s);
| ^
command.c:233:22: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
233 | s = imap_next_word((char *)s);
| ^
command.c: In function ‘cmd_status’:
command.c:465:22: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
465 | s = imap_next_word((char*)s);
| ^
command.c: In function ‘cmd_parse_myrights’:
command.c:1038:22: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
1038 | s = imap_next_word((char*)s);
| ^
command.c:1039:22: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
1039 | s = imap_next_word((char*)s);
| ^
command.c: In function ‘cmd_parse_search’:
command.c:1106:30: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
1106 | while ((s = imap_next_word((char*)s)) && *s != '\0')
| ^
command.c: In function ‘cmd_parse_enabled’:
command.c:1293:30: warning: cast discards ‘const’ qualifier from pointer target
type [-Wcast-qual]
1293 | while ((s = imap_next_word((char*)s)) && *s != '\0')
| ^
[...]
mutt_socket.c: In function ‘mutt_conn_find’:
mutt_socket.c:311:22: warning: cast discards ‘const’ qualifier from pointer
target type [-Wcast-qual]
311 | mutt_account_tourl((ACCOUNT*) account, &url, 0);
| ^
mutt_zstrm.c: In function ‘mutt_zstrm_write’:
mutt_zstrm.c:190:27: warning: cast discards ‘const’ qualifier from pointer
target type [-Wcast-qual]
190 | zctx->write.z.next_in = (Bytef*) buf;
| ^
[...]
pgppubring.c: In function ‘main’:
pgppubring.c:159:34: warning: cast discards ‘const’ qualifier from pointer
target type [-Wcast-qual]
159 | pgpring_find_candidates(kring, (const char**) argv + optind, argc -
optind);
| ^
[...]
date.c: In function ‘mutt_mktime’:
date.c:88:20: warning: comparison is always false due to limited range of data
type [-Wtype-limits]
88 | if ((time_t)year > TM_YEAR_MAX)
| ^
[...]
sendlib.c:73:15: warning: redundant redeclaration of ‘environ’
[-Wredundant-decls]
73 | extern char **environ;
| ^~~~~~~
In file included from mutt.h:25,
from sendlib.c:26:
/usr/include/unistd.h:566:15: note: previous declaration of ‘environ’ with type
‘char **’
566 | extern char **environ;
| ^~~~~~~
sendlib.c: In function ‘convert_file_from_to’:
sendlib.c:864:50: warning: to be safe all intermediate pointers in cast from
‘char **’ to ‘const char **’ must be ‘const’ qualified [-Wcast-qual]
864 | ret = convert_file_to(file, fcode, ncodes, (const char **)tcode,
| ^
sendlib.c:879:52: warning: to be safe all intermediate pointers in cast from
‘char **’ to ‘const char **’ must be ‘const’ qualified [-Wcast-qual]
879 | ret = convert_file_to(file, fromcodes, ncodes, (const char **)tcode,
| ^