Легкий вес, может быть выполнен, не устанавливая его на машине клиента, быстро, может отладить привилегированный режим.
Вы ищете
-Wconversion
. Вам нужно спросить разработчика gcc о конкретных причинах, по которым некоторые предупреждения не отображаются. t включены в -Wall
или -Wextra
.
Во всяком случае, я использую следующие флаги:
-Wall -Wextra -Wmissing-prototypes -Wmissing-declarations -Wshadow
-Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Wnested-externs
-Winline -Wno-long-long -Wconversion -Wstrict-prototypes
Как указывали другие,
Я не получал предупреждения / ошибки и при использовании -Wconversion
. Однако, если вы пропустите что-то вроде splint
, вы получите три предупреждения:
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
Если вы серьезно относитесь к обнаружению всех ошибок, вам следует использовать более одного инструмента.
В вашем вопросе есть небольшой нюанс, который мне не сразу очевиден из-за того, как он сформулирован.
Если вы думаете, что GCC ( в частности, GCC) должен выдать предупреждение здесь, тогда некоторые параметры компилятора могут помочь (см. другие ответы).
Если вы считаете, что любой компилятор должен выдавать предупреждение здесь (и я, кажется, прочитал это мнение в ваш вопрос), то ... ну, "предупреждения" никоим образом не являются обязательными и даже де-факто унифицированными. Здесь нет «следует».
-Wall не совсем означает -Wall , -Wextra уже подвергается критике за то, что слишком педантичен.
Как сказал Кристоф, вы ищете -Wconversion. Хорошо разобраться в том, что на самом деле включают -Wall и -Wextra, и просто указать флаги -W, которые вы хотите использовать в вашем файле make, особенно если рассматривать предупреждения как ошибки.
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.
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.