On 2026-02-24T13:56:23+0100, Alejandro Colomar wrote:
> Hi Rene,
> 
> On 2026-02-24T13:41:26+0100, Rene Kita wrote:
> > This explains why it went so smooth with Arch. m-(
> > 
> > Running the build on Arch I get multiple errors of this kind:
> > browser.c:548:17: error: initialization discards 'const' qualifier from
> > pointer target type [-Werror=discarded-qualifiers]
> >   548 |       char *c = strrchr (d, '/');
> >       |                 ^~~~~~~
> > 
> > This is in function:
> > static int examine_directory (MUTTMENU *menu, struct browser_state *state,
> >                           const char *d, const char *prefix).
> > 
> > AFAIU, strrchr is defined as: char * strrchr(const char *s, int c).
> 
> Being Arch, I suspect you're using the latest glibc.  C23 has changed
> the prototype of string search functions to use 'QChar', which is just
> a way of saying "the const qualifier, if present on the input, is
> preserved in the output".
> <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf#subsubsection.7.26.5.6>
> 
> This makes it possible to write code that is more type-safe.
> 
> Since C23, the standard prototype for strrchr(3) is:
> 
>       QChar *strrchr(QChar *s, int c);
> 
> which could be documented in a more C++-style way, with overloads:
> 
>       char *strrchr(char *s, int c);
>       const char *strrchr(const char *s, int c);
> 
> I now need to update the manual pages, and think I'm going to use the
> latter, although feel free to suggest some preference or some other way
> to document it.
> 
> The glibc commit that changed this was:
> 
>       glibc.git cd748a63ab1a (2025-11-20; "Implement C23 const-preserving 
> standard library macros")
> 
> which is contained in glibc-2.43.
> 
> > 
> > *c is changed later in that function, so we can't make it const. Any
> > ideas what's the best way forward from here?
> 
> If *c is later changed, and it derives from d, then d must be non-const,
> doesn't it?  Or is c later derived from another pointer?  If the latter
> is true, then we'd need to use a different local pointer variable.

After reading the source code myself, this looks like a bug.  d should
be non-const, as we modify it.

        $ grepc examine_directory . | grep -e '\<d\>' -e '\<c\>' -e { -e };
        ./browser.c:static int examine_directory (MUTTMENU *menu, struct 
browser_state *state,
                                      const char *d, const char *prefix)
        {
          while (stat (d, &s) == -1)
          {
            {
              char *c = strrchr (d, '/');
              if (c && (c > d))
              {
                *c = 0;
              }
            }
            mutt_perror (d);
          }
          {
            mutt_error (_("%s is not a directory."), d);
          }
          if ((dp = opendir (d)) == NULL)
          {
            mutt_perror (d);
          }
          {
            mutt_buffer_concat_path (full_path, d, de->d_name);
            {
            }
          }
        }

> 
> 
> Have a lovely day!
> Alex
> 
> -- 
> <https://www.alejandro-colomar.es>



-- 
<https://www.alejandro-colomar.es>

Attachment: signature.asc
Description: PGP signature

Reply via email to