1.   PC-Lint工具介绍

PC-Lint for C/C++是由Gimpel软件公司于1985年开发的代码静态分析工具,它能有效地发现程序语法错误、潜在的错误隐患、不合理的编程习惯等。

C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PC-Lint能识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PC-lint能够帮你在程序动态测试之前发现编码错误,这样消除错误的成本更低。使用PC-Lint在代码走读和单元测试之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。并提供编码规则检查,规范软件人员的编码行为。

PC-Lint能够检查出很多语法错误和语法上正确的逻辑错误,PC-Lint为大部分错误消息都分配了一个错误号,编号小于1000的错误号是分配给C语言的,编号大于1000的错误号则用来说明C++的错误消息。表 1 列出了PC-Lint告警消息的详细分类:详细信息可参考c:/lint/msg.txt 文件

C             C++           Warning Level

Syntax Errors            1 - 199     1001 - 1199           1
Internal Errors        200 - 299     1200 - 1299           0
Fatal Errors           300 - 399                           0
Warnings               400 - 699     1400 - 1699           2
Informational          700 - 899     1700 - 1899           3
Elective Notes         900 - 999     1900 - 1999           4
以C语言为例,其中的编号1-199指的是一般编译器也会产生的语法错误;编号200-299是PC-Lint程序内部的错误,这类错误不会出现在代码中的;编号300-399指的是由于内存限制等导致的系统致命错误。编号400-999中出现的提示信息,是根据隐藏代码问题的可能性进行分类的:其中编号400-699指的是被检查代码中很可能存在问题而产生的告警信息;编号700-899中出现的信息,产生错误的可能性相比告警信息来说级别要低,但仍然可能是因为代码问题导致的问题。编号900-999是可选信息,他们不会被默认检查,除非你在选项中指定检查他们。

2.   安装

pclint不是免费的哦。不过也不贵,我们公司好像只花了2K大洋吧。运行安装文件pclint9后就可以很简单地安装了。

版本

Q:如何查看版本?

A:见readme.txt:

PC-lint for C/C++ Version 9.00e

3.   开始使用

3.1. 不用任何配置,直接使用

3.1.1.    准备待被检查的文件:

先在E:/建一个文件:main.cpp,内容为:

void main()

{

}

3.1.2.    最简单的用法

在命令行下输入:D:/>C:/lint/lint-nt E:/main.cpp

C:/lint>C:/lint/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:/lint>

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

3.1.3.    最简单的标准用法

修改被检查的文件E:/main.cpp,内容修改为:

#include <stdio.h>

void main()

{

printf("hello pclint/n");

}

再次在命令行下输入:D:/>C:/lint/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:/lint/std.lnt 这个文件。

3.2. std.lnt的配置:

3.2.1.    std.lnt的默认内容

C:/lint/std.lnt默认内容可能为空。

我们可以通过运行C:/lint/config.exe来自动生成内容。

3.2.2.    修改std.lnt

运行C:/lint/CONFIG.EXE, 

在"Select Your Compiler"(问你的编译器是什么)里选"Microsoft Visual C++ 2008(co-msc90.int)"

在“Architecture"(问你的系统是什么架构)里选“32-bit Flat Model (-ms, -si4 -sp4)”,因为我是为32位的系统测试,你可以按你的产品的架构来改。

在“Libraries"(问你需要用到哪些库)里,我这知道怎么选,最后搞了个“Standard Template Library“

在“Author Recommendations“(问你需要用哪些高手前辈的建议来规范你的代码风格)里选了个"MISRA C 2004"(汽车工业软件可靠性联合会的标准)。

在“Header Files”(问你的系统头文件在哪个路径下)页里选“Create -i options“,在里面输入inclue的路径 C:/Program Files/Microsoft Visual Studio 9.0/VC/include

最后问你是否需要使用你的最新配置为默认设置时,你可以答应,这就覆盖了std.lnt的内容了:

//  Microsoft Visual C++ 2008, -si4 -sp4, lib-stl.lnt lib-w32.lnt

//  Standard lint options

au-misra2.lnt

co-msc90.lnt

lib-stl.lnt lib-w32.lnt

options.lnt  -si4 -sp4

-i"C:/Program Files/Microsoft Visual Studio 9.0/VC/include"

注:如果生成的std.lnt内容与上面不一样,可以手工修改成上面那样。

也可以不答应,然后会自动命名为另一个文件:std_A.lnt。你可以在运行lint命令时指定用它就行了。

3.3. 使用std.lnt

再次在命令行下输入:D:/> C:/lint/lint-nt -i"C:/lint" -u std.lnt e:/main.cpp

或者是C:/lint/lint-nt -i"C:/lint" -u std_A.lnt e:/main.cpp

-i"C:/lint"  指明在哪个路径下找配置文件*.lnt

-u std.lnt   指明使用std.lnt这个选项文件.

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

-i 指明包含路径

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

4.   其它开发工具下的配置

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

4.1. VC下的配置(我用的是Visual C++ 2008 Express Edition)

点Tools/External Tools...,

新建一自定义工具项,名称为:PClint

Command里定位到你的PLlint:C:\lint\lint-nt.exe

