让你提前认识软件开发(51):VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改

第3部分 软件研发工作总结

VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改

【文章摘要】

Pclint是一种C/C++软件代码静态分析工具。它是一种更加严格的编译器,能够发现普通编译器所不能发现的代码中的很多问题,因此被广泛应用于软件开发项目中。

本文介绍了如何在VC++集成开发环境中配置Linux下的Pclint工程,给出了C语言中pclint规则A检查的常见错误,并描述了对应的修改办法。

【关键词】

VC++  Pclint  配置  操作  修改

1. 前言

Pclint是一种强大的C/C++软件代码静态分析工具,它不但能够对程序进行全局分析、识别没有被适当检验的数组下标、报告未被初始化的变量、警告使用空指针连同冗余的代码,还能够有效地提出许多程序在空间利用、运行效率上的改进点。因此,许多大型的软件研发组织都把Pclint检查作为代码走查的第一道工序。

Pclint的作用有如下几个:

(1) Pclint是一种更加严格的编译器,不仅可以像普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求,但很可能是潜在的、不易发现的错误。

(2) Pclint不但可以检测单个文件,也可以从整个项目的角度来检测问题。

(3) Pclint支持几乎所有流行的编辑环境和编译器。

(4) Pclint还支持各种提高效率和防止错误的方法。

Pclint虽然好处多多,但要运行起来还需要进行一定的配置,而这个配置过程比较的繁琐,稍不注意就会配错。

本文根据作者的实际经验,介绍了VC++集成开发环境中Linux下Pclint工程的配置方法。在配置之前,要确保已经获取了完整的Pclint软件,并存放到PC机上。

此外,本文还介绍了用pclint工具对C代码进行检查的时候,规则A中的常见错误,并给出了对应的修改办法。

2. 配置前准备

2.1 获取Linux的include和lib目录

为了完成Linux下Pclint工程的配置,需要将Linux下的include和lib目录存放在本地文件夹下。

一般说来,这两个目录位于usr目录之下,在本地的存放情况如图1所示:

图1 include和lib的本地存放示意图

2.2 A规则和B规则lnt文件的配置

Pclint对代码的检查分为A规则和B规则,其中A规则是必须要修改的,B规则中与平台无关的错误要尽量修改。A规则和B规则配置文件的示例如下:

A规则:

au-sm.lnt au-ds.lnt au-misra.lnt co-gnu3.lnt lib-stl.lnt

options_A.lnt  -si4 -sp4

-i"D:/linux/usr/include"

-i"D:/linux/usr/lib/gcc-lib/i586-linux/3.3.3/include"

B规则:

au-sm.lnt au-ds.lnt au-misra.lnt co-gnu3.lnt lib-stl.lnt

options_B.lnt  -si4 -sp4

-i"D:/linux/usr/include"

-i"D:/linux/usr/lib/gcc-lib/i586-linux/3.3.3/include"

根据include和lib目录存放位置的不同,只需在两个文件中作对应修改即可。

2.3 Pclint检查结果文件夹的创建

为了方便保存Pclint的检查结果,需要在本地创建一个文件夹。当每次运行Pclint之后,会将结果存放在该文件夹之下。

文件夹及产生的结果示例如图2所示:

图2 Pclint检查结果存放文件夹示意图

3. VC++中Pclint工程的配置方法

在完成了上述准备工作之后,我们接下来要做的便是在VC++中配置Pclint工程了。

3.1 Pclint规则A的配置

打开VC++软件,选择“Tools”-->“Customize”。如图3所示:

图3 Pclint规则A的配置操作1

单击“Customize”,选择“Tools”。如图4所示:

图4 Pclint规则A的配置操作2

在“Tools”菜单下,可以完成Pclint规则A的配置。配置示意图如图5所示:

图5 Pclint规则A的配置操作3

Pclint规则A的各项配置为:

名称:PC-lint A(project check)

Command: D:\pclint\LINT-NT.EXE

Arguments: +ffn -i"D:\pclint" pclint_A.lnt env-vc6.lnt  $(WkspName).lnt >>"D:\pclint_output\pclint_A.lnt"

Initial Directory: $(WkspDir)

其中,名称可以根据个人习惯及实际需要进行选取,“Command”项是“LINT-NT.EXE”的全路径,“Arguments”中涉及到A规则的lnt文件和检查结果的存放路径(见2.3节)。

要注意的是,在图5中,如果不勾选“Use Output Window”项,那么检查的结果会直接出现在VC++工程的输出框中。为了保存检查结果,建议勾选该项(勾选后结果会保存在2.3节所建的文件夹下)。

