最近在做arm64的移植,在网上看到了lint系列静态代码分析工具,在windows下就是pc-lint了,便拿来用了一下,功能还是挺强大的。初次上手,过程中也遇到不少疑惑,写此文来记一下。
首先,安装好pc-lint后,可去官网上下载最新的补丁(包括补丁更新器lpatch和补丁配置如l9-a-b.lp),这些都是最新的功能补充,网址:http://www.gimpel.com/html/ptch90.htm。
初次安装好程序后,会让你做一下基本设置,之后也可以再打开CONFIG.exe来进行设置。这些设置会存在std.lnt中。
在安装目录中有PC-lint.pdf,这是参考手册,介绍了pc-lint的功能和使用。
将pc-lint集成到vs中,截止到目前已支持到vs2010、2012,后续新vs应该也都会支持的。目前我是在vs2008中使用的,只要在vs菜单中点击“工具”,再点“外部工具”,弹出的对话框中点击“添加”。然后:
1. 标题:随便写一个,如pc-lint,后面可加个快捷键,即加:(&7),这样以后就可以在依次点击:alt > T > 7,就可以执行pc-lint分析当前cpp了。
2. 命令:即pc-lint的exe路径,如:D:\z__program_files\lint\lint-nt.exe。
3.
参数:给lint-nt.exe的参数,因为pc-lint是像linux中众多工具一样,是靠强大的命令选项来执行功能的。如:-
i"D:\z__program_files\lint" std.lnt env-vc9.lnt --u
"E:\dev\lint_use\$(ProjectFileName).lnt"
$(ItemPath),-i是添加目录,std.lnt是配置,env-vc9.lnt是针对vs2008的配置,--u(是两个“-”哈)是说对单个
文件进行分析,后面一个是工程的lnt配置文件(下面要讲),itempath就是当前cpp了。其中$(xxx)都是和工程属性中一样的宏,通过点击右
边的箭头也可以给你生成出来。
4. 初始目录:写$(ProjectDir)就好了。
然后就可以在vs中使用pc-lint了,分析结果会出现在输出窗口中。点击具体错误,可定位到相关文件的相关行上。
讲
一下,其中涉及到工程的lnt配置文件,主要是一些头文件包含目录的生成,这个pc-lint已经为你准备好了,只需要执行一个命令,就可以通过vs工程
属性文件来生成lnt文件。即:D:\z__program_files\lint> lint-nt
"E:\dev\xxx\xx.vcproj" >"E:\dev\lint_use\xx.vcproj.lnt",
首
先打开windows命令提示符,最好以管理员身份运行,进入lint安装目录,再输入以上的lint-nt及后面的命令,注意
xx.vcproj.lnt中的xx要和前面的xx.vcproj相同,因为上面外部工具中设置参数时用的宏是工程完整名。我是将所有的工程.lnt文件
都生成到一个统一的E:\dev\lint_use目录下的。最后还需注意:
因为vcproj文件中,有时有用到类似%SolutionDir%的宏,pc-lint是没识别出来的,这个我不知道是否pc-lint有支持,我是用文本编辑工具打开.lnt文件,直接编辑将其中的%SolutionDir%替换为真实的绝对路径。
配置都是.lnt文件,就是在其中加入命令参数控制功能,我觉得你也可以创建自己的lnt文件,虽然我还没试过,哈哈。这些文件熟悉了之后都可以自己用文本编辑器直接编辑。
首先讲一下std.lnt,其中是你作的配置。文件内容比如:
// Microsoft Visual C++ 2008, -si4 -sp4, lib-atl.lnt lib-mfc.lnt lib-stl.lnt lib-w32.lnt // Standard lint options au-LP64.lnt // v_add: for LP64 model (should before options.lnt) co-msc90.lnt lib-atl.lnt lib-mfc.lnt lib-stl.lnt lib-w32.lnt options.lnt -si4 -sp4 -i"C:\Program Files\Microsoft Visual Studio 9.0\VC\include" -i"C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include" -i"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include" -i"E:\boost_1_54_0" +libdir(E:\boost_1_54_0)
其中au-LP64.lnt是自己后来加上的,主要是为了做64位移植,指定是LP64数据指针模型。这个要放在options.lnt之前,因为options.lnt对这个有些功能指定做了修改。
+libdir(E:\boost_1_54_0),
是指将指定文件夹,比如此处的boost,指定为库目录,注意这个目录要是已经属于包含目录了,即前面用-i"E:\boost_1_54_0"加过了,
此两目录指定需要一致,+libdir中指定 -i 中的子目录也是不行的。
再
来介绍下options.lnt,这个文件主要用来自定义一些你自己想要的功能,就是在原来的功能上取消掉某些warning的产生,因为pc-lint
是很严厉的,而有些甚至是建议性的,你不需要完全按照它的要求来(相信也没有人能完全达到这个要求,或者说不在乎其中的有些要求)。关于这个文件中能配置
的选项,可参见PC-lint.pdf中的Appendix A。
其中的内容如,都是我自己加的哈:
// Please note -- this is a representative set of error suppression // options. Please adjust to suit your own policies // See manual (chapter LIVING WITH LINT) // for further details. // lib -wlib(0) //-elib(1275) // boost cause internal error fixed by new patch / wlib(0) // suppress is ok -e958 // padding align in struct -estring(958,member) // up, suppress for au-64.lnt -e917 // Prototype coercion, e747 is enough.(e.g.: 917: int to unsigned int, int to unsigned long; 747: int to unsigned long) -e970 // Use of modifier or type ‘Name‘ outside of a typedef -esym(970,long) // up, suppress for au-64.lnt // may open for v_self use -e715 // Symbol ‘Symbol‘(Location) not referenced -e732 // loss of sign: int ro unsigned, int to unsigned long (e570 is enough: negative constant to unsigned, (unsigned long)-1) // tmp for test
-wlib(0) 是设置库代码的报警等级,默认为-wlib(2),我设置为了最低的-wlib(0),这样库中的错误和警告都不会有提示,哈哈。
-elib(1275),是指对库中代码的某个错误屏蔽,此处为1275,这些错误号都可以在pc-lint手册中看到具体描述。
上面提到把boost的目录设为了库目录,就是因为boost中很多东西会被检测出来有错误,可能模板技术用的太炫,pc-lint没hold住啊。这样在我设置的-wlib(0)下,boost就被忽略了。
-e#,是具体屏蔽某个错误。
还有像-estring,-esym这些大家就看手册吧。
最后,pc-lint主要是用来对单个文件进行分析,不过一般也是这样,你需要针对每个c / cpp来分析,相应根据分析的结果进行修改。
网
上有人也写出了一个方便pc-lint来管理工程的工具,叫做LintProject,可以将一个工程的结果全部分析出来,然后生成html文件,可以方
便的打开查看。其实,它就是针对工程的每个文件都执行了下pc-lint分析而已。下载地址:http://www.codeproject.com
/Articles/8526/LintProject-Improving-the-Usability-of-PC-Lint-wit 。
它其中用到的命令大致是这样:
<lint-folder>\lint-nt.exe -i"<lint-folder>" -b -u
std.lnt env-vc7.lnt -i"Debug" <source file> >Lint\<source
file>.txt
相当于把生成结果重定向到某个txt中了。其中env-vc7.lnt和env-vc9.lnt其实内容是一样的。
将下下来的LintProject中的可执行文件LintProject.exe放进pc-lint的目录下,我们就可以在命令提示符中来使用这个工具:
D:\z__program_files\lint> LintProject.exe E:\dev\xxx\xx.vcproj E:\dev\lint_use\result /cfg"Debug|Win32" /param"" /s。
它就会自动将分析好的结果在打开的html文件中展示出来,可以看到这个工程的每个文件分别有多少警告提示。具体其他使用,可以在上面的下载网页中看到说明。
好了,pc-lint就介绍到这了,大家都尝试一下吧,看看你是否符合一个程序员的自我修养哦。