11:
{
12:
k++;
13:
kk=i;
14:
}
15:
if(k==1)result=nm;
16:
else?
if(kk>0)result=1;
17:
else?
if(kk<0)result=-1;
18:
if(m==result)return(temp);
19:
else?
return(name);
20:
}
上面的代码用一般的编译器编译是一段有效的代码,但是用PC-Lint编译就会有几个告警。
首先第7行向name数组赋值时丢掉了nul字符,第8行的乘法精度会失准,第9行的比较有问题,第12行的变量k没有初始化,第13行的kk可能没有被初始化,第18行的result也有可能没有被初始化,第19行返回的是一个局部对象的地址。
这段代码在大部分编译器下是可以顺利编译通过的,继续查找其中的错误就要靠人工调试程序,如果程序很大,这将是一项烦琐的工作,没有人可以保证能找出所有的这类问题,但PC-Lint只通过一次简单的编译就可做到,显然为我们节省了大量的开发时间。
由于我们现有的PC-Lint不是安装版,解压后直接使用,因此省略了安装步骤,而直接进入配置阶段。
此外,PC-Lint配置选项比较多,本文档不对其一一进行说明,只介绍一种通用的配置方法。
1.2文件部署
将提供的压缩文件包解压至C:
\lint目录,然后在此目录下创建一个用于保存自定义配置文件的config子目录。
点击运行进入配置过程。
1.3选择配置目录
由于是第一次使用PC-Lint,选择配置目录时如下图所示选取前面刚刚创建的config目录,并选择“Createanew”创建一个新的。
1.4选择编译器
在该页面的编译器列表中提供了50多种流行的C/C++编译器,如果表中没有自己使用的编译器,可选择通用编译器“Generic?
Compilers”。
1.5选择内存模型
该页面会让你选择一个内存模型,可以根据自己程序区和数据区的实际大小选择一个恰当的内存模型。
根据我们所使用的CPU类型,需要选择“32-bitFlatModule”,内存模型的选项会体现在文件中。
1.6选择库类型
选完内存模型后,会看到一个库类型列表,根据实际编译的需要可以在这里选择一个或多个编译时使用的库,在此我们选择“Windows32-bit”。
这个选项会体现在文件中。
1.7选择作者
接着是让你选择为使用C++编程提出过重要建议的作者,选择的某作者后,他提出的编程建议方面的选项将被打开。
与作者选择有关的选项会体现在文件中。
1.8设置包含目录
下一步是设置包含文件目录。
共四个选项,第一个是直接使用现有系统环境变量INCLUDE作为包含文件目录;第二个是让我们立即设置INCLUDE系统环境变量;第三个是使用-i选项,-i选项体现在文件中,每个目录前以-I引导,目录间以空格分隔,例如可设成“-IC:
MRIMCC68K-
ID:
LAPSRCINC”,如果选择使用-I选项,安装程序会接着让你输入包含文件所在的目录;第四个是跳过该页面。
我们将在后面的具体使用中设置包含文件搜索路径,在此选择“INCLUDEisalreadyusedforthispurpose”。
此时,安装程序会提示和文件已经在C:
\lint\config目录中被创建。
确认后会询问是否选择配置更多的编译环境,此处选择否。
1.9生成选项文件
接下来会询问是否产生一个用于结果消息过滤的选项文件,我们暂时跳过该步骤,先生成一个空的文件,等以后在实际应用时加入必要的选项。
1.10集成到开发环境
接着是选择工作环境。
PC-Lint提供了集成在多种开发环境中工作的功能,例如可集成在VC7、CodeWarrior或Source?
Insight中。
由于我们的源文件不是安装版本,假如在这里选择后会提示出错,因此在该页面中不进行任何选择。
1.11生成批处理文件
安装程序最终会在C:
\lint\config目录下生成一个文件,该文件是运行PC-Lint的批处理文件,为了使该文件能在任何路径下运行,安装程序提供了两种方法供你选择。
第一种方法是让你选择把拷贝到任何一个PATH目录下,在安装结束后会把自动拷贝到你指定的目录。
第二种方法是生成一个文件,在每次使用PC-Lint前先运行它来设置路径,或者把文件的内容拷贝到文件中。
此处选择“CopytooneofmyPATHdirectories”然后将其拷贝到即将进行lint检查的源文件目录下。
1.12用命令行方式进行lint
1.12.1编辑批处理文件
按照上一章介绍的配置过程在C:
\TestCpuUsage目录生成的文件内容如下:
"C:
\lint\Lint-nt"+v-i"C:
\lint\config"-os%1%2%3%4%5%6%7%8%9
type|more
@echooff
echo---
echooutputplacedin
由于此时还没有设置头文件搜索路径,因此还不能进行lint检查。
在-i选项后添加所有可能用到的路径,甚至需要包含一些标准库中的路径。
总之,应该在-i""中包含所有用到的头文件包含路径,否则会提示找不到相关文件。
编辑后的文件内容如下:
"C:
\lint\Lint-nt"+v-DPLUS;__UREG_DEF_H;_M_IA64;SIMULATE-i"c:
\lint\config;TestCpuUsage/dspi;TestCpuUsage/include;"-os%1%2%3%4%5%6%7%8%9
type|more
@echooff
echo---
echooutputplacedin
1.12.2生成待检查的源文件集合
在控制台模式,进入TestCpuUsage工程根目录执行以下命令
$\TestCpuUsage>dir/s/b*.cpp*.c>
将该工程中包括子目录中的所有扩展名为*.cpp和*.c的源文件列表输出到中作为后续检查的基准。
1.12.3进行lint检查
做好以上准备工作后,执行以下命令
$Project$\TestCpuUsage>lin
就可以象命令行编译那样进行lint检查了,输出的结果信息保存在文件中。
1.13用开发环境进行lint
也可以使用开发环境来执行lint操作,一般开发环境都支持运行可执行文件,但不一定支持运行批处理文件。
如果我们在先前的配置过程中选定了使用某个开发环境,安装程序会在你安装的目录下生成一个的文件,例如选择了Source?
Insight就会有一个文件。
用编辑器打开该文件,在该文件开始的注释中说明了如何将PC-Lint功能集成在开发环境中,此处不进行这方面的详细介绍。
1.14lint选项
lint的选项很多共有300多种,大体可分为以下几类:
错误信息禁止选项
-e#禁止生成某类错误信息;
+e#恢复生成某类错误信息;
-w#对于所有大于级别的告警信息都不显示;
-wlib()对于所有大于级别的关于库函数数的告警信息都不显示。
我们可以用-wlib(0)来屏蔽所有的库函数的告警信息,-wlib
(1)只显示库函数中的句法错误。
-esym(#,)可以屏蔽对于特定符号的某告警信息。
注1:
错误信息禁止选项可以在命令行直接使用,也可以加在前面生成的批处理文件中,当在命令行使用时,不能放在被检测文件的后面,而应该插入到lint命令与被检测文件名的中间(如lin–w2);
注2:
执行lint目录下的可以输出文件,这个长达5000行的文件包含了所有的错误信息号和相应的解释。
错误信息分类
大部分的错误信息都有一个对应的错误编号。
在中可以得到导致错误的详细信息,C++中的错误信息号与C中的相应错误信息号相差1000。
总结如下:
C
C++
WarningLevel
说明
SyntaxErrors
1-199
1001-1199
1
语法错误
InternalErrors
200-299
0
内在的错误,不会发生
FatalErrors
300-399
0
致命的错误,将会导致超过某种限制
Warnings
400-699
1400-1699
2
指明程序中很可能出错
Informational
700-899
1700-1899
3
指明程序中可能出错,也可能是个人风格的合法编程实践
ElectiveNotes
900-999
1900-1999
4
不会自动输出,可以检查列表确定是否需关注