配置完成之后,单击图5中右下角的“Close”,然后选择VC++菜单栏上的“Tools”项,会看到Pclint规则A检查项的名称,如图6所示:

图6 Pclint规则A检查项示意图

3.2 Pclint规则B的配置

对于Pclint规则B的配置,操作1和操作2与规则A完全相同,操作3的各项配置如图7所示:

图7 Pclint规则B的配置操作3

Pclint规则B的各项配置为:

名称:PC-lint B(project check)

Command: D:\pclint\LINT-NT.EXE

Arguments: +ffn -i"D:\pclint" pclint_B.lnt env-vc6.lnt  $(WkspName).lnt >>"D:\pclint_output\pclint_B.lnt"

Initial Directory: $(WkspDir)

要注意勾选“Use Output Window”项,配置完成之后,单击图7中右下角的“Close”,然后选择VC++菜单栏上的“Tools”项,会看到Pclint规则B检查项的名称,如图8所示:

图8 Pclint规则B检查项示意图

经过以上配置之后,每次只要单击图6和图8中Pclint规则A和规则B的名称,我们就可以用Pclint来检查代码了。

4. 常见的pclint规则A错误及修改办法

4.1 外部声明的函数无返回值

错误提示:error 808: (Info -- No explicit type given symbol ‘XXX‘, int assumed)。

表现形式:代码中,在定义XXX变量的时候没有定义其类型。

修改办法:在XXX变量之前,添加其返回值类型。

4.2 传递给函数的整型值参数超出了范围

