Pregunta

¿Alguien tiene experiencia con Sparse ? Parece que no puedo encontrar ninguna documentación, por lo que las advertencias y los errores que produce no están claros para mí. Intenté revisar la lista de correo y la página de manual, pero tampoco hay mucho en eso.

Por ejemplo, uso INT_MAX en uno de mis archivos. Esto genera un error (identificador indefinido) a pesar de que #incluyo limit.h.

¿Hay algún lugar donde se hayan explicado los errores y advertencias?

¿Fue útil?

Solución

Sparse no pretende ser una pelusa, por decir. Sparse está destinado a producir un árbol de análisis de código arbitrario para que pueda analizarse más a fondo.

En su ejemplo, desea definir GNU_SOURCE (que creo que activa __GNUC__), que expone los bits que necesita en los límites. h

Evitaría definir __GNUC__ por sí solo, ya que varias cosas que activa podrían comportarse de manera indefinida sin que todos los otros interruptores que GNU_SOURCE active estén definidos.

Mi punto no es ayudarlo a aplastar el error por error, es reiterar que el escaso se usa principalmente como una biblioteca, no como una herramienta de análisis estático independiente.

De mi copia del archivo README (no estoy seguro si tengo la versión actual):

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.

Los clientes incluidos son más 'conjuntos de pruebas funcionales y ejemplos' que cualquier otra cosa. Es una herramienta muy útil, pero puede considerar otro ángulo de uso si desea emplearlo. Me gusta porque no usa * lex / bison, lo que hace que sea notablemente más fácil de hackear.

Otros consejos

Si observa los límites, verá que INT_MAX está definido dentro de este #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

así que para que funcione, debe definir __GNUC__ antes de incluir los límites.h

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top