S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

pclint 升级和使用 [2]

Posted on 2009-09-19 22:12 S.l.e!ep.¢% 阅读(2592) 评论(1)  编辑 收藏 引用 所属分类: test
pclint 升级和使用 [2]
2007-07-06 23:42

安装
将压缩包比如pclint8.zip拷贝到c:\,解压后重命名目录为c:\pclint

不用任何配置,直接使用
准备待被检查的文件:
先在E:\建一个文件:main.cpp,内容为:

void main()
{   
}

最简单的用法
在命令行下输入:D:\>C:\PCLint\Lint-nt E:\main.cpp

C:\PCLint>C:\PCLint\Lint-nt E:\main.cpp

PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004

--- Module:     E:\main.cpp

_

}

E:\main.cpp    3    Info 783: Line does not end with new-line

C:\PCLint>

PCLINT已经工作了,是不是简单的难以让人相信。

最简单的标准用法
修改被检查的文件E:\main.cpp,内容修改为:
#include <stdio.h>
void main()
{
      printf("hello pclint\n");   
}

再次在命令行下输入:D:\>C:\PCLint\Lint-nt E:\main.cpp
D:\>lint
PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004

--- Module:     E:\main.cpp
           _

#include <stdio.h>
E:\main.cpp    1    Error 322: Unable to open include file 'stdio.h'
D:\>

报错误,“不能找到头文件stdio.h”
当然PCLINT不可能也不应该知道到哪里去找stdio.h,stdio.h所在的路径需要我们告诉它。
如何告诉呢?
通常的做法是在xxx.lnt文件中指定,然后指定使用这个xxx.lnt文件。
最简单的是使用 c:\pclint\std.lnt 这个文件。

std.lnt的配置:
修改std.lnt
运行C:\PCLint\CONFIG.EXE(或者直接手工修改std.lnt)

最后生成的std.lnt内容为:

//    Microsoft C and Visual C++ 6.x, -si4 -sp4,

//    Standard lint options

co-msc60.lnt

// options.lnt    -si4 -sp4

-i"E:\Program Files\Microsoft Visual Studio\VC98\Include"

-i"E:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE"

-i"E:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE"

暂时将options.lnt 这行注释掉。
注:如果生成的std.lnt内容与上面不一样,可以手工修改成上面那样。

使用std.lnt
再次在命令行下输入:D:\> C:\PCLint\Lint-nt -i"C:\PCLint" -u std.lnt e:\main.cpp

C:\PCLint\Lint-nt -i"C:\PCLint" -u std.lnt e:\main.cpp

-i"C:\PCLint" -u std.lnt 指明使用std.lnt这个选项文件,至于std.lnt在什么目录,通过-i"C:\PCLint"告知。

至此,我们已经学会了PCLINT的简单用法及两个选项:-i,-u

-i 指明包含路径

-u 指明使用哪些.lnt文件


前面我们掌握了命令行方式下PCLINT的使用方法,下面介绍在VC下面的配置及使用。

3.1. VC下的配置
新建一自定义工具项,名称为:PCLINT

其中的Arguments为:-i"C:\PCLint" -u std.lnt env-vc6.lnt "$(FileName)$(FileExt)"

Q:怎么知道要输入这样的参数了?

A:从帮助中得知的,见文件env-vc6.lnt

Q: env-vc6.lnt有什么作用?

A:指定输出错误报告的格式,这个选项可以去掉,比如修改为:

Arguments为:-i"C:\PCLint" -u std.lnt "$(FileName)$(FileExt)"

3.2. 示例
3.2.1.      testForPclint1
新建一个最简单的Win32 Console Application,工程名testForPclint1,其中的main.cpp为:

void main()

{   

}

点击Tools菜单下面的PCLINT菜单项:

PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004

--- Module:     main.cpp

}

main.cpp(3): error 783: (Info -- Line does not end with new-line)

--- Global Wrap-up

error 900: (Note -- Successful completion, 1 messages produced)

Press any key to continue

第三行有个错误:error 783: (Info -- Line does not end with new-line)

意思是说没有以新行结束。

注:如果Arguments为:-i"C:\PCLint" -u std.lnt "$(FileName)$(FileExt)"

则结果为:

PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004


--- Module:     main.cpp
_

}

main.cpp(3) : Info 783: Line does not end with new-line

Press any key to continue

修改main.cpp为:

void main()

{   

}<---即在这里加一个回车

再次LINT,结果没有任何告警:

PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004

--- Module:     main.cpp
--- Global Wrap-up
error 900: (Note -- Successful completion, 0 messages produced)
Press any key to continue

3.2.2.      testForPclint2
新建一个最简单的Win32 Console Application,工程名testForPclint2,其中的main.cpp为:

