2009-03-21 23 views
6

Savez-vous comment faire pour que splint ignore où je déclare mes variables?Comment faire pour que splint ignore où je déclare mes variables?

Je sais que l'ancienne école vous dit de déclarer les variables directement au commençant dans chaque fonction, mais comme je suis une mauvaise personne, j'aime déclarer les choses près de l'endroit où je les utilise. Un bon exemple est de mettre int i; juste avant le pour (i = 0; ...).

Prenons un exemple très simple

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

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

    return 0; 
} 

Ici attelle et les plus anciens compilateurs c aimeraient se déplacer int i; en haut d'une ligne, ou pour mettre {} autour de la déclaration et de la boucle for.

Et maintenant à la question, comment désactiver cette vérification? Mais gardez les autres contrôles qui sont bons?

Merci Johan


Note 1: J'utilise déjà des avertissements gcc (voir ci-dessous) comme première ligne de défense, et valgrind comme deuxième. Mais je pense à ajouter une attelle à ma liste des choses qui pourraient contrôler ma stupidité ;-) Mais ce contrôle est tout simplement ennuyeux,

Les avertissements gcc J'utilise: -Wall -W -Wextra -Wconversion - Wshadow -Wcast-qual -Wwrite-cordes -Werror

Note 2: Je connais les problèmes de portabilité potentiels qui pourraient provenir de ce mauvais comportement. Mais je pense qu'il augmente la lisibilité, alias ne pas avoir besoin de sauter de haut en bas pour rechercher ce type de déclarations est plus précieux (et nous pouvons discuter dans un autre thread).


Mise à jour: Un peu plus d'informations, je mets le code ci-dessus dans un fichier appelé main.c. plate-forme utilisée est Ubuntu 8.04 et gvim comme rédacteur en chef, et c'est la sortie de l'attelle quand je le lance:

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.) 

Et cela ouvre 2 autres questions que je ne pensais pas auparavant.

  1. "redondant avec la valeur actuelle", quelle valeur actuelle?

  2. Pourquoi est-ce une erreur d'analyse et non un avertissement?


Mise à jour:: Il y a une attelle à posibility patch pour soutenir ce problème, je n'ai pas essayé, mais encore, mais je pense qu'il est la solution.

+1

Pendant que vous y êtes, vous devez déclarer int dans l'instruction for. – starblue

+0

Recevez-vous un avertissement ennuyeux ou une erreur d'analyseur? –

+0

et c'est l'espace entre "int" et "i" qui cassent l'attelle? – Johan

Répondre

7

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

Vous devriez être en mesure de nourrir que par -P2 patch si vous êtes dans le répertoire attelle/src, puis il devrait tout reconstruire.

C'est de cet e-mail: (. Désolé l'espacement sur ce) http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

Vous vous rendrez compte que finalement si vous suivez le fil starblue lié, mais je pensais que je passerais à la fin pour vous.

L'attelle semble être sans mainteneur pour le moment, malheureusement. J'envisagerais d'intensifier et d'en faire plus si je n'étais pas si occupé. Jake

+0

J'ai juste essayé d'appliquer ce patch aux sources de l'attelle 3.1.2. J'ai eu des erreurs de syntaxe quand j'ai essayé de le construire. J'ai aussi eu des erreurs de syntaxe quand j'ai essayé de construire l'attelle 3.1.2 * sans * le patch. –

2

Habituellement, avec attelle, si quelque chose peut être supprimée il va dire « supprimer ce avec + thisflag ou -thisflag »

Vous pouvez essayer attelle + gnuextensions foo.c, qui tourne le (plus) GNU/GCC extensions que l'attelle serait autrement en conflit avec. J'utilise une attelle presque aussi souvent que j'utilise valgrind.

Edit:

Comme d'autres l'ont dit, votre course dans l'analyseur (pas l'analyseur), de sorte que les drapeaux ne vont pas vraiment aider dans ce cas.

+0

- "Ligne de commande: Réglage + gnuextensions redondant avec la valeur actuelle", il y a quelque chose qui bloque. – Johan

3

Je ne suis pas familier avec attelle, mais de their FAQ:

Splint est indépendant de votre compilateur . Il vérifie le code C standard, conformément à la spécification ISO C99 . Splint supporte le plus, mais pas tous, des extensions C99 à l'ANSI C. Splint supporte certains des les extensions du compilateur gcc (si + gnuextensions est utilisé).

La position de votre déclaration est parfaitement conforme à C99, donc peut-être que vous pourriez considérer cela comme un bug dans l'attelle. Ou c'est l'une des "extensions" non encore supportées par splint. De toute façon, ils peuvent être intéressés par vos commentaires. Il ne devrait pas y avoir de raison pour qu'un outil de peluches compatible C99 se plaint des déclarations de variables.

5

This thread sur la liste de diffusion Splint traite du problème.

Il semble que l'analyseur soit principalement C89/C90, seule la bibliothèque semble être C99.

Étant donné que le problème provient de l'analyseur, vous ne pouvez pas le faire disparaître en définissant des indicateurs.

+1

Je pense que vous avez raison, mais j'envoie un mail à cette liste pour le savoir. http://www.cs.virginia.edu/pipermail/splint-discuss/2009-March/001288.html Voyons voir ce qui se passe. – Johan