[BUG] -Wuninitialized: initialize variable with itself
David Brown
david@westcontrol.com
Mon Nov 14 09:41:42 GMT 2022
On 13/11/2022 19:43, Alejandro Colomar via Gcc wrote:
> Hi Andrew!
>
> On 11/13/22 19:41, Andrew Pinski wrote:
>> On Sun, Nov 13, 2022 at 10:40 AM Andrew Pinski <pinskia@gmail.com> wrote:
>>>
>>> On Sun, Nov 13, 2022 at 10:36 AM Alejandro Colomar via Gcc
>>> <gcc@gcc.gnu.org> wrote:
>>>>
>>>> Hi,
>>>>
>>>> While discussing some idea for a new feature, I tested the following
>>>> example
>>>> program:
>>>>
>>>>
>>>> int main(void)
>>>> {
>>>> int i = i;
>>>> return i;
>>>> }
>>>
>>> This is NOT a bug but a documented way of having the warning not
>>> being there.
>>> See
>>> https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Warning-Options.html#index-Winit-self
>>>
>>> https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Warning-Options.html#index-Wuninitialized
>>>
>>> "If you want to warn about code that uses the uninitialized value of
>>> the variable in its own initializer, use the -Winit-self option."
>>
>> I should note the main reason why I Know about this is because I fixed
>> this feature years ago (at least for C front-end)
>> and added the option to disable the feature.
>
> I'm curious: what are the reasons why one would want to disable such a
> warning?
> Why is it not in -Wall or -Wextra?
>
> Thanks,
>
> Alex
>
Warnings are not perfect - there is always the risk of false positives
and false negatives. And different people will have different ideas
about what code is perfectly reasonable, and what code is risky and
should trigger a warning. Thus gcc has warning flag groups (-Wall,
-Wextra) that try to match common consensus, and individual flags for
personal fine-tuning.
Sometimes it is useful to have a simple way to override a warning in
code, without going through "#pragma GCC diagnostic" lines (which are
powerful, but not pretty).
So if you have :
int i;
if (a == 1) i = 1;
if (b == 1) i = 2;
if (c == 1) i = 3;
return i;
the compiler will warn that "i" may not be initialised. But if you
/know/ that one of the three conditions will match (or you don't care
what "i" is if it does not match), then you know your code is fine and
don't want the warning. Writing "int i = i;" is a way of telling the
compiler "I know what I am doing, even though this code looks dodgy,
because I know more than you do".
It's just like writing "while ((*p++ = *q++));", or using a cast to void
to turn off an "unused parameter" warning.
More information about the Gcc
mailing list