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 <pins...@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.