Posso fare in modo che GCC avvisi il passaggio di tipi troppo ampi alle funzioni?
-
08-07-2019 - |
Domanda
Di seguito è riportato un codice ovviamente difettoso per il quale penso che il compilatore dovrebbe emettere una diagnostica. Ma né gcc
né g ++
, anche con tutte le opzioni di avvertimento che ho potuto pensare: -pedantic -Wall -Wextra
#include <stdio.h>
short f(short x)
{
return x;
}
int main()
{
long x = 0x10000007; /* bigger than short */
printf("%d\n", f(x)); /* hoping for a warning here */
return 0;
}
C'è un modo per mettere in guardia gcc
e g ++
? In una nota a margine, hai un altro compilatore che lo avverte per impostazione predefinita o in una configurazione di avvertenze extra abbastanza comune?
Nota: sto usando GCC (compilatori C e C ++) versione 4.2.4.
Modifica: ho appena scoperto che gcc -Wconversion
fa il trucco, ma la stessa opzione per g ++
no, e sto davvero usando C ++ qui, quindi Ho bisogno di una soluzione per g ++
(e ora mi chiedo perché -Wconversion
non sembra esserlo).
Modifica: http://gcc.gnu.org/bugzilla/show_bug. cgi? id = 34389 suggerisce che ciò potrebbe essere risolto in g ++ 4.4
... forse? Non mi è ancora chiaro se si tratta dello stesso problema e / o se la correzione sta davvero arrivando in quella versione. Forse qualcuno con 4.3 o 4.4 può provare il mio caso di test.
Soluzione
Usa -Wconversion - il problema è un cast implicito (conversione) da long x a short quando la funzione f (short x) è chiamata [non printf], e -Wconversion dirà qualcosa come " cast da long a short può modificare il valore " ;.
..
Modifica: ho appena visto la tua nota. -La conversione genera un avvertimento per me, usando g ++ 4.3.2 su Linux ... (4.3.2-1 su Debian)
Altri suggerimenti
Consiglio vivamente di investire in PC-lint / FlexeLint da Gimpel . Il software è fatto per catturare cose come questa che il compilatore non è. È relativamente economico e vale il prezzo. Esiste una demo online sul sito che puoi utilizzare per valutarla, ecco cosa riporta per la riga in questione dal tuo esempio:
diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)