I've recently set up a MinGW + MSYS environment on my laptop to check how things are with Netbeans C/C++ support. Everything seems to work fine, however, during my testing I have noticed a difference between GCC and Microsoft's cl.exe compiler.
Here's a sample program:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(void) {
int i_max = INT_MAX;
char c_max = CHAR_MAX, c;
c = i_max;
printf("i_max: %d, c_max: %d, c: %d\n", i_max, c_max, c);
return EXIT_SUCCESS;
}
The output is:
i_max: 2147483647, c_max: 127, c: -1
As you can see in the code above, I assign an int to a char. Shouldn't this produce a warning that a possible data loss may occur? Microsoft's compiler (which I have configured to be very strict) does issue the warning while GCC doesn't.
Here are the GCC options I use:
-g -Werror -ansi -pedantic -Wall -Wextra
Am I missing some GCC option to make the compile time checks even stricter?
-Wall doesn't quite mean -Wall, -Wextra is already under fire for being a little overly pedantic.
As Christoph said, you are looking for -Wconversion. Its good to really dig in to what -Wall and -Wextra actually turn on, and just specify the -W flags you want in your make file, especially if treating warnings as errors.
Theres a little nuance in your question that is not immediately obvious to me from the way it is worded.
If you think GCC (specifically GCC) should issue a warning here, then some compiler options might possibly help (see other replies).
If you think any compiler should issue a warning here (and I seem to read that sentiment in your question), then... well, "warnings" are not in any way mandatory or even de-facto unified. There's no "should" here. Assigning a larger-typed integer value to a smaller type without an explicit cast is pefectly legal in C. Overflow on conversion, produces implementation-defined behavior (it is not even UB :))
I think it falls under the "Usual arithmetic conversions" (6.3.1.8) or "integer promotion rules" (5.1.2.3 (?)), but I can't find the specific text that says the behaviour you're seeing is expected.
You're looking for
You'd have to ask a gcc developer for the specific reasons why some warnings aren't included in
-Wall
or-Wextra
.Anyway, these are the flags I use:
As other's have pointed out, the behaviour of
-Wconversion
changed with version 4.3 - the old warning about prototypes forcing a type conversion is now available as-Wtraditional-conversion
.In C, assigning an int to a char is legal.
As it's legal (but possibly dodgy) the different compiler vendors do different things when they encounter this code.
I guess MS is just being extra pedantic while the GCC guys have decided that it's not even worth a warning.
I didnt get a warning/error with
-Wconversion
either. However, if you give a pass with something likesplint
you get three warnings:If you are serious about catching all errors you should use more than one tool.