Использование splint для статического анализа кода на windowsms с MPLAB как избежать ошибок парсинга системных файлов

Я использую MPLAB X (3.26) с PIC32 на Windows (компилятор XC32 v1.40). Я пытаюсь использовать шину для статического анализа чьего-то кода в рамках проверки. У меня есть большинство определений компилятора и отсортированные пути поиска, но я немного озадачен, когда дело доходит до предотвращения ошибок синтаксического анализа в стандартных файлах включения PIC32.

Команда, которую я использую для запуска шины,

splint ^
-D"__32MX370F512L__" ^
-D"__PIC32_FEATURE_SET__"=370 ^
-D"__LANGUAGE_C__" ^
+I"C:/Program Files (x86)/Microchip/xc32/v1.40/pic32mx/include/" ^
main.c

Затем вывод дает

< Location unknown >: Field name reused:
Code cannot be parsed.  For help on parse errors, see splint -help
parseerrors. (Use -syntax to inhibit warning)
< Location unknown >: Previous use of
< Location unknown >: Previous use of

.... approx 100 times then...

C:\Program Files (x86)\Microchip\xc32\v1.40\pic32mx\include\\stddef.h(4,18):
Datatype ptrdiff_t declared with inconsistent type: long int
A function, variable or constant is redefined with a different type. (Use
-incondefs to inhibit warning)
load file standard.lcd: Specification of ptrdiff_t: arbitrary integral type
C:\Program Files (x86)\Microchip\xc32\v1.40\pic32mx\include\\stddef.h(5,27):
Datatype size_t declared with inconsistent type: unsigned long int
load file standard.lcd: Specification of size_t:
arbitrary unsigned integral type
C:\Program Files (x86)\Microchip\xc32\v1.40\pic32mx\include\\stddef.h(6,13):
Datatype wchar_t declared with inconsistent type: int
load file standard.lcd: Specification of wchar_t: arbitrary integral type
C:\Program Files (x86)\Microchip\xc32\v1.40\pic32mx\include\\stdarg.h(75,36):
No type before declaration name (implicit int type): __builtin_va_list :
int
A variable declaration has no explicit type.  The type is implicitly int.
(Use -imptype to inhibit warning)
C:\Program Files (x86)\Microchip\xc32\v1.40\pic32mx\include\\stdarg.h(75,36):
Parse Error: Suspect missing struct or union keyword: __builtin_va_list :
int. (For help on parse errors, see splint -help parseerrors.)
*** Cannot continue.

Последнее заставляет вещи останавливаться. Я пробовал такие вещи, как -skip-iso-headers, но безуспешно. Кажется, у него проблемы с файлом standard.lcd и стандартными файлами xc32.

Может ли кто-нибудь сказать мне

  • Что < Location unknown >: Field name reused: означает или, возможно, имеет в виду?
  • Способ устранить ошибку синтаксического анализа из-за файлов заголовков std?

Пока единственный способ решить проблему с заголовочным файлом - определить типы, например.

-D"__builtin_va_list"=int ^

person spitz    schedule 07.04.2016    source источник
comment
отредактированный вопрос, чтобы показать один из найденных способов обойти ошибку синтаксического анализа   -  person spitz    schedule 12.04.2016


Ответы (2)


Я думаю, что ваш код (или какой-то код, который вы #include) использует анонимные битовые поля и/или структуры. Анонимные структуры и анонимные объединения предоставляются расширением GNU для версий C раньше, чем C11. Поскольку Splint не знает о C11 (я нашел упоминания о C99 только в руководстве и google согласен) и только частичная поддержка расширений GNU (поиск gnu-extensions), с трудом анализирует их.

У меня была аналогичная проблема с некоторым кодом, написанным для PIC18f46k22, хотя я использовал sdcc вместо XC8.

Проблема была с pic18f46k22.h, который имел анонимные структуры (в частности, битовые поля) внутри объединения typedef.

Этот код...

typedef union
  {
  struct
    {
    unsigned name0              : 1;
    unsigned name1              : 1;
    unsigned name2              : 1;
    unsigned name3              : 1;
    unsigned name4              : 1;
    unsigned                    : 1;
    unsigned                    : 1;
    unsigned                    : 1;
    };

  struct
    {
    unsigned name               : 6;
    unsigned                    : 2;
    };
  } __NAMEbits_t;

... вызовут эти ошибки...

< Location unknown >: Field name reused:
Code cannot be parsed.  For help on parse errors, see splint -help
parseerrors. (Use -syntax to inhibit warning)
< Location unknown >: Previous use of

... но этот код не будет.

  struct indv
    {
    unsigned name0              : 1;
    unsigned name1              : 1;
    unsigned name2              : 1;
    unsigned name3              : 1;
    unsigned name4              : 1;
    unsigned                    : 1;
    unsigned                    : 1;
    unsigned                    : 1;
    };
  struct all
    {
    unsigned name               : 6;
    unsigned                    : 2;
    };

  typedef union
    {
    struct indv individualbits;
    struct all  allbits;
    } __NAMEbits_t;
person EchoLynx    schedule 24.10.2016
comment
Спасибо за это, вы, вероятно, правы, к сожалению, компании переехали, поэтому больше не могу получить доступ к коду для подтверждения... - person spitz; 10.02.2017

Я работаю с другим процессором, компилятором и инструментом статического анализа (PRQA/Helix QAC), но я думаю, что мы сталкиваемся с одной и той же проблемой, связанной с анализом стандартных файлов заголовков. Мне потребовалось некоторое время, чтобы понять, что происходит.

С одной стороны, я могу сказать, что ваш обходной путь достаточно хорош, и, по-видимому, вам не следует слишком беспокоиться об этом. Я использовал немного другой обходной путь, описанный здесь: Pycparser не работает с предварительно обработанным кодом

-D __builtin_va_list = struct __builtin_va_list {}

Я предполагаю, что другим способом было бы использование стандартных заголовков-заглушек вместо настоящих. Например, в моем руководстве к инструменту утверждается, что такие заголовочные файлы должны поставляться с инструментом, хотя я их еще не нашел/не получил.

person Dainius    schedule 22.12.2020