Question

Quelqu'un at-il une expérience avec Sparse ? Il me semble impossible de trouver de la documentation, donc les avertissements et les erreurs qu’elle produit ne me sont pas clairs. J'ai essayé de consulter la liste de diffusion et la page de manuel, mais il n'y en a pas beaucoup non plus.

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

Existe-t-il un endroit où les erreurs et les avertissements ont été expliqués?

Était-ce utile?

La solution

Sparse n'est pas destiné à être une charpie, à proprement parler. Sparse est destiné à produire un arbre d’analyse de code arbitraire afin qu’il puisse être analysé plus en détail.

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

J'éviterais de définir __GNUC__ seul, car plusieurs éléments activés pourraient se comporter de manière indéfinie sans que tous les autres commutateurs activés par GNU_SOURCE ne soient définis.

Mon but n'est pas de vous aider à écraser les erreurs par erreur, mais de rappeler que peu de ressources sont principalement utilisées comme bibliothèque, et non comme outil d'analyse statique autonome.

À partir de ma copie du fichier LISEZMOI (ne sachant pas 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 davantage des "suites de tests fonctionnels et des exemples" qu'autre chose. C'est un outil très utile, mais vous pouvez envisager un autre angle d'utilisation si vous souhaitez l'utiliser. Je l’aime bien parce qu’il n’utilise pas * lex / bison, ce qui le rend remarquablement plus facile à pirater.

Autres conseils

Si vous regardez le fichier limits.h, vous verrez que INT_MAX est défini dans ce #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

donc, pour que cela fonctionne, vous devez définir __ GNUC __ avant d'inclure limits.h

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top