On Tue, Nov 25, 2025 at 03:51:00PM +0100, Michal Prívozník wrote:
> On 11/25/25 15:10, Daniel P. Berrangé via Devel wrote:
> > On Tue, Nov 25, 2025 at 02:54:20PM +0100, Ján Tomko via Devel wrote:
> >> On a Tuesday in 2025, Peter Krempa via Devel wrote:
> >>> From: Peter Krempa <[email protected]>
> >>>
> >>> 'char *tmp' is assigned from calling 'strrchr' on a 'const char *'. New
> >>> clang in fedora doesn't like it. Make 'tmp' const.
> >>>
> >>> Signed-off-by: Peter Krempa <[email protected]>
> >>> ---
> >>>
> >>> https://gitlab.com/MichalPrivoznik/libvirt/-/jobs/12208300313
> >>>
> >>
> >> I was hoping the link would show a fixed pipeline :)
> > 
> > I'm rather curious how clang decides to trigger that warning given
> > the libc header file declares the return value non-const
> > 
> >   extern char *strchr (const char *__s, int __c)
> >      __THROW __attribute_pure__ __nonnull ((1));
> > 
> > It seems like clang has special-cased strchr/strrchr to enforce
> > the const return for const input.
> 
> Well, it also triggers in places like:
> 
> ../src/rpc/virnetsshsession.c:223:18: error: assigning to 'char *' from 
> 'const char *' discards qualifiers 
> [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
>   223 |         if ((tmp = strrchr(askcred[i].prompt, ':')))
>       |                  ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> 
> And just to give you context around the line:
> 
>         if ((tmp = strrchr(askcred[i].prompt, ':')))
>             *tmp = '\0';
> 
> So I'd rather this patch is NOT merged and CLang is fixed instead.

I'm on the fence about whether clang is "broken" or not.

It is in response to -Wincompatible-pointer-types-discards-qualifiers.
Since warnings aren't standardized, the compiler  author has free
choice over semantics.

In C++ the string.h header actually provides 2 overloaded definitions

  /* Find the first occurrence of C in S.  */
  #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
  extern "C++"
  {
  extern char *strchr (char *__s, int __c)
     __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1));
  extern const char *strchr (const char *__s, int __c)
     __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1));
  ...snip...


IMHO it is not unreasonable for CLang to want to bring an equivalent
level of const-correctness to C through warning flags.

I figure we're probably got a choice of fixing all the non-const correct
usage across the codebase, or turning off this warning with clang builds.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Reply via email to