On Tue, 2024-07-02 at 21:21 +0200, Florian Weimer wrote:
> * Jakub Jelinek:
> 
> > On Tue, Jul 02, 2024 at 12:54:09PM -0400, David Malcolm via Gcc
> > wrote:
> > > Back in 2007 glibc gained some logic to implement "error" and
> > > "error_at_line" by splitting into zero and non-zero cases, with
> > > the
> > > nonzero case calling a "noreturn" function [1].
> > > 
> > > This doesn't seem to work. I tested back to 4.8.1 with Compiler
> > > Explorer [2], which seems to be the earliest GCC that supports -
> > > fdump-
> > > tree-original=stderr.
> > > 
> > > What happens is that glibc's 
> > > 
> > > __extern_always_inline void
> > > error (int __status, int __errnum, const char *__format, ...)
> > > {
> > >   if (__builtin_constant_p (__status) && __status != 0)
> > >     __error_noreturn (__status, __errnum, __format, __va_arg_pack
> > > ());
> > >   else
> > >     __error_alias (__status, __errnum, __format, __va_arg_pack
> > > ());
> > > }
> > > 
> > > comes out of GCC's C frontend as:
> > > 
> > > {
> > >   if (0)
> > >     {
> > >       __error_noreturn (__status, __errnum, __format,
> > > __builtin_va_arg_pack ());
> > >     }
> > >   else
> > >     {
> > >       __error_alias (__status, __errnum, __format,
> > > __builtin_va_arg_pack ());
> > >     }
> > > }
> > > 
> > > since __status is not a builtin constant,
> > 
> > At -O0 sure, that is how __builtin_constant_p works.
> > The above is intended for optimized compilation, and I think it
> > works just
> > fine then.
> 
> And it's generally needed with optimization only, to suppress
> warnings
> in unreachable code that only happen when optimization is turned on.

Indeed - and that's why -fanalyzer ran into it at -O0.

I'm testing a fix.

Thanks
Dave

Reply via email to