错误提示:error 419: (Warning -- Apparent data overrun for function ‘strcpy(char *, const char *)‘, argument 2 (size=17) exceeds argument 1 (size=16)。

表现形式:代码中,在数据移动的时候出现了数据溢出。

修改办法:调整相关存储结构的长度,避免数据溢出。

备注:主要指memcpy、strcpy、fgets等数据移动或转换函数中的参数之间有隐含语义关系的函数。

4.3 定义的局部变量在该函数中未使用

错误提示:error 529: (Warning -- Symbol ‘XXX‘ (line xxx) not subsequently referenced)。

表现形式:代码中,XXX变量(位于xxx行)虽然定义了,但在后续语句中并没有用到。

修改办法:直接将该变量注释掉。

备注:该类错误在代码中比较常见。

4.4 布尔类型恒为真或恒为假

错误提示:error 774: (Info -- Boolean within ‘if‘ always evaluates to True。

表现形式:代码中,if语句恒为真。

修改办法:不用if判断,直接执行内部的函数语句。

4.5 非负数类型的变量不可能小于0,而代码中做了小于0的判断

错误提示:error 775: (Info -- non-negative quantity cannot be less than zero)。

表现形式:代码中,某变量值(如用strlen()赋值的变量)为非负数,但做了小于0的判断。

修改办法:将“<=0”改为“==0”。

4.6 在关系表达式中,有符号数和无符号数混合使用

错误提示:error 574: (Warning -- Signed-unsigned mix with relational)。

表现形式:代码中,两个进行比较的整型变量,一个为有符号型,另一个为无符号型。

修改办法:在不影响功能和结果的情况下,修改其中一个变量的类型,让两变量的类型一致。

4.7 对局部变量赋值了,但没有任何地方访问到该变量

错误提示:error 550: (Warning -- Symbol ‘XXX‘ (line xxx) not accessed)。

表现形式:代码中,变量XXX已经被赋值,但并没有被使用到。

修改办法:可直接将该变量注释掉。

4.8 函数没有声明,但在该函数的实现语句之前被其它函数调用了

错误提示:error 1055: (Error -- Symbol ‘XXX‘ undeclared, assumed to return int)。

表现形式:代码中,函数XXX没有在头文件(.h文件)或实现文件(.c文件)中声明,并且在该函数的实现语句之前,其它函数调用了它。

修改办法:在头文件中声明该函数,或在实现文件的前面声明该函数。

5. 总结

本文按照操作顺序介绍了如何在VC++集成开发环境中配置Linux下的Pclint工程,并详细介绍了用pclint工具对代码进行检查时,规则A所包含的常见错误以及修改办法,供大家参考。

“工欲善其事,必先利其器”,Pclint工具能够发现编译器所不能发现的问题。如果我们能够合理地利用它,必将在一定程度上提高代码的质量。

当然,“打铁还需自身硬”,要想写出高质量的代码,光靠工具是远远不够的。我们需要不断学习、不断提高自己编码的水平,并用心写好每一段代码。

(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)

时间: 2024-10-24 03:30:13

让你提前认识软件开发(51):VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改的相关文章

linux 下安装 mysql 并配置 python 开发环境

1.安装 mysql ,安装过程中将提示设置 root 用户的密码,默认可以设置为 rootadmin . $ sudo apt-get install mysql-server 2.安装 mysql 开发工具(不安装时,安装 MySQL-python 提示错误 "mysql_config not found"). $ sudo apt-get install libmysqld-dev 3.安装 python 的 mysql 库 MySQL-python (首先安装 python-d

linux 下 VNC Server安装配置及 eclipse CDT C/C++ 开发环境搭建(我用的是阿里云服务器 ubuntu 12.04 64-bit,无图形化界面)

linux 下 VNC Server安装配置及 eclipse CDT C/C++ 开发环境搭建(我用的是阿里云服务器 ubuntu 12.04 64-bit,无图形化界面): 既然要用 eclipse 可视环境下开发,那首先要安装图形界面喽!!! 对开发者来说,个人认为 linux 选择界面优先选择顺序:Awesome(性能最好) > Xfce4 > gnome > unity-2d //////////////////////////////////////////////// 首先

C#在VS2005开发环境中利用异步模式来对一个方法的执行时间进行超时控制

using System.Threading; using System; namespace ConsoleApplication4 { public class Program { static void Main(string[] args) { try { String str = "excuting"; myDel del = new myDel(Method); CallWithTimeout(del,1200,str); Console.WriteLine("s

开发chrome 插件, background.js中 console log 看不到解决方法

http://stackoverflow.com/questions/10257301/where-to-read-console-messages-from-background-js-in-a-chrome-extension

linux 下查看网速的方法 (不需要安装任何软件)

sudo watch -n 1 "/sbin/ifconfig eth0 | grep -E \"字节|数据包\"" 若是英文版linux: sudo watch -n 1 "/sbin/ifconfig eth0 | grep -E \"bytes|packets\"" 也可以不抓packets sudo watch -n 1 "/sbin/ifconfig eth0 | grep bytes"

让你提前认识软件开发---学长的软件开发经验总结(17)

第1部分 重新认识C语言 makefile文件的书写及应用 [文章摘要] makefile用于Linux下整个工程的编译,对于Linux下的C/C++语言的编译是至关重要的. 本文以实际的C源程序为例子,介绍如何使用makefile来编译Linux下的C语言工程,为相关开发工作的开展提供了参考. [关键词] makefile  C语言  Linux  编译  开发 一.什么是makefile? makefile是什么?如果你写的程序只是在Windows下运行,那么很有可能不知道有这个玩意儿.而如

PC-Lint的安装详细配置过程(以VC++6.0环境为例)

本文主要介绍了PC-Lint安装后针对VC++6.0开发环境进行配置的详细过程,总共分为三部分,下面依次对这三部分进行说明. 一.   首先下载PC-Lint,然后开始安装,一路"下一步"直到安装完成.此时会弹出一个对话框,询问你是否进行配置,点击确定,然后进入第二步的配置过程.注意,笔者这里默认将安装路径放在C盘下.读者修改安装路径后需注意这个路径和后续的配置有很大的关系. 二.   接下来就是配置PC-Lint的过程,如图1至图20所示. 图1   PC-Lint配置过程 图2  

Android开发环境中的概念和工具介绍

最近学习Android开发,以前使用C/C++多一些,现在再补点Java知识,不管是哪种语言,都不过是一种工具而已,真的学起来,大同小异,无谓优劣.学习Android编程肯定是要先从环境搭建开始,无论是在Windows.还是Linux.Mac环境都可以,在搭建环境之前,有些概念综合了解一下确有必要,本文即是面向Android初学者的文章,作为Android入门的启蒙篇章. Android是Google主导开发的基于Linux开源智能移动终端操作系统,当然这里说的开源,也不是说Google把所有的

ACE的构建(VC++6.0环境)

ACE的构建(VC++6.0环境)Windows下ACE的构建1. 将ACE-5.5.zip解压到所需的安装目录,此处以E:/为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE_wrappers/ace目录中.ACE_ROOT=E:/ACE_wrappers.2. 在系统中新建ACE_ROOT环境变量,值设为 E:/ACE_wrappers.具体设置为:我的电脑->属性->高级->环境变量->新建3. 在E:/ACE_wrappers/ace目录中创建一个头