2009-11-30 3 views
3

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

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

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

ответ

4

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

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

+0

ОК, я думаю, что я буду придерживаться шины. Спасибо, что объяснили это. – Makis

+1

Я использовал как разреженные, так и шинные, редкие имеет несколько отличных предупреждений, которые не найдены clang/gcc/splint/mvcs/splint/cppcheck, они 1) 0 используются как NULL - зависит от вашего стиля кода, но это может сделать для более читаемого кода. 2) предлагать функции статическими или включать заголовок, объявляющий их, infact. Я обнаружил, что это может исправить реальные ошибки, поскольку, если объявление в заголовке и источнике имеет вызов с рассогласованием, может легко сбой. – ideasman42

+0

Разрешает ли разреженный инструмент проблемы, связанные с endian (make c = 2 cf = "- D__CHECK_ENDIAN__"), только когда мы используем макросы, такие как __le32_to_cpu()? Или он может идентифицировать все типы связанных с контентом проблем, таких как битполы, объединение и т. Д.? – linuxfreak

1

Если вы посмотрите на limits.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__ неопределенное перед включением limits.h

+0

На самом деле это не похоже на мои пределы. H. Нет #ifdef, а для INT_MAX установлено значение __INT_MAX__. Это, по крайней мере, предложения KDevelop. Но я думаю, что я пропускаю шину в соответствии с объяснением tinkertim. Я дам ему «правильный ответ», потому что он объяснил концепцию, даже если ваш ответ правильный. – Makis

 Смежные вопросы

  • Нет связанных вопросов^_^