真伪查询

  

  • 石家庄市平安北大街18号
    联系人:
  • 15033421942
    电话:

你是本文的第:467位游客!Lint的使用方法(一)

PC-Lint是一款C/C++软件代码静态分析工具,不仅可以检查一般的语法错误,还可以检查潜在的错误,比如数组访问越界、内存泄漏、使用未初始化变量、使用空指针等。在单元测试前使用PC-Lint来检查代码,可以提前发现程序中的潜在的错误,提高代码
的质量。
本文主要从两个方面介绍PC-lint,第一部分是在与不同的工具安装集成,第二部分是PC-lint的使用方法。

1. 安装PC-lint及如何集成到VC6.0和Source Insight
1.1 安装PC-lint
(1)下载PC-lint(PC-Lint 8.00w)。
(2)将下载的压缩包解压至到D盘,并对文件夹重命名为PC-Lint,这样路径为D:/PC-Lint。
备注:这也叫安?:)呵呵,似乎算免安装更合适吧。
1.2 将PC-lint集成到VC6.0
1.2.1 对单个C/C++进行静态代码分析
(1)将D:/PC-Lint/lnt 下的3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt复制到D:/PC-Lint/下。
(2)打开co-msc60.lnt,将该文件倒数第二行 lib-ole.lnt 的内容改为 D:/PC-Lint/lnt/lib-ole.lnt ,也就是在前面加上绝对路径,以免在后面的步骤中无法找到该文件。
(3)在D:/PC-Lint/下创建std.lnt和options.lnt两个文件,其中std.lnt的内容如下:

注:-i后面的路径名为VC 6.0的安装路径和及其头文件路径;options.lnt可以暂时为空。
(4)在VC6.0的菜单栏中,ToolsCustomizetools 新建一个名为pclint的项,在下面填入
项填入: D:/PC-Lint/lint-nt.exe
Argument 项填入: -u D:/PC-Lint/std.lnt D:/PC-Lint/env-vc6.lnt $(FilePath)

然后在Use Output Window 打上勾即可。
(5)在VC6.0的菜单栏Tools下多了一个pclint选项,打开一个VC项目后,就可以使用该选项对单个C/C++文件进行静态代码分析了。

1.2.2 对一个VC6.0项目进行静态代码分析
下面的步骤是在1.2.1的前三步的基础上进行的。
(1)先到 ~syring/win32/UnxUtils.zip下载UnxUtils.zip。需要利用unix中的find等命令来查找当前目录下的C和C++文件,然后再将它们送给lint程序处理。
(2)解压UnxUtils.zip到D盘,这样路径为D:/UnxUtils。
(3)在在VC6.0的菜单栏Tools下多了一个pclint_prj选项,打开一个VC项目后,就可以使用该选项对单个C/C++文件进行静态代码分析了。
项填入: D:/UnxUtils/usr/local/wbin/find.exe
Argument 项填入: $(FileDir) -name *.c -o -name *.cpp | D:/UnxUtils/usr/local/wbin/xargs D:/PC-Lint/lint-nt -i D:/UnxUtils/usr/local -u D:/PC-Lint/std.lnt D:/PC-Lint/env-vc6.lnt

然后在Use Output Window 打上勾即可。
(4)在VC6.0的菜单栏Tools下多了一个pclint_prj选项,打开一个VC项目后,就可以使用该选项对VC项目进行静态代码分析了。
注意: Argument 项填的内容一定要注意参数中的路径,如果你不使用上述路径,可以用新路径将参数中的路径替换,以免重新写参数而导致出错。

1.3 将PC-lint集成到Source Insight 3.5中
1.3.1 对单个C/C++进行静态代码分析
(1)打开SourceInsight, 选择OptionsmandsAdd, 输入pclint
(2)在Run中填写: D:/PC-Lint/lint-nt -u D:/PC-Lint/std.lnt D:/PC-Lint/env-vc6.lnt %f
(3)Dir不用填写,将Iconic Window, Capture Output, Parse Links in OutPut,三项勾选上,并将File,then Line的单项选择也选上。
(4)然后点右侧的Menu在弹出的界面中在下拉框Menu中选择View,然后在下面的Menu Cotents中选择 end of menu右侧点Insert即可。
(5)可以在Source Insight 3.5菜单View下看到刚才新建的项pclint,打开项目的任意一个待分析的源文件,运行pclint即可进行静态代码分析了。