Arguments为:-i"C:/lint" -u std.lnt env-vc9.lnt "$(FileName)$(FileExt)"

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

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

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

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

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

记得把下面的"Use Output window"钓上,否则你看不到输出了。

4.2. 示例

4.2.1.    testForPclint1

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

void main()

{

}

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

PC-lint for C/C++ (NT) Ver. 9.00f, 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

4.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

5.   使用批处理方法

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

我们在C:/lint建一个批处理文件lint.bat,内容为:

@echo off

C:/lint/lint-nt -i"C:/lint" -u std.lnt e:/main.cpp

为了支持输入参数,修改为:

@echo off

C:/lint/lint-nt -i"C:/lint" -u std.lnt %1

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

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

PC-Lint概念与基本操作的更多相关文章

  1. InfluxDB概念和基本操作 二

    InfluxDB概念和基本操作   InfluxDB基本概念 数据格式 在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value ...

  2. Monogb基本概念及基本操作

    MongoDB是面向文档的数据库. 索引:MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的.复合的和地理空间索引能力. 存储JavaScript:开发人员不必使用存储过程了,可以直接在 ...

  3. Mysql概念及基本操作

    1.Mysql 概念 1.1 定义 数据库本质是一个C/S的套接字软件 关系型数据库:MySQL mariadb db2 非关系型:存取数据是以key:Value mongodb redis 1.2 ...

  4. python文件(概念、基本操作、常用操作、文本文件的编码方式)

    文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...

  5. InfluxDB概念和基本操作

    InfluxDB基本概念 数据格式 在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value).格式如下: cpu_usage, ...

  6. 从零开始学习GDI+ (二) 基本概念与基本操作

    从零开始学习GDI+ (一)我的第一个GDI+程序 上文给新手学习GDI+讲述了vs环境等的准备工作,并且可以直接用GDI+绘图了.本文开始,讲述的可能偏理论,建议学习的过程中大胆尝试,多使用API. ...

  7. Docker 镜像、容器、仓库的概念及基本操作

    Docker 包括三个基本概念: 镜像(Image)容器(Container)仓库(Repository) 这三部分组成了Docker的整个生命周期,如下图所示,容器是由镜像实例化而来的,这和我们学习 ...

  8. 初识elasticsearch_1(基本概念和基本操作)

    初识 ElasticSearch是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.本博客部分基于es的官方文档.es的官方文档网址如下:h ...

  9. Oracle 用户概念与基本操作

    目录 目录 Oracle的用户 通过系统用户来登陆SQLPlus system和sys的区别 查看登陆的用户 启用和锁定一个用户 启用用户 锁定用户 创建用户 修改用户 删除用户 角色权限 常用的用户 ...

随机推荐

  1. Q值, 电感Q因素, 电感品质因素, Inductor Q, Quality Factor

    Q值基本概念 Q值, 品质因素, Quality Factor 是广泛使用于物理和工程领域的一个参数, 这指的是一个机械或非机械的组件里, 共振(谐振)的能量损失比例, 是衡量一个元件或谐振回路性能的 ...

  2. Androidstudio安装问题

    非常多人在用Android Studio的时候会出现"'tools.jar' seems to be not in Android Studio classpath.Please ensur ...

  3. JDBC连接方式有哪几种

    2011-05-10 目前比较常见的JDBC驱动程序可分为以下四个种类:  (1)JDBC-ODBC桥加ODBC驱动程序  JavaSoft桥产品利用ODBC驱动程序提供JDBC访问.注意,必须将OD ...

  4. Silverlight for Windows Phone开发系列课程

    Silverlight for Windows Phone开发系列课程(1):Windows Phone平台概况         课程简介:本节开始介绍系列课程的概况,包括课程内容,先决条件,学习目的 ...

  5. 最新CoreData封装Demo

    1.创建CoreData文件 2. 3. 4. UploadCoreDataAPI.h // // UploadCoreDataAPI.h // dsafsda // // Created by 冯敏 ...

  6. Java用JSONObject-lib来解析json串

    直接贴代码:(所需jar包:json-lib.jar,可能会关联一些其它的jar包,请自行搜索.) import java.util.ArrayList; import java.util.HashM ...

  7. Swift 构造与析构

    前言 与 OC 一样,Swift 中也存在构造和析构过程.不同的是,OC 中的构造方法和析构方法只是普通的方法,而 Swift 中构造器和析构器是一种特殊的结构. 1.构造器 在 Swift 中,类或 ...

  8. Linux C 编程一站式学习

    个人认为这是一个挺不错的从C语言到Linux系统开发的教程,这本是两个网上的文档. 其中 一本是<How To Think Like A Computer Scientist: Learning ...

  9. VC学习笔记:状态栏

    原文链接: http://www.cnblogs.com/skyseraph/archive/2010/11/27/1889952.html 实例学习 1  新建对话框程序 2  为Dlg类添加成员变 ...

  10. The password supplied with the username Domain\UserName was not correct. Verify that it was entered correctly and try again

    起因 今天想进入SharePoint 2013 Central Administration创建一个WebApplication,尽然发生了错误: The password supplied with ...