English 中文(简体)
GCC - shouldn t a warning be issued when assigning an int to a char?
原标题:
  • 时间:2009-11-13 16:18:15
  •  标签:
  • c
  • gcc
  • mingw

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
", 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?

最佳回答

You re looking for

-Wconversion

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:

-Wall -Wextra -Wmissing-prototypes -Wmissing-declarations -Wshadow
-Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Wnested-externs
-Winline -Wno-long-long -Wconversion -Wstrict-prototypes

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.

问题回答

I didnt get a warning/error with -Wconversion either. However, if you give a pass with something like splint you get three warnings:

file.c: (in function main)
file.c:9:5: Assignment of int to char: c = i_max
  To make char and int types equivalent, use +charint.
file.c:10:52: Format argument 2 to printf (%d) expects int gets char: c_max
   file.c:10:32: Corresponding format code
file.c:10:59: Format argument 3 to printf (%d) expects int gets char: c
   file.c:10:39: Corresponding format code

Finished checking --- 3 code warnings

If you are serious about catching all errors you should use more than one tool.

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 :))

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

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





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签