Perché dovremmo voler disabilitare gli avvisi del compilatore?

26

Questa risposta e i commenti aggiunti mostrano un modo per disabilitare diversi avvisi del compilatore usando #pragma direttive.

Perché uno vorrebbe farlo? Di solito gli avvertimenti ci sono per una ragione, e ho sempre pensato che fossero buone ragioni. C'è un "caso valido" in cui gli avvertimenti dovrebbero essere disabilitati? In questo momento non riesco a pensare a nessuno, ma forse sono solo io.

    
posta takrl 24.06.2011 - 08:58
fonte

9 risposte

10

Ho sempre avuto solo una situazione in cui ho disabilitato un avvertimento. Considero gli errori di avviso quindi non rilascerei normalmente con avvisi. Tuttavia, durante lo sviluppo di un'API presso un cliente, ho affrontato il problema che un metodo che era necessario in una fase di migrazione da parte di un'applicazione e che nessun altro avrebbe dovuto mai utilizzare doveva essere incluso nella libreria.

Il modo migliore che ho trovato per dire a tutti gli utenti dell'API che non dovevano chiamare questo metodo era contrassegnarlo come obsoleto. Ciò, tuttavia, significava che l'unico caso d'uso valido era contrassegnato come avviso di compilazione.

Eric Lippert ha scritto alcuni post sugli avvertimenti in cui troverai informazioni su come il team del compilatore pensa agli avvertimenti.

Campi interni di tipi interni

Non usato l'uso delle direttive non è contrassegnato con gli avvisi

    
risposta data 24.06.2011 - 09:30
fonte
10

Ecco alcuni avvisi in cui la documentazione fornisce i motivi per cui potresti volerli disabilitare:

Altri esempi includono avvertimenti sull'utilizzo di metodi deprecati se sai che vuoi ancora utilizzare il vecchio metodo o avere membri privati che non vengono mai letti localmente, ma con una riflessione.

Nella mia esperienza C # ha meno bisogno di disabilitare gli avvisi rispetto ad altri linguaggi come C ++. Questo in gran parte perché, come dice Eric Lippert nel suo blog ," cercano di riservare avvisi solo per quelle situazioni in cui possiamo dire con certezza che il codice è rotto, fuorviante o inutile. "

    
risposta data 24.06.2011 - 09:18
fonte
8

Un esempio in C che incontro regolarmente con varianti:

int doSomething(int argument1)
{
#ifdef HARDWARE_TYPE_A
    performAction(argument1);
#else
    displayNotSupportedMessage();
#endif
}

L'argomento è rilevante solo su alcune piattaforme, ma su quelle in cui non è rilevante il mio compilatore si lamenterà, e dal momento che ho gli avvisi convertiti in errori che impedirà la creazione.

La conversione degli avvisi in errori richiede praticamente un escape hatch per "non questo, lo so meglio del compilatore in questo caso".

    
risposta data 23.06.2016 - 15:27
fonte
6

Molte librerie Java indispensabili non sono mai state aggiornate per eliminare la necessità di tipi non sicuri. La soppressione di tali avvisi è necessaria in modo che altri avvertimenti più importanti vengano rilevati e corretti.

    
risposta data 25.06.2011 - 16:37
fonte
5

Realizzo lavori incorporati e mi sembra di ricordare un paio di volte in cui ho disattivato gli avvisi perché stavo facendo qualcosa che sembrava inutile al compilatore, ma che in realtà aveva effetti reali nell'hardware.

L'unica altra volta è quando sto lavorando su basi di codici con idee disparate su qualche struttura dati (come come rappresentare array di byte - char o unsigned char?). In questi casi, potrei disabilitare gli avvisi perché l'alternativa è passare giorni interi a passare il codice e modificare una porzione o inserire centinaia di calchi.

    
risposta data 26.06.2011 - 19:42
fonte
3

