Domanda

Di seguito è riportato un codice ovviamente difettoso per il quale penso che il compilatore dovrebbe emettere una diagnostica. Ma né gcc 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.

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top