разреженных не предназначено, чтобы быть 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, что делает его намного проще взломать.
ОК, я думаю, что я буду придерживаться шины. Спасибо, что объяснили это. – Makis
Я использовал как разреженные, так и шинные, редкие имеет несколько отличных предупреждений, которые не найдены clang/gcc/splint/mvcs/splint/cppcheck, они 1) 0 используются как NULL - зависит от вашего стиля кода, но это может сделать для более читаемого кода. 2) предлагать функции статическими или включать заголовок, объявляющий их, infact. Я обнаружил, что это может исправить реальные ошибки, поскольку, если объявление в заголовке и источнике имеет вызов с рассогласованием, может легко сбой. – ideasman42
Разрешает ли разреженный инструмент проблемы, связанные с endian (make c = 2 cf = "- D__CHECK_ENDIAN__"), только когда мы используем макросы, такие как __le32_to_cpu()? Или он может идентифицировать все типы связанных с контентом проблем, таких как битполы, объединение и т. Д.? – linuxfreak