2010-01-29 23 views
3

我正在为HiTech C编译器编写很多代码。我确信我的代码会受益于像splint这样的静态检查器,但是夹板本身会在HiTech的一些扩展中跳闸,如cp0sfr声明。不过,我不能告诉夹板跳过HiTech标题,因为它不知道我的大多数标识符来自哪里。HiTech/Microchip C的免费静态检查器?

有谁知道可以应付这个静态检查?

添加:扩展示例: 大多数情况下,它只是新的类型限定符和绝对寻址,例如。

extern volatile cp0 unsigned int cp0_Config @ __REGADDR(16,0); 
extern volatile sfr unsigned long OC2R @ 0xBF; 

(另外还有persistent类型限定符。)

还有用于功能interruptfast预选赛:

void interrupt ExceptionHandler(void) @GENERAL_EXCEPTION 
{ 
    ... 
} 

补充:

我终于得到了周围尝试下面的Doug Currie的方法。我用SED的shell脚本去掉任何尾随的“... @ ...;”绝对定位的声明,跑分裂与

splint -D__32MX460F512L__ -Dsfr= -Dcp0= -Dmips32r2= -I ~/HiTechStripped mymodule.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 
< Location unknown >: Previous use of 
[this goes on for about 100 lines...] 

其他的模块,我得到:

../../../../HiTechStripped/stdlib.h:140:39: mismatched parentheses in #if 
    Preprocessing error. (Use -preproc to inhibit warning) 

这是错了这一点,因为据我所知:

#if defined(_XA_) && sizeof(double) == 8 

我想也许我应该放弃静态检查。感谢您的答案。

+0

您可以举一个例子说明这些扩展是如何在预处理之前或之后进行的? – 2010-01-29 08:42:32

回答

2

一种解决方法是创建新的头文件,这些头文件声明HiTech头文件中的标识符,并且仅与夹板一起使用。这对HiTech PIC18编译器适用于我。一旦找到所需的替代品,您应该能够自动生成替代标题。

+0

请参阅有关尝试此结果的注释。 – detly 2010-02-26 03:57:55

1

我相信Cppcheck应该能够分析代码。

+0

cppcheck似乎运行良好,但不会给我任何警告或错误。 – detly 2010-02-26 04:00:53

0

使用所有静态检查器,您必须指定要定义哪些命令行宏,以便您可以通过在运行检查器时定义一个宏(例如STATIC_ANLAYSIS)并使用该宏来屏蔽掉违反构造或提供替代品。一些扩展可以简单地在静态分析器命令行上重新定义,以便通过检查器。

我不熟悉编译器或它提供的扩展;也许如果你举几个例子,可以提出具体的解决方法?