我在Windows上使用带有PIC32的MPLAB X(3.26)(XC32 v1.40编译器)。我正在尝试使用splint对某些代码进行静态代码分析,作为评论的一部分。我已经对大多数编译器定义和搜索路径进行了排序,但是在避免PIC32 std包含文件中的解析错误方面有点难过。
我用来运行夹板的命令是
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 std文件
的问题任何人都可以告诉我
< Location unknown >: Field name reused:
的含义或可能指的是什么?到目前为止,解决头文件问题的唯一方法是定义类型,例如
-D"__builtin_va_list"=int ^
答案 0 :(得分:0)
我认为你的代码(或你的#include的一些代码)正在使用匿名位域或/和结构。对于早于C11的C版本,GNU extension提供匿名结构和匿名联合。由于Splint不了解C11(我只在manual和google agrees)和only partial support for the GNU extensions中找到了C99的提及(搜索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;
答案 1 :(得分:0)
我正在使用不同的处理器、编译器和静态分析工具 (PRQA / Helix QAC),但我认为我们在标准头文件的解析问题方面面临同样的问题。我花了一些时间才弄清楚发生了什么。
一方面,我可以说您的解决方法已经足够好了,显然您不必担心太多。我使用了此处描述的略有不同的解决方法: Pycparser not working on preprocessed code
-D __builtin_va_list = struct __builtin_va_list {}
我想另一种方法是使用存根标准标头而不是真正的标头。例如,我的工具手册声称该工具应该提供这样的头文件,尽管我还没有找到/获得它们。