Ci sono parecchi motivi per disattivare selettivamente gli avvisi del compilatore, anche per i progetti che si sforzano di ottenere le migliori pratiche.

  • Diversi compilatori (o versioni diverse degli stessi compilatori) :
    I compilatori gestiscono gli avvertimenti in modi diversi sottilmente. Dare avvisi di falsi positivi che non hanno impatto sugli altri compilatori. In questo caso, potrebbe aver senso disabilitare l'avviso per quei compilatori, invece di modificare un codice valido per mettere a tacere un avviso falso positivo che influisce solo su determinati compilatori, specialmente per compilatori più vecchi che alla fine non saranno comunque supportati.
  • Con codice generato:
    Alcuni avvisi relativi all'igiene del codice (codice morto, corpo duplicato di istruzioni condizionali, confronti che superano i limiti di tipo) possono essere ignorati in modo sicuro poiché sono innocui e il compilatore li ottimizzerà.
    Generare codice che non sollevi questi avvertimenti innocui è ovviamente anche un'opzione, ma potrebbe essere più un problema quindi vale la pena.
  • Avvertimenti per il codice esterno:
    Forse si utilizza un'implementazione di checksum qsort o md5 ben nota che è inclusa nel progetto. Il codice è utilizzato da molti progetti e funziona bene, tuttavia potrebbero esserci alcuni avvertimenti schizzinosi che normalmente sono corretti per il proprio codice.
    Per il codice esterno, tuttavia, potrebbe essere meno semplice disabilitare l'avviso (assumendo che sicuramente è innocuo).
  • Avvisi causati dalle intestazioni di sistema:
    Anche se GCC / Clang ad esempio supporta -isystem , ci sono casi in cui le differenze nelle intestazioni di sistema causano avvertimenti che possono essere ignorati (forse una funzione ha un valore di ritorno firmato su un sistema ma non un altro), attivando gli avvisi di -Wsign-compare .
    Un altro caso potrebbe essere definito nelle macro nelle intestazioni di sistema, è possibile copiare e incollare le macro nel proprio codice per modificarle, ma tutto sommato è meglio non preoccuparsi su come mantenere le macro da librerie di terze parti ... quindi è meglio tacere l'avvertimento (forse la macro manca un cast causando -Wsign-conversion eg).
  • Avvisi non utilizzati nel codice stub:
    Si può avvertire di parametri inutilizzati, tuttavia quando si esegue lo stub di un'intera libreria in un singolo file che contiene solo funzioni stub - non è utile forzare (void)arg1; (void)arg2; (void)arg3; ... nel corpo di ogni stub function.
    Meglio sopprimere -Wunused-parameter in questo caso.

Tieni presente che in tutti questi esempi, la disattivazione degli avvisi non significa nascondere bug reali, ad esempio: -Wredundant-decls , -Wunused-parameter , -Wdouble-promotion , forse -Wpedantic ... e che tu sai cosa stai facendo!

    
risposta data 24.06.2016 - 02:44
fonte
2

Valido o no, a volte viene fatto per bypassare la direttiva "trattare gli avvertimenti come errori" sul build server.

Oltre a questo non riesco a pensare a nessuno dei due. Gli avvertimenti disabilitati sono di solito un segno di un "brutto presentimento" ...

    
risposta data 24.06.2011 - 09:02
fonte
2

L'ultima volta che abbiamo disattivato alcuni avvisi, era perché uno stagista ci aveva lasciato con un codice errato. Ho funzionato molto meglio, con chiari limiti di conversione che sostituiscono la rappresentazione casuale dei dati.

Nel frattempo, dovevamo compilarlo e volevamo l'opzione "warnings is errors", quindi abbiamo soppresso alcuni degli avvertimenti.

    
risposta data 24.06.2011 - 17:15
fonte
2

Attualmente, l'unico avviso che ignoro è

  warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)  

Perché microsoft non implementa le specifiche C ++ (la documentazione dice anche che non lo fanno!) e consente alle funzioni di dichiarare specifici lanci e tutte le funzioni possono solo lanciare throw () o throw (...), cioè niente o tutto.

Da HelpViewer 1.1:

 A function is declared using exception specification, which Visual C++ accepts but does not implement. Code with exception specifications that are ignored during compilation may need to be recompiled and linked to be reused in future versions supporting exception specifications. 
    
risposta data 25.06.2011 - 21:32
fonte

Leggi altre domande sui tag