Использование Sparse для проверки кода C - PullRequest
4 голосов
/ 30 ноября 2009

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

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

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

Ответы [ 2 ]

5 голосов
/ 30 ноября 2009

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

В вашем примере вы либо хотите определить GNU_SOURCE (который, я считаю, включает __GNUC__), который выставляет биты, которые вам нужны в пределах .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, что делает его намного проще взломать.

1 голос
/ 30 ноября 2009

Если вы посмотрите на limit.h, вы увидите, что INT_MAX определен внутри этого #, если

/* 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

...