Re: [PATCH 6/6] Use Arch instead of Debian for sr.ht builds
Alejandro Colomar via Mutt-dev <[email protected]>
| Newsgroups | gmane.mail.mutt.devel |
|---|---|
| Message-ID | <aZ2gXqAVz2MN3pGG@devuan> |
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>
signature.asc
(application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEES7Jt9u9GbmlWADAi64mZXMKQwqkFAmmdoPQACgkQ64mZXMKQ wqmJvRAAoZqQiQiFw43Ps32zOUFCak2dywmhG9xFXbgPdMOaMpqoQ2/GvccIJyNP ldrsSWsCMONQla2MBYEU783Omd2j+eOsMvCuL13EX6IqMT588ZQM6dovLuHWQL3e 4eiTzpiyW0U5TZ5sjjAeHVuIlEAEien2/vdTlkCu8w4MZeOk+BQyg6MwtvfPeICk RWU3kvXrma9pk/Qs/9vDlnqugHjENwhTB1w7xMFnKYYTqYa0iWUzQW/sy02dqM08 qEkgNAQ3XvaaJHthnhQvs+sZv7opjfRNKvtMCwNJlQxlVfBNABiy4qkOE9mPlkRg C7HE6/yGJK77YGcRyjQxD0XTl/uCXZNWI1pNrceT3FwuFpvglFLtPo/vSgqi1gUx uoR3n5zGR5VVnJsVl/VxBvPU+Fs/m2yVXchior8eiCdSA1S8iI5tGKzWKM9WAXPS ljdWalo00BsOILokLHINXOl0TfNbGL83QxkzlflXVV7mH50flSEjCT7OdHS5jLB6 2a5pYvWUijdi0aYiF1zYb5kNBHOeX+scIOzieD2ezHAbc7yQkqRHpdgV3aCOuLEc TtdEWWTZFPgnqzJU68i1yYEWoNFo+N8p1+rxHjmvlHl1PoTM5Eu95gc0ISWPQk0e NiUc64Cmcp+8RejeFGmeMZ/tZJQGmHOTZybXK9ePDuEgSuRb/tw= =DcRB -----END PGP SIGNATURE-----