软件质量之道:PCLint之二

圆规为什么可以画圆?因为脚在走,心不变。你为什么不能圆梦?因为心不定,脚不动。

1 灯塔与方向

时间过得可真快,仍记得樱桃红芭蕉绿的时节,转眼已入深秋。我爱大自然,其次就是艺术。高纳德老先生的著作《The Art of Computer Programming》至今仍尘封在书堆之中,实在是没有胆量拿起这份重量。

今天真是美好的一天,不知道是不是已经看到灯塔的光芒了,突然射过来的光芒,好刺眼,好心慌。兴奋的心情难以平复,感觉人生再也不会有如此复杂的心情了,突然看到希望的那一天,真是人生最大的幸福吧!

继续说软件质量之道的第二员大将,PCLint,上一篇文章中主要介绍了PCLint的安装配置以及升级,这篇文章着重介绍如何将PCLint作为一个工具添加到常用开发环境中去,成为我们开发过程中的左肩右膀。

注,上篇文章中PCLint工具进行了更新,请小伙伴们注意重新下载,主要有两方面的原因。第一,原工具应该是有问题的一个版本,升级后,不能正确的解析Visual Studio的工程文件,在这上面,整整花费了我一个多星期的时间来调查,是导致这篇文章难产的主要凶手。第二,增加了Visual Studio 2010, 2012,
2013等版本的配置文件,方便大家的使用。

2 PCLint的命令行

PCLint主要使用命令行模式来进行文件的解析,这个GCC的编译器过程非常相似。其命令行格式为:

lint options file1 [ file2 file3... ]

既然将PCLint可以当做一个编译器,则options即为编译选项,file即为要编译的文件,对于C++来说,主要是*.cpp文件,由于*.h作为包含文件,是不会进行单独进行编译的,所以这一点需要注意。

如果对一个工程的文件进行检查时,则需要生成文件列表来进行,类似于Makefile文件,所以需要注意一下。

接下来是各个工具的具体配置方法,具体详细的各个参数的信息,还请查阅安装目录下的手册。

3 VisualStudio配置

3.1 扫描并创建cpp文件列表

这个过程就是上面说到的生成文件列表,在Visual Studio中,主要按照工程(或目录)来进行创建。

1. 选择工具,然后创建外部扩展工具。

2. 新建一个外部扩展工具,名称PCLintCreation。

参数如下:

Title:PCLintCreation

Command:安装路径\lint-nt.exe

Arguments:-v-os("$(TargetName).lnt") "$(ProjectFileName)"

Initial directory: $(ProjectDir)

3. 同样,可以根据前文SourceMonitor配置时,进行快捷键的分配。

4. 执行添加的PCLintCreation,会在对应的工程文件路径下,生成一个对应的*.lnt文件,内容如下:

5. 需要注意的是,当该工程下文件发生变化时,需要重新执行此任务,保证文件列表的正确性。

3.2 对工程下所有文件进行检查

根据上一步扫描的文件,进行PCLint检查。

1. 选择工具,然后创建外部扩展工具,这个跟上部分的第一步相同。

2. 新建外部工具,名称PCLintCheck。

参数如下:

Title:PCLintCheck

Command:D:\lint\lint-nt.exe

Arguments:-i"D:\lint"std.lnt env-vc12.lnt "$(TargetName).lnt"

Initial directory:$(ProjectDir)

需要注意的有几点,第一,由于PCLint对于C++11的支持可能没有Visual Studio 2013支持的那么广泛,所以会检测失败,所以不建议在Visual Studio 2013及以上版本进行使用。第二,第一个lint文件,std.lnt即为上篇文章中配置生成的文件,env-vc12.lnt为VC12(Visual Studio 2013)对应的配置文件,"$(TargetName).lnt"为上一步对工程扫描的文件列表。第三,如果提示缺少*.lnt文件,则将对应的文件拷贝到PCLint安装路径下即可。

3. 执行PCLint,会在Output窗口中输出对应的Info,Warn,Error和Fatal等信息,这样根据信息查看对应的代码,并进行改正。

3.3 对单个文件进行检查

如果仅仅是对单个文件进行检查,则不需要配置前两步即可,但这个步骤仅对于单个文件执行检查是有效的,不方便配置到Ant任务中。但是相对于整个工程的检查,效率比较高,所以适合快速检查文件,并修改问题,具体配置如下。

1. 选择工具,然后创建外部扩展工具,这个跟前面相同。

2. 新建外部工具,名称PCLintCheckItem。

参数如下:

Title:PCLintCheckItem

Command:D:\lint\lint-nt.exe

Arguments:-i"D:\lint"std.lnt env-vc12.lnt "$(ItemFileName)$(ItemExt)"

Initial directory:$(ItemDir)

3. 执行PCLint,会对当前文件进行检查,并输出结果到Output窗口中,例如:

当然,由于使用的是Visual Studio 2013作为实例,导致执行失败。这个在Visual Studio 2012上执行是没有问题的。

4 进一步思考

写到最后,却发现这篇文章写得有点潦草了,实在是不应该。可惜PCLint跟不上C++ 11的脚步,也跟不上Visual Studio的发展脚步。愿PCLint的开发商更加进一步,不断更新这个优秀的工具。

当然,工具只是一部分,万万不要将所有一切压在工具身上。实际上,只要遵守良好的代码规范,犯错误的机会将会减到最低,PCLint也仅仅是一个指导作用而已,这也是我对这个工具的理解。

还是宁愿做一个苦行僧,适应了艰苦卓绝的环境,在回来看看这些Warning,Error或者Fatal,简直是贻笑大方,建议大家有时间读一下Matthew Wilson的《Inperfect C++》一书,相信您也会赞同我的观点,即作者的观点。当然,正如作者所言,假设您已经对《Effective C++》和《Exceptional C++》系列有一定的了解,也已经有TCPL圣经在手,另外对模板有了一定的了解,那这本书不会让你失望。嗯,至少我读了此书之后,再看看我写的Perfect C++,额,不忍直视。

