2012-11-11 13 views
8

È possibile indicare a GCC di utilizzare il flag warn_unused_result per tutte le funzioni pur non avendo l'attributo corrispondente? Perché se posso dimenticare di verificare il valore restituito, posso anche dimenticare di aggiungere l'attributo specifico GCC.Rendi warn_unused_result applicato a tutte le funzioni con GCC

L'ho visto possibile con alcuni altri compilatori.

+0

Da rivedere la documentazione Direi che la risposta è no. Alternativa –

+0

: è possibile eseguire i programmi tramite splint, testando i valori di ritorno ignorati: http://www.splint.org – justin

+0

Quali compilatori lo supportano? – sinelaw

risposta

1

No, puoi solo dire a gcc di ignorare tutte le flag warn_unused_result con -Wno-unused-result ma il rispettivo -Wunused-result imposta solo l'impostazione predefinita (per avvisare solo sui flag). Compilare con -Wall -Wextra -pedantic dovrebbe aver attivato un avviso se può essere attivato ma non lo fa, quindi non può.

Oltre a ciò, mi chiedo perché lo vorrai, non è raro ignorare il risultato delle funzioni e tutte le librerie sono suscettibili di produrre tonnellate di avvertimenti.

+2

Stiamo scrivendo la nostra libreria e vogliamo escludere il maggior numero possibile di errori. Diversi giorni fa ho notato che uno dei nostri programmatori non ha controllato il risultato di __fread__. In effetti, tale caso è piuttosto raro, ma se succede a causa di risorse insufficienti su macchine embedded, la nostra lib deve gestirle senza crash master app. Quindi, vogliamo seguire quanti più controlli possibili. – PoltoS

+0

@PoltoS: Se si stesse usando C++, potrebbe esserci un modo per avvolgere i tipi di ritorno, ma sarebbe più o meno come "warn_unused_result". – bitmask

+0

Stiamo usando C ... Strano che GCC non fornisca tale flag. Può essere possibile modificarlo un po 'per "virtualmente" aggiungere una tale bandiera a ciascuna funzione? – PoltoS

0

Mentre non sembra possibile con GCC, è possibile eseguire analizzatori statici come coverity e lanugine per catturarli.

+0

Risposta piacevole dopo quasi 5 anni;) coverty è un SAAS. Non riesco a caricare il codice dell'azienda su server di terze parti. Inoltre, il server di terze parti non sa nulla del mio ambiente e dei file di sistema inclusi. Non ho trovato finora buoni analizzatori statici che non si lamentino di tipi specifici della piattaforma. – PoltoS

+0

Non sono sicuro che la coverity sia un'offerta SaaS. Il mio datore di lavoro usa la copertura e credo che nessun codice lasci i server dell'organizzazione. https://community.synopsys.com/s/question/0D53400003RpaYWCAZ/can-coverity-connect-be-installed-in-an-isolated-environment – Soorajchirag

0

C'è un plug-in clang, in elfs-clang-plugins (creato da me stesso, open source) che aiuta.

Anche se non per GCC, può comunque essere utile ad es. se è possibile aggiungerlo al proprio processo di gate-check CI (se ne hai uno) o semplicemente eseguirlo manualmente una volta ogni tanto.

Il plugin warn_unused_result emetterà un avviso per le funzioni che a mancano un attributo warn_unused_result. Il plugin considera solo le funzioni dichiarate o definite nell'unità di compilazione corrente, quindi le librerie esterne non aggiungono rumore.

Il plug-in accetta un argomento facoltativo, --static-only che lo induce ad avvertire solo sulle funzioni statiche (poiché quando si cambiano le API esterne è troppo lavoro).

Esempio:

int foo(void); 

uscita del compilatore:

/tmp/test.c:1:5: warning: missing attribute warn_unused_result 
int foo(void); 
Problemi correlati