让你提前认识软件开发(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,欢迎关注!)
让你提前认识软件开发(51):VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改相关推荐
- 开发chrome 插件, background.js中 console log 看不到解决方法
开发chrome 插件, background.js中 console log 看不到解决方法 参考文章: (1)开发chrome 插件, background.js中 console log 看不到 ...
- lora网关软件设计_LoRa 物联网集成开发套件
原标题:LoRa 物联网集成开发套件 简介 LoRa 物联网集成开发套件由数据传输单元(DTU,Data Transfer Unit), LoRa 网关(室内型)和TurCloud™ IoT 平台组成 ...
- 汽车电子软件开发:AutoSAR集成开发环境
有一阵子没有跟进汽车电子软件开发了,许久前参与一个项目,本人负责其中软件的设计,算是对此有一定了解,在此总结一下自己的认识. 汽车电子开发中软件内容大致包括三大类:(1)BSP开发,主要针对常见ECU ...
- 什么是硬件集成开发?硬件集成开发的核心有哪些?
集成产品开发是近年来发展速度最为迅猛的的一个行业.它包括计算机硬件.软件.网络通讯技术.多媒体应用技术等的集成,是一种低成本.高效率.高性能.可维护的系统.是根据大量成功的开发经验总结出来的一种高效的 ...
- basler相机 ip linux,Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机...
一 .在Linux操作系统中安装Pylon软件 1.Pylon下载,到官网中下载Pylon软件https://www.baslerweb.com/cn/support/downloads/softwa ...
- 在linux下搭建git环境,在linux下搭建git github开发环境
在linux下搭建git github开发环境 github git linux 1.安装git sudo apt-getinstall git 2.Generating SSH keys 2.1.g ...
- ad域推送软件_如何在域管理环境中进行软件的推送安装
如何在域管理环境中进行软件的推送安装 1, 要把你准备分发的软件制作成 .msi 软件安装包 . 在 Windows2000 安装光盘运行 x:\Valueadd\3rdparty\Mgmt\Wins ...
- 企业中Linux下软件的管理(yum仓库的搭建以及软件的控制)
实验环境: 在虚拟机快照中配置网络 编辑完文件后重启网络,查看文件内容 ifconfig查看网络信息 配置好网络后将虚拟机的主机名改为software_install.westos.com 配置好之后 ...
- 搭建属于自己的数字IC EDA环境(五):搭建FPGA自动化环境(Linux下vivado Tcl脚本自动化开发),业余IC设计流程与通路
1.简述 一个完整的IC EDA环境也不能缺少了FPGA,FPGA原型验证是IC设计流程中重要的一环.一个芯片从设计到流片需要投入大量的人力.财力以及很长的研发周期,如果流片失败,对于公司来说是一笔很 ...
最新文章
- python中内置函数基本输入输出函数
- PowerDesigner11技巧
- mysql for windows 64_MySQL 5.6 for Windows 解压缩版配置安装(win 10 64位亲测)附安装包下载链接...
- hbuilder新建web apk项目_【CUCS】Ionic利用你喜欢的(html css js) web技术创建跨平台的移动app...
- 墙裂推荐!2020Android阿里腾讯百度字节美团网易爱奇艺校招面试汇总
- JVM 性能调优实战之:一次系统性能瓶颈的寻找过程
- 7z源码的编译与使用
- 人大金仓数据库sql语句_人大金仓数据库问题记录
- Unity Hex与Color之间进行颜色转换
- SQL中的交叉连接-cross join
- 键盘的某些键坏了咋办(如delete键等)
- 浏览器表单自动填充问题【兼容性解决方案】
- 修复黑苹果无法播放Apple Music无损音乐的问题
- c++(003)梯形面积的计算
- Tinymce富文本使用教程
- HTML基础学习笔记(1)
- 决策树算法面试问题汇总
- mysql 5.1.69_MySQL 5.1.69/5.5.31/5.6.11 三版连发
- OSX-Mac平台画板工具推荐-SktechBook
- C#、Java、Python,window如何接入L2行情数据接口?(附代码)