On 2026-02-24T14:00:39+0100, Alejandro Colomar wrote:
> 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)

I've tried fixing this, by trying to remove const from above.  However,
that triggers a number of warnings like this one:

        buffer.h:32:54: warning: passing argument 3 of ‘examine_directory’ 
discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
           32 | #define mutt_b2s(b) (b->data ? (const char *)b->data : "")
              |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
        browser.c:947:44: note: in expansion of macro ‘mutt_b2s’
          947 |       if (examine_directory (NULL, &state, mutt_b2s 
(working_dir), mutt_b2s (prefix)) == -1)
              |                                            ^~~~~~~~
        browser.c:535:37: note: expected ‘char *’ but argument is of type 
‘const char *’
          535 |                               char *d, const char *prefix)
              |                               ~~~~~~^

The solution would be to make that "" modifiable, with a C99 compound
literal.  We require C99, so we can do that.  However, that would mean:

        -#define mutt_b2s(b) (b->data ? (const char *)b->data : "")
        +#define mutt_b2s(b) (b->data ? b->data : (char []){""})

which itself carries questions: is it okay to modify such a buffer?
It must be okay, since we're already doing it, but still needs some
research.  Also, why was const added there in the first place, if we're
modifying it?


Cheers,
Alex

>       {
>         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>



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

Attachment: signature.asc
Description: PGP signature

Reply via email to