1.3.2 对一个项目进行静态代码分析
下面的步骤是在1.2.2的基础上进行的。
(1)打开SourceInsight, 选择OptionsmandsAdd, 输入pclint_prj
(2)在Run中填写:
(3)Dir不用填写,将Iconic Window, Capture Output, Parse Links in OutPut,三项勾选上,并将File,then Line的单项选择也选上。
(4)然后点右侧的Menu在弹出的界面中在下拉框Menu中选择View,然后在下面的Menu Cotents中选择 end of menu右侧点Insert即可。
(5)可以在Source Insight 3.5菜单View下看到刚才新建的项pclint_prj,打开项目,运行pclint_prj即可对项目进行静态代码分析了。

2.PC-lint的用法

2.1 pc-lint目录下几个重要的文件及程序
lint-nt.exe:PC-lint的可执行程序。
config.exe: PC-lint的配置文件程序。
pc-lint.pdf:PC-lint的PDF格式的在线手册,本文的大部分内容是从中得来的。
msg.txt: 对于错误消息编号的详细解释。
Lnt/: 这个目录下有些东西还是值得认识一下。
colnt: 指定的编译器的可选编译文件。
co.lnt: 通用的可选编译文件。
slc 非ANSI编译器的标准库文件模块
sl.c: 非ANSI编译器的通用标准库文件模块
envlnt:不同平台下的可选文件,包括MS Visual Studio和其他各种编辑工具。
liblnt:可选文件, 特定的 有挑战性 的库文件。
aulnt: 可选文件, 作者们推荐的检测条件。

2.2 PC-lint的介绍
2.2.1 错误信息编号
对于大部分的错误消息,PC-lint都提供了一个关联的错误编号。小于1000的错误编号是分配给C语言的,1000以上的错误编号则是分配给C++语言的。1000呢?呵呵,被保留了。先看一个表格。
C C告警级别
语法错误(Syntax Errors) 1199 10011199 1
内部错误(Internal Errors) 200299 0
致命错误(Fatal Errors) 300399 0
告警(Warnings) 400699 14001699 2
提示(Informational) 700899 17001899 3
可选信息(Elective Notes) 900999 19001999 4

对于C语言,1~199是与语法错误;200~299是PC-lint内部错误,应该决不会发生的;300~399是致命错误,通常是由于超越了某些限制;400~699是警告消息,提示被检查的程序中可能存在错误;700~899是提示信息,这些提示信息可能有错误,也可能是合法的程序,取决于个人的编程风格;900~999则是一些称为可选信息,一般不会自动输出。

PC-lint提供了高级级别设置选项-wLevel,缺省的级别为3级。-w0w1w2w3w4 分别可以生成上述表格中对应告警级别和级别更低的告警,其中级别越低告警越重要。同样,也提供了处理库函数的头文件告警级别的选项-wlib(Level),缺省的级别也是3级,级别对应的含义与前者一样。

2.2.2 选项的规则
通过使用加号和减号以注释的形式插入代码中,来恢复和屏蔽指定的被检查的选项。格式如下:
或者
注意:lint必须是小写,选项的一行不能超过80个字符,否则导致致命的错误,错误信息的编号就是323。如果选项确实有很长,可以通过换行的方式来实现。另外屏蔽和恢复的选项的代码可以放在宏定义中,宏被展开后,这些选项会生效。

2.2.3 选项中的空格
因为空格是用来分隔选项的,除此之外只能出现在圆括号的旁边或是空格自身被引用(例如operator new按语法要求中间就有空格)。举个例子:
对于第三个,空格出现在圆括号的旁边,也出现在自身被引用的地方(operator new)。另外operator和new之间出现两个空格也是不合法的,因为它违反了语法规则。另外,也可以使用双引号( )来保护空格,例如:
- dWORD=unsigned short

2.2.4 选项的分类
PC-lint的选项有300多种,可以分为下面几类:
(1)禁止错误信息
选项开头使用 -e 可以禁止指定的错误消息,使用 +e 恢复指定的错误消息。如果禁止消息,只不过不让消息输出,并不影响PC-lint的处理过程。顺便提一下前面提到的 -wLevl ,这个选项是禁用指定级别及以上的消息的显示。

1)格式一:
-e# 禁止指定的错误消息,#代表数字或是数字匹配符,错误消息的编号为#。
+e# 恢复指定的错误消息,错误消息的编号为#。

