[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <0f51dac4-836b-0ff2-38c6-5521745c1c88@landley.net>
Date: Thu, 19 Jan 2023 21:31:21 -0600
From: Rob Landley <rob@...dley.net>
To: "Michael.Karcher" <Michael.Karcher@...berlin.de>,
John Paul Adrian Glaubitz <glaubitz@...sik.fu-berlin.de>,
Geert Uytterhoeven <geert@...ux-m68k.org>
Cc: linux-kernel@...r.kernel.org, amd-gfx@...ts.freedesktop.org,
linux-arm-kernel@...ts.infradead.org, linux-media@...r.kernel.org,
linux-wireless@...r.kernel.org, linux-mips@...r.kernel.org,
linux-sh@...r.kernel.org, linux-f2fs-devel@...ts.sourceforge.net,
linuxppc-dev@...ts.ozlabs.org, kasan-dev@...glegroups.com,
linux-xtensa@...ux-xtensa.org,
Michael Karcher <kernel@...rcher.dialup.fu-berlin.de>,
Arnd Bergmann <arnd@...db.de>
Subject: Re: Calculating array sizes in C - was: Re: Build
regressions/improvements in v6.2-rc1
On 1/19/23 16:11, Michael.Karcher wrote:
> Isn't this supposed to be caught by this check:
>>>>
>>>> a, __same_type(a, NULL)
>>>>
>>>> ?
>>>
>>> Yeah, but gcc thinks it is smarter than us...
>>> Probably it drops the test, assuming UB cannot happen.
>> Hmm, sounds like a GGC bug to me then. Not sure how to fix this then.
>
>
> I don't see a clear bug at this point. We are talking about the C expression
>
> __same_type((void*)0, (void*)0)? 0 : sizeof((void*)0)/sizeof(*((void*0))
*(void*) is type "void" which does not have a size.
The problem is gcc "optimizing out" an earlier type check, the same way it
"optimizes out" checks for signed integer math overflowing, or "optimizes out" a
comparison to pointers from two different local variables from different
function calls trying to calculate the amount of stack used, or "optimizes out"
using char *x = (char *)1; as a flag value and then doing "if (!(x-1)) because
it can "never happen"...
> I suggest to file a bug against gcc complaining about a "spurious
> warning", and using "-Werror -Wno-error-sizeof-pointer-div" until gcc is
> adapted to not emit the warning about the pointer division if the result
> is not used.
Remember when gcc got rewritten in c++ starting in 2007?
Historically the main marketing push of C++ was that it contains the whole of C
and therefore MUST be just as good a language, the same way a mud pie contains
an entire glass of water and therefore MUST be just as good a beverage. Anything
C can do that C++ _can't_ do is seen as an existential threat by C++ developers.
They've worked dilligently to "fix" C not being a giant pile of "undefined
behavior" the way C++ is for 15 years now.
I have... opinions on this.
> Regards,
> Michael Karcher
Rob
Powered by blists - more mailing lists