2009-03-21 12 views
6

Sai come faccio a ignorare lo splint dove dichiaro le mie variabili?Come posso ignorare lo splint dove dichiaro le mie variabili?

so che la vecchia scuola c dice di dichiarare le variabili destra al a partire in ogni funzione, ma dato che io sono una persona cattiva mi piace dichiarare le cose vicino a dove li uso. Un buon esempio è quello di inserire int i; subito prima di for (i = 0; ...).

Facciamo un esempio molto semplice

#include <stdio.h> 
int main() 
{ 
    printf("Hello splint test\n"); 

    int i; 
    for(i=5;i>0;i--) 
    { 
     printf("%2d...\n",i); 
    } 

    return 0; 
} 

Qui stecca e la maggior parte vecchi compilatori C vorrebbero spostare int i; su una riga, o per inserire {} la dichiarazione e il ciclo for.

E ora alla domanda, come posso disattivare questo controllo? Ma mantenere gli altri assegni è buono?

Grazie Johan


Nota 1: Uso già avvertimenti gcc (vedi sotto) come prima linea di difesa off, e valgrind come secondo. ma sto pensando di aggiungere stecca alla mia lista di cose che potrebbero controllare la mia stupidità ;-) Ma questo controllo è solo fastidioso,

Le avvertenze gcc che uso: -Wall -W -Wextra -Wconversion - Wshadow -Wcast-qual -Wwrite-stringhe -Werror

Nota 2: Conosco i potenziali problemi di portabilità che potrebbero derivare da questo cattivo comportamento. Ma ritengo che aumenti la leggibilità, ovvero non sia necessario saltare su e giù per cercare questo tipo di dichiarazioni che sono più preziose (e questo possiamo discuterne in un'altra discussione).


Aggiornamento: Un po 'più di informazioni, ho messo il codice di cui sopra in un file chiamato main.c. piattaforma utilizzata è di Ubuntu 8.04 e gvim come redattore, e questo è l'uscita dalla stecca quando l'eseguo:

splint +gnuextensions main.c 
Splint 3.1.1 --- 03 Nov 2006 

Command Line: Setting +gnuextensions redundant with current value 
main.c:8:8: Parse Error. (For help on parse errors, see splint -help 
       parseerrors.) 

E questo apre altre 2 domande che non ho pensare prima.

  1. "ridondante con valore corrente", quale valore attuale?

  2. Perché è un errore di analisi e non un avviso?


Aggiornamento:: C'è una possibilita 'di patch di stecca per sostenere questo problema, non ho provato questo, ma ancora, ma penso che sia la soluzione.

+1

Mentre ci si trova, è necessario dichiarare l'int all'interno dell'istruzione for. – starblue

+0

Stai ricevendo un fastidioso avviso o un errore del parser? –

+0

ed è lo spazio tra "int" e "i" che interrompe lo splint? – Johan

risposta

7

Ecco una patch: http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

Dovreste essere in grado di alimentare che, attraverso patch di -P2 se siete nella directory stecca/src, e allora dovrebbe semplicemente ricostruire.

Questo è da questa e-mail: (. Mi dispiace per la spaziatura su quella) http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

Troverete che alla fine, se si segue la starblue filo collegato a, ma ho pensato di saltare fino alla fine per te.

Splint sembra essere senza un manutentore, purtroppo. Prenderò in considerazione l'idea di intensificare e fare ancora di più se non fossi così occupato.

Jake

+0

Ho appena provato ad applicare quella patch alle sorgenti di splint 3.1.2. Ho avuto errori di sintassi quando ho provato a crearlo. Ho anche avuto errori di sintassi quando ho provato a creare splint 3.1.2 * senza * la patch. –

2

Di solito, con la stecca, se qualcosa può essere soppresso si dirà "sopprimere questo con + thisflag o -thisflag"

Si potrebbe provare a stecca + gnuextensions foo.c, che si accende (la maggior parte) GNU/GCC estensioni che altrimenti sarebbero stordite con lo splint.

Uso lo splint quasi con la stessa frequenza con cui utilizzo valgrind.

Edit:

Come altri hanno detto, la vostra corsa nel parser (non l'analizzatore), in modo da bandiere in realtà non stanno andando per aiutare in questo caso.

+0

- "Riga di comando: Impostazione + gnuextensions ridondante con valore corrente", c'è qualcosa che blocca. – Johan

3

Non ho familiarità con la stecca, ma da their FAQ:

stecca è indipendente dal vostro compilatore. Controlla il codice C standard, secondo la specifica ISO C99 . Splint supporta la maggior parte, ma non tutte, delle estensioni C99 su ANSI C. Splint supporta alcune delle estensioni del compilatore gcc (se si utilizza + gnuextensions).

La posizione della dichiarazione è perfettamente conforme a C99, quindi forse si potrebbe considerare questo un errore in splint. O è una delle "estensioni" non ancora supportate da splint. In entrambi i casi potrebbero essere interessati al tuo feedback. Non ci dovrebbero essere motivi per cui uno strumento di lanugine conforme a C99 possa lamentarsi delle dichiarazioni variabili.

5

This thread nella mailing list di Splint discute il problema.

Sembra che il parser sia principalmente C89/C90, solo la libreria sembra essere C99.

Poiché il problema è con il parser non è possibile farlo sparire impostando i flag.

+1

Penso che tu abbia ragione, tuttavia invio una mail a quella lista per scoprirlo. http://www.cs.virginia.edu/pipermail/splint-discuss/2009-March/001288.html Vediamo cosa succede. – Johan