举个例子:
第一行关闭了编号为504的错误消息,最后一个行则重新打开了编号为504的错误消息。其中数字也可以包含匹配符号,'?'匹配单个字符, * 匹配多个字符。
比如:
(1)-e7则关闭了700~799这个范围内的错误消息。
(2)-e1*, 则关闭了所有以1开头的编号的错误消息。
同样匹配符也能使用在-esymelibelibsymefileefuncemacroetemplatee(#)e(#)e{#} and e{#}.

2)格式二:
-e(#[,#]) 为下一个表达式禁止指定的错误消息,在这个表达式结束后被禁止的错误消息自动恢复,#代表数字或是数字匹配符,错误消息的编号为#。
举个例子:
它等价于下面的语句:
前一种方法更简单且更有效。

3)格式三:
--e( # [,#]) 比上面的那个管的更宽一些,它对整个表达式有效,举个例子就明白它与上面的区别了。
举个例子:
整个表示式是指*(int *)0*(char *)0,下个一表达式指的是*(int *)0。区别一目了然,例子中将禁止两个编号为413 的错误消息, 如果使用 -e(413) ,则只禁止第一个编号为 413 的错误消息。

4)格式四:
-e{ # [, #] } 对下一个语句或者声明有效
举个例子:
通过例子可以看出,这种格式放在函数之前,则对整个函数产生作用,放在赋值语句前则只对赋值语句起作用,放在if或while前面,则对这一段语句起作用。在C++的类定义或命名空间声明前放这么个选项,则将整个类或命名空间内的代码中指定的错误消息给禁止了。

5)格式五:
--e{ # [, #] } 对于其所处的 {} 号区域内的整个代码体有效。 {} 号区域可能是复杂的语句、函数体、C++的类,结构体或联合体的定义、C++的命名空间等。如果这个选项放在一个模块前,而模块前没有 {},则对整个模块生效。

6)格式六:
!e# 仅对其所在行有效。
在这个例子中,仅对那一行禁止编号为720 的错误消息。看一下C语言的代码的用法:
如果有更多的错误信息要禁止,而又无法使用通配符,则可以使用下面的方法:
n = u / -1; //lint !e573 !e721

7)格式七:
-ealetter 参数不匹配禁止

8)格式八:
+efile( #, file [, file]) re-enables

9)格式九:
+efunc( #, Symbol [, Symbol]) re-enables

10)格式十:
+elib( # [, #]) re-enables

11)格式十一:
+elibsym( # [, # ]) re-enables

12)格式十二:
+emacro( #, symbol)

13)格式十三:
--emacro( {#}, symbol, )

14)格式十四:
禁止和恢复指定的符号的错误消息。举个C++的例子(实际应用中不太可能出现):
分析结果中会提示某行的member X::f(double, int)没有被引用,为了屏蔽这个消息,你可以使用
符号的完整签名为X::f(double, int),然而符号的名字为X::f,而且可以使用符号的名字来禁止错误消息的出现。另外,-esym 和 -e# 选项是独立的,举个例子:
对于alpha来说,它禁止了编号为714的错误消息,第二个选项并不会恢复编号为714的错误消息,除非前面有个对应的-esym(714,alpha)。

15)格式十五:
+etd( TypeDiff [] ) re-enables

16)格式十六:
禁止和恢复在扩展模板(expanding templates)时的错误消息。

(2)变量类型大小和对齐选项
1)变量类型大小选项
这组选项允许设置各种变量类型的大小和对齐方式。由于默认的设置于绝大多数的编译器都是一致的,所以这些参数的单独设置通常是没有必要的。使用变量类型大小的选项是为了特定的架构,而不是本地架构。举个例子,你需要为嵌入式系统设置int和pointers通常为16位,那么你应该指定:
下面的列表,#号代表一个小的整型值,仅举几个:
-sb# 字节的位数为#,默认的是-sb8,
-sbo# sizeof(bool)就变为一个参数了,默认值为1,
-sc# sizeof(char) 就变为 #,默认值为1,
-slc# sizeof(long char) 就变为 #,默认值为2,
2)对齐选项
仅有两个可选择的注释信息来检测不规律的对齐,它们的错误编号是958和959,详细的介绍就省略了吧。

(3)冗长信息选项
冗长信息选项采用-v和+v开头来控制,冗长信息指的是在检测过程中产生的一些与编译过程有关的信息,或者说,冗长信息与编译过程中消息的频率和种类有关。如果使用-v,则冗长信息进被发送到标准输出,而是用+v,冗长信息进则会被发送到标准输出和标准错误中。如果要将错误信息重定向到一

  • 本站关键词:石家庄防伪标签防伪标签价格镭射防伪标签电码防伪标签网站专业推广QQ:1042388827
  • 友情链接:|
  • 防伪标签价格|镭射防伪标签|电码防伪标签|石家庄防伪标签|