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,
      |                                                    ^

Reply via email to