Вопрос

Кто-нибудь имеет опыт работы с Sparse ? Кажется, я не могу найти какую-либо документацию, поэтому предупреждения и ошибки, которые она вызывает, мне неясны. Я попытался проверить список рассылки и справочную страницу, но там тоже не так много.

Например, я использую INT_MAX в одном из моих файлов. Это приводит к ошибке (неопределенный идентификатор), хотя я #include limit.h.

Есть ли место, где ошибки и предупреждения были объяснены?

Это было полезно?

Решение

Разумеется, что Sparse не должен быть ворсом. Разреженный предназначен для создания дерева разбора произвольного кода, чтобы его можно было дополнительно проанализировать.

В вашем примере вы либо хотите определить GNU_SOURCE (который, я считаю, включает __GNUC__), который выставляет биты, которые вам нужны в limit.h

Я бы не стал определять __GNUC__ сам по себе, поскольку некоторые из активируемых им функций могут вести себя неопределенным образом без определения всех других переключателей, которые включает GNU_SOURCE.

Моя цель не в том, чтобы помочь вам исправить ошибку по ошибке, а в том, чтобы подтвердить, что разреженность в основном используется как библиотека, а не как самостоятельный инструмент статического анализа.

Из моей копии README (не уверен, что у меня есть текущая версия):

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.

Включенные клиенты - это больше «наборы и примеры функциональных тестов», чем все остальное. Это очень полезный инструмент, но вы можете рассмотреть другой угол использования, если хотите его использовать. Мне это нравится, потому что он не использует * lex / bison, что значительно облегчает его взлом.

Другие советы

Если вы посмотрите на limit.h, вы увидите, что INT_MAX определен внутри этого #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

поэтому, чтобы заставить его работать, вы должны отменить определение __ GNUC __ , прежде чем включать limit.h

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top