#include "stdio.h"
int main(int argc, char* argv[])
{
      printf("hello\n");
}

点击Tools菜单下面的PCLINT菜单项:

PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004

--- Module:     main.cpp
_

}

main.cpp(6) : Warning 533: function 'main(int, char **)' should return a value

      (see line 3)

main.cpp(3) : Info 830: Location cited in prior message

_

}

main.cpp(6) : Info 715: Symbol 'argv' (line 3) not referenced

main.cpp(3) : Info 830: Location cited in prior message

_

}

main.cpp(6) : Info 818: Pointer parameter 'argv' (line 3) could be declared as

      pointing to const

main.cpp(3) : Info 830: Location cited in prior message

_

}

main.cpp(6) : Info 715: Symbol 'argc' (line 3) not referenced

main.cpp(3) : Info 830: Location cited in prior message

Press any key to continue

有4个告警,修改main.cpp为:

#include "stdio.h"
int main(int argc, char* argv[])
{
      (void)argc; // pc lint
      (void)argv; // pc lint
      printf("hello\n");
      return 0;
}


再次LINT,无任何告警了。

PC-lint for C/C++ (NT) Ver. 8.00q, Copyright Gimpel Software 1985-2004

--- Module:     main.cpp
Press any key to continue

4.     使用批处理方法
为什么要使用批处理?还不是为了使用更简单。

我们在C:\PCLint建一个批处理文件lint.bat,内容为:
@echo off
C:\PCLint\Lint-nt -i"C:\PCLint" -u std.lnt e:\main.cpp

为了支持输入参数,修改为:
@echo off
C:\PCLint\Lint-nt -i"C:\PCLint" -u std.lnt %1

这时候我们不能简单输入D:\>lint.bat,而必须加上输入参数:

D:\>lint.bat e:\main.cpp

////////////////////////

二,pc    lint    在几个编译器的配置   
      
   人云亦云实在不是个好行为-----网络上都那样一致的说法让我走了不少弯路    。     
      
      
   好了言归正传,开始配置pc    lint    .     
      
   以下假设您已经把pc    lint    安装在C盘下(c:\pclint)   
   (其他目录也可以)   
      
   我们不必要将c:\pclint\lnt    下的   
   3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt拷贝至c:\pclint下,   
   那样简直是扰乱视线,而且还会引起麻烦    ;   
      
   也不必在安装目录下创建std.lnt和options.lnt两个文件    !   
      
   因为我要设置VC6,    Source    Insight    及Keil    C51等编译器,   
      
   所以不是一个std.lnt就能解决问题的    !   
      
   我的做法是:    一类编译器一个lnt文件,基本属于"不动产" .     
   e.g.    :     
   vc6_0.int       
   //    vc6_0.int    content    for    VC6    .   
   //************************************************************************   
   //************************************************************************   
      
    
   //    compile    environment   
   c:\pclint\lnt\env-vc6.lnt   
      
    
   //    system    lib    include    .   
   c:\pclint\lnt\co-msc60.lnt   
   c:\pclint\lnt\lib-w32.lnt   
      
    
   //    system    stdio    hearder    files    directory    .   
   -i"D:\Program    Files;D:\Program    Files\Microsoft    Visual    Studio\VC98\Include"   
      
    
   //    user's    defined    lint    configure    file    .   
   G:\work\eva_skype\eva_skype_pc\vc.lnt    -si4    -sp4   

si3_5.int       
   //    si3_5.int    content    for    Source    Insight    .   
   //************************************************************************   
   //************************************************************************   
      
    
   //    compile    environment    .   
   c:\pclint\lnt\env-si.lnt   
      
    
   //    system    lib    include    .   
   c:\pclint\lnt\co-msc60.lnt   
   c:\pclint\lnt\lib-w32.lnt   
      
    
   //    system    stdio    hearder    files    directory    .   
   -i"D:\Program    Files;D:\Program    Files\Microsoft    Visual    Studio\VC98\Include"   
      
    
   //    user's    defined    lint    configure    file    .   
   G:\work\eva_skype\handset\app\si.lnt    -si4    -sp4   
      
    
   //************************************************************************   
   //************************************************************************   
      
      
      
      
   kc51.lnt   
   //    kc51.lnt    content    for    Keil    C51    .   
   //************************************************************************   
   //************************************************************************   
      
    
   //    compile    environment    .   
   -i"c:\pclint\lnt\evn-keil.lnt"   
      
    
   //    system    lib    include    .   
   c:\pclint\lnt\co-kc51.lnt   
      
    
   //    system    stdio    hearder    files    directory    .   
   -i"D:\Program    Files\EVA_KEILC51\C51\INC"   
      
    
   //    user's    defined    lint    configure    file    .   
   G:\work\eva_skype\handset\kc.lnt    -si4    -sp4   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理