激动的心情还是不能平静下来,打算把这几篇文章移除《Perfect C++》的系列,放到QA系列之内,也算是一个总结吧。

另外,最近对自然语言处理有了一定的研究和成果,虽然大部分都是参考前人的观点,但是也想对自己这部分研究进行总结分享一下,借此机会加深对这部分知识的理解,也希望各路大神能够互相讨论学习,共同提升!

时间: 2024-08-26 04:11:23

软件质量之道:PCLint之二的相关文章

代码整洁之道读后感(二)

有意义的命名和函数 命名: 名副其实---选个好名字要花很长时间,但省下来的时间更多.如果发现有更好的名称,就换掉旧的. 避免误导---比如,使用accountList指称一组帐号 使用读的出来的名称---比如,genymdhms(生成日期,年,月,日,时,分,秒),这个怎么读?? 类名---类名和对象名应该是名词或名词短语,如Customer.WiKIPage.Account,避免使用Manager.Processor.Date这样的类名. 方法名---方法名应当是动词或动词短语. 函数: 短

软件质量之道:PCLint之一

故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能. 孟子 1引子 今天听老韩一席话,当真是感慨万千啊.心怀斗志昂扬,奋斗十年,到头来,却看到身边的人一个个贪图安逸,没有独当一面的才能,让人颓然失望.可以说这几年来,我也曾怀着这样的期盼,希望身边的朋友们能够借我一把力,共同奋斗,创造一些"奇迹",但是每次也都是失望,失望,还是失望. 虽然前人们都说,在这个时代,没有独行者.但是,茫茫人海之中,想要找一个志同道合者,太难.并且,没有

软件质量之道:PCLint之中的一个

故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能. 孟子 1引子 今天听老韩一席话,当真是感慨万千啊.心怀斗志昂扬.奋斗十年,到头来.却看到身边的人一个个贪图安逸,没有独当一面的才干,让人颓然失望.可以说这几年来,我也曾怀着这种期盼.希望身边的朋友们可以借我一把力,共同奋斗,创造一些"奇迹",可是每次也都是失望.失望,还是失望. 尽管前人们都说,在这个时代.没有独行者.可是,茫茫人海之中,想要找一个志同道合者.太难. 而且,没有

软件质量之道

我曾与一些资历非常高但毫无实际经验的人共事过,也曾与一些只有很少或根本没有资历但才华横溢的工程师一起工作过,我也曾经不得已跟一些并不想用心做事.也对学习新东西丝毫不感兴趣的人共事过.如果说我们这个职业是一张纸,那么这些人就好比纸上的污点.软件开发业的低劣性不能完全怪罪于那些无知的经理.狡猾的市场营销人员以及总是急不可耐的用户,实际上很大程度上要归咎于这个行业的某些从业人员,他们应该去从事一些即使玩忽职守也不会造成像软件业里这样大的危害的行当,而不应该混迹于这个聚集着人类想象力的最复杂的创造性的行

大数据之道 HMM系列<二>(成长)

一:HMM解码问题 (1)编程深处无非就是算法和结构,以及各种架构和版本的管理(如Git管理),因此作为程序员算法这一关是绕不过去的: (2)关于算法,个人比较崇尚的一本书是<算法导论>和ACM实战系类的算法培训: (3)对于自然语言处理领域或者部分机械学习领域的算法,HMM模型是非常经典的算法之一,非常适合初学者学习和研究: (4)HMM模型μ=(A,B,π),的状态是不可见的,我们看到的仅仅是状态表现出来的观察值和状态概率函数. 二:HMM简介(u = {N,M,A,B,pai} ---&

《程序员修炼之道》笔记(二)

第二章 注重实效的途径 1. 重复的危害 a) DRY-Don't Repeat Yourself.系统中的每一项知识都必须具有单一.无歧义.权威的表示. b) 重复是怎样发生的 Imposed Duplication强加的重复.开发者觉得他们无可选择-环境似乎要求重复. Inadvertent Duplication无意的重复.开发者没有意识到自己在重复信息. Impatient Duplication无耐心的重复.开发者偷懒,因为重复似乎更容易. Interdeveloper dumplic

Java经典编程题50道之十二

企业发放的奖金根据利润提成:利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成, 高于10万元的部分 ,可提成7.5%:20万到40万之间时,高于20万元的部分,可提成5%:40万到60万之间时,高于40万元的部分,可提成3%:60万到100万之间时 ,高于60万元的部分,可提成1.5%:高于100万元时,超过100万元的部分按1%提成. 从键盘输入当月利润I,求应发放奖金总数? public class Example12 {  

《代码整洁之道》之二 有意义的命名

变量.函数.参数.类和封包,这些在编程的过程中都需要我们命名.程序编写好了之后,jar文件.war文件和ear文件的命名. 既然命名在软件中如此重要,那么我们在取名字的时候要遵循什么样的规则呢?<Clean Code>总结了如下几点: 1) 名副其实:名称应该已经回答了所有的大问题,即名字应该表示变量.函数或类所做的事情. 2) 避免误导:应该避免使用与本意相悖的词,也不要用容易引起歧义的词. 3) 做有意义的区分:所谓有意义的区分就是指单从名称上就能看出两者本质上的不同.在此举一个反例就是以

Java经典编程题50道之三十二

取一个整数a从右端开始的4-7位. public class Example32 {    public static void main(String[] args) {        cut(123456789);    } public static void cut(long n) {        String s = Long.toString(n);        char[] c = s.toCharArray();        int j = c.length;