1) 弄清楚几件事
正常下载的pclint基本上是8。00e版本,选项中没有2005的支持,
从csdn上下载的和visual lint 的pc-lint 2005 是8.00x版本,支持2005。
(2)通过D:/Lint/lint-nt -v -i"D:/Lint" std.lnt
来查看版本号。“-i"D:/Lint" std.lnt”可以不写。
(3)如何在vs2005中添加配置信息
PC-lint for C/C++是由Gimpel软件公司于1985年开发的代码静态分析工具,它能有效地发现程序语法错误、潜在的错误隐患、不合理的编程习惯等。
FlexeLint for C/C++是在PC_lint在windows平台获得成功后,同样由Gimpel公司开发的,以源代码形式发布的,在Unix/Linux平台上的静态代码分析工具。
本文主要介绍PC-lint的安装与配置,因此是在windows平台上进行讨论。
PC-lint支持几乎所有流行的编译器和IDE环境,可能因为其发展历史和面对专业程序员群体的原因,它是以命令行加配置文件的形式进行使用,所以其使用习惯跟现在常见的windows软件不同。
现以PC-lint与VS2005进行集成来说明:
将PC-lint释放到某一目录下,如:D:/Program Files/pclint.将新建一std.lnt文件在主目录中,并将添加上以下的内容
au-sm.lnt
co-msc80.lnt
lib-mfc.lnt
lib-stl.lnt
lib-w32.lnt
lib-wnt.lnt
lib-atl.lnt
options.lnt -si4 -sp4
-i "C:/Program Files/Microsoft Visual Studio 8/VC/include"
-i "C:/Program Files/Microsoft Visual Studio 8/VC/atlmfc/include"
-i "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include"
-i "C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/include"
注意:-i后面为相应的vc头文件目录路径,而一系列xxx.lnt是语法配置规则,决定了按什么规则进行检查,以后可以根据需要进行增减. 写在配置文件中相应的的xxx.lnt从lnt子目录中,拷贝到主目录中
.(这一步很重要) 在vs2005中的工具->外部工具中,点击"添加",新建一个外部工具.标题可以任意,可取(pc_lint);命令为:D:/Program Files/pclint/LINT-NT.EXE;参数为:-i"D:/Program
Files/pclint" std.lnt "$(ItemFileName)$(ItemExt)";初始目录为:$(ItemDir),并将下面的"使用输出窗口"勾选上. 接下来,就可以写一段程序,在工具菜单中选择pc_lint 来进行检查了.如果你
编写的程序有不符合定义的规范,则会在输出窗口中出现相关的信息.
本人在使用时,发现一个需要大家关注的地方,-i"D:/Program Files/pclint" 最后面不要添加“/”, 否则会出错。
(4)visual lint 是在pc lint 基础上进行可视化的操作的。所以我们通过上面的方式,还是通过安装visual lint方式,其检测内容和结果是一致的,visual lint 更加直观一些!我们进行告警筛选的时候,都是在手动修改stl.lnt和option.lnt进行。这里有一个技巧,大家需要掌握,我们尽可能在option.lnt中添加目录变量,目录必须是绝对路径。比如-i"E:/GPTMap-2009/INCLUDE/m3d_view"。
(5)我们需要选择一些告警,而不是所有的告警。这里就需要搜集一些常见的告警,msg.txt中列出了所有的告警信息,便于我们查找和理解!
(6)这里还有一些信息,在其他的地方都可以找到,就不重复了!
这里提供一些常用的告警,网友可以根据具体情况继续添加
+e506 //固定的Boolean值 char c=3; if(c<300){}
+e525 //缩排格式错误
+e527 //无法执行到的语句 if(a > B) return TRUE; else return FALSE;return FALSE;
+e529 //变量未引用 检查变量未引用的原因
+e530 //使用未初始化的变量
+e539 //缩排格式错误
+e545 //对数组变量使用& char arr[100], *p; p=&arr;
+e603 //指针未初始化 void print_str(const char *p); … char *sz; print_str(sz);
+e605 //指针能力增强 void write_str(char *lpsz); … write_str(“string”);
+e613 //可能使用了空指针
+e616 //在switch语句中未使用break;
+e650 //比较数值时,常量的范围超过了变量范围 if( ch == 0xFF ) ...
+e713 //把有符号型数值赋给了无符号型 数值
+e715 //变量未引用
.......