2009-11-30 9 views
3

Quelqu'un at-il une expérience avec Sparse? Je semble incapable de trouver de la documentation, de sorte que les avertissements et les erreurs qu'elle produit ne sont pas clairs pour moi. J'ai essayé de vérifier la liste de diffusion et la page de manuel mais il n'y en a vraiment pas beaucoup non plus.En utilisant Sparse pour vérifier le code C

Par exemple, j'utilise INT_MAX dans un de mes fichiers. Cela génère une erreur (identifiant indéfini) même si #include limits.h.

Y at-il lieu où les erreurs et les avertissements ont été expliqués?

Répondre

4

Sparse n'est pas destiné à être une peluche, par exemple. Sparse est destiné à produire un arbre d'analyse de code arbitraire afin qu'il puisse être analysé plus avant.

Dans votre exemple, soit vous voulez définir GNU_SOURCE (que je crois tourne sur __GNUC__), qui expose les bits dont vous avez besoin limits.h

Je voudrais éviter de définir __GNUC__ lui-même, comme plusieurs choses qu'il Activates peut se comporter de manière indéfinie sans tous les autres commutateurs que GNU_SOURCE active.

Mon point est de ne pas vous aider par erreur de squash erreur, son réitérer que clairsemés est surtout utilisé comme une bibliothèque, et non comme un stand alone outil d'analyse statique.

De ma copie du README (pas sûr si j'ai la version actuelle):

This means that a user of the library will literally just need to do 

    struct string_list *filelist = NULL; 
    char *file; 

    action(sparse_initialize(argc, argv, filelist)); 

    FOR_EACH_PTR_NOTAG(filelist, file) { 
    action(sparse(file)); 
    } END_FOR_EACH_PTR_NOTAG(file); 

and he is now done - having a full C parse of the file he opened. The 
library doesn't need any more setup, and once done does not impose any 
more requirements. The user is free to do whatever he wants with the 
parse tree that got built up, and needs not worry about the library ever 
again. There is no extra state, there are no parser callbacks, there is 
only the parse tree that is described by the header files. The action 
function takes a pointer to a symbol_list and does whatever it likes with it. 

The library also contains (as an example user) a few clients that do the 
preprocessing, parsing and type evaluation and just print out the 
results. These clients were done to verify and debug the library, and 
also as trivial examples of what you can do with the parse tree once it 
is formed, so that users can see how the tree is organized. 

Les clients inclus sont plus « suites de tests fonctionnels et des exemples » qu'autre chose. C'est un outil très utile, mais vous pourriez envisager un autre angle d'utilisation si vous voulez l'utiliser. Je l'aime parce qu'il n'utilise pas * lex/bison, ce qui le rend remarquablement plus facile à pirater.

+0

OK, je pense que je vais rester avec une attelle alors. Merci d'avoir expliqué cela, cependant. – Makis

+1

Je l'ai utilisé à la fois rares et attelle, rares a quelques avertissements astucieuses qui ne sont pas trouvés par clang/gcc/attelle/CVM/attelle/cppcheck, ils sont 1) 0 utilisé comme NULL - dépend de votre style de code mais cela peut faire pour le code plus lisible. 2) suggérer des fonctions statiques - ou inclure l'en-tête qui les déclare, en fait je trouve que cela peut réparer de vrais bugs puisque si la déclaration dans l'en-tête et la source ont un conflit d'appariement peut facilement se bloquer. – ideasman42

+0

Est-ce que l'outil clairsemé identifie les problèmes liés à l'endian (faites c = 2 cf = "- D__CHECK_ENDIAN__") seulement quand nous utilisons des macros comme __le32_to_cpu()? Ou peut-il identifier tous les types de questions liées à l'endianness comme les champs de bits, union, etc.? – linuxfreak

1

Si vous regardez limits.h vous verrez que INT_MAX est défini dans cette #if

/* If we are not using GNU CC we have to define all the symbols ourself. 
Otherwise use gcc's definitions (see below). */ 
#if !defined __GNUC__ || __GNUC__ < 2 

afin de l'obtenir pour vous travailler devriez __GNUC__ avant d'inclure annuler la définition limits.h

+0

En fait, ça ne ressemble pas à ça dans mes limites. Il n'y a pas de #ifdef et INT_MAX est défini sur __INT_MAX__. C'est au moins l'offre de KDevelop. Mais je pense que je saute l'attelle selon l'explication de Tinkertim. Je vais lui donner la "bonne réponse" parce qu'il a expliqué le concept, même si votre réponse est correcte, aussi. – Makis