如何使用开源c静态代码检查工具测工具Splint

当前位置:
文件名称:splint-3.0.1.6-2.win32
所属分类:
标签属性:
上传时间:
文件大小:
浏览/下载:
327次 / 0次
提 供 者:
相关连接:
下载说明:
别用迅雷下载,失败请重下,重下不扣分!
介绍一个静态代码检查的工具给大家 -- SPLint。
这是一个开源的工具,主要用于学术,但是也被应用。
同时有Windows和Linux版本。
URL:http://www.splint.org/-介绍一个静态代码检查的工具给大家-- SPLint。
这是一个开源的工具,主要用于学术,但是也被应用。
同时有Windows和Linux版本。
URL:http://www.splint.org/相关搜索:
(系统自动生成,下载前可以参看下载内容)下载文件列表
splint-3.0.1.6
..............\acinclude.m4
..............\aclocal.m4
..............\bin
..............\...\CVS
..............\...\...\Entries
..............\...\...\Repository
..............\...\...\Root
..............\...\splint.exe
..............\bootstrap
..............\config
..............\......\config.guess
..............\......\config.sub
..............\......\CVS
..............\......\...\Entries
..............\......\...\Repository
..............\......\...\Root
..............\......\depcomp
..............\......\install-sh
..............\......\missing
..............\......\mkinstalldirs
..............\config.h
..............\config.hin
..............\config.status
..............\configure
..............\configure.ac
..............\CVS
..............\...\Entries
..............\...\Repository
..............\...\Root
..............\doc
..............\...\CVS
..............\...\...\Entries
..............\...\...\Repository
..............\...\...\Root
..............\...\lclint.1
..............\...\manual.doc
..............\emacs
..............\.....\CVS
..............\.....\...\Entries
..............\.....\...\Repository
..............\.....\...\Root
..............\.....\lclint-abbrevs
..............\imports
..............\.......\assert.lcl
..............\.......\assert.lcs
..............\.......\ctype.lcl
..............\.......\ctype.lcs
..............\.......\CVS
..............\.......\...\Entries
..............\.......\...\Repository
..............\.......\...\Root
..............\.......\errno.lcl
..............\.......\errno.lcs
..............\.......\limits.lcl
..............\.......\limits.lcs
..............\.......\locale.lcl
..............\.......\locale.lcs
..............\.......\Makefile
..............\.......\Makefile.am
..............\.......\Makefile.in
..............\.......\math.lcl
..............\.......\math.lcs
..............\.......\setjmp.lcl
..............\.......\setjmp.lcs
..............\.......\signal.lcl
..............\.......\signal.lcs
..............\.......\stdarg.lcl
..............\.......\stdarg.lcs
..............\.......\stdio.lcl
..............\.......\stdio.lcs
..............\.......\stdlib.lcl
..............\.......\stdlib.lcs
..............\.......\string.lcl
..............\.......\string.lcs
..............\.......\strings.lcl
..............\.......\strings.lcs
..............\.......\time.lcl
..............\.......\time.lcs
..............\lib
..............\...\ansi.h
..............\...\ansi.lcd
..............\...\ansistrict.lcd
..............\...\bool.h
..............\...\CTrait.syms
..............\...\CTraitGen.lcl
..............\...\CVS
..............\...\...\Entries
..............\...\...\Repository
..............\...\...\Root
..............\...\file.mts
..............\...\file.xh
..............\...\filerw.mts
..............\...\filerw.xh
..............\...\lclinit.lci
..............\...\linux.h
..............\...\lslinit.lsi
..............\...\Makefile
..............\...\Makefile.am
..............\...\Makefile.am~
暂无评论内容.
*快速评论:
和说明不符
不是源码或资料
纯粹是垃圾
*内  容:
*验 证 码:
搜珍网是交换下载平台,下载的内容请自行研究使用或咨询上传人.
资源属性分别代表:系统平台,开发平台,开发语言,文件格式四部分.
本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用进行解压.
如果您发现此软件无法下载,请稍后再次尝试;或者.
本站提供下载的内容为网上收集或会员上传提供,若无意中侵犯了您的版权,.
如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
如下载后发现下载的内容跟说明不相乎,可以联系本站的客服,经确认可以退回消费了的积分.
联系我们网站
·电话:(0)
All Rights Reserved.1. C代码静态分析工具
读取一个或多个 C/C++源程序,将每个源程序分割成函数标志流,然后检查生成的标志是否存在于漏洞数据库中,从而得到每个源程序的所有错误警告列表,并带有相关的描 述。其规则库vulns.i4d定义了各种函数的危险等级,描述等,通过规则匹配来报出风险,但它不能理解程序上下文意思,存在很大的误报。
Flawfinder
词法扫描和分析,内嵌了一些漏洞数据库,如缓冲区溢出、格式化串漏洞等,扫描快,按照代码中漏洞的风险等级对漏洞进行划分,可以快速找到存在的问题,误报较高。
扫描C、C++、Perl、PHP和Python开发的源程序中潜在的漏洞,扫描规则比较粗糙。
一个由Gimpel Software提供的支持C/C++的商用程序
(原来的 LCLint) 是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误
2. splint安装
http://www.splint.org/downloads/splint-3.1.2.src.tgz
源码包安装:
# tar zxvf splint-3.1.2.src.tgz
# cd splint-3.1.2
# ./configure&&--prefix=$HOME/splint
会出现错误。解决的办法:在cscanner.c中,直接增加函数:yywrap的定义如下:
int&yywrap()
#vi& ~/.bashrc
在文件中加入:
export LARCH_PATH=$HOME/splint/share/splint/lib
export LCLIMPORTDIR=$HOME/splint/share/splint/imports
.& ~/.bashrc
环境变量export PATH=$HOME/splint/bin:$PATH
5. 检查控制
splint提供了三种方式进行检查的控制,分别是flags标志、 .splintrc配置文件和格式化注释。
oflags: splint支持几百个标志用来控制检查和消息报告,使用时标志前加‘+’或‘-’,‘+’标志开启这个标志,‘-’表示关闭此标志。下面例子展示了flags标志的用法:
splint -showcol a.c //在检测a.c时,告警消息中列数不被打印
splint -varuse a.c //在检测a.c时,告警消息中未使用变量告警不被打印
o.splintrc配置文件: .splintrc文件中对一些flags做了默认的设定,命令行中指定的flags会覆盖.splintrc文件中的标志。
格式化注释:格式化注释提供一个类型、变量或函数的额外的信息,可以控制标志设置,增加检查效果。所有格式化注释都以/*@开始,@*/结束,比如在函数参数前加,表示该参数可能是NULL,做检测时,splint会加强对该参数的值的检测。
本文已收录于以下专栏:
相关文章推荐
随着linux的逐步普及,现在有不少人对于Linux的安装及设置已经比较熟悉了。与Linux 的蓬勃发展相适应,想深入了解Linux的也越来越多。而要想深入了解Linux,就需要阅读和分析linux内...
linux源代码分析和阅读工具比较
Windows下的源码阅读工具Souce Insight 凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”。Linux/UNIX环境下呢?似乎...
最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对其他...
windows下的码流分析工具非常多,比如elecard streameye,当然还有众多开源贡献者制作的小工具,但是很多时候我们都需要在Linux下做开发,也可能需要做一些简单的码流分析工作,这里就...
到如下了/documents/unix_install.php
Installation
Uncompress and extract the cont...
静态程序分析
先来说说什么是“静态程序分析(Static program analysis)”,静态程序分析是指使用自动化工具软件对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检...
最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对其他...
最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对其他...
代码静态分析工具——splint的学习与使用
最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)&&&&&&正文
软件测试实验学习笔记系列2 -- lint,splint的使用
摘要:软件测试实验学习笔记系列2 -- lint,splint的使用
lint简史1979年,贝尔实验室SteveJohnson于1979在PCC(PortableCCompiler)基础上开发的出了代码分析工具Lint,可以检查出很多的不符合规范的的错误(如将“==”写成了“=”)以及函数接口参数不一致性的问题等,完成代码健壮性的检查。Lint后来形成了一系列的工具,包括PC-Lint/FlexeLint(Gimpel),LintPlus(Cleanscape)以及Splint.功能通常C/C++编译器假设程序是正确的,Lint恰好相反,因此它有优于编译器执行的一般性的代码检查。Lint还可以在多个文件之间执行错误检查和代码分析。下面是一些Lint可以检查出来的部分的错误列表:可能的空指针在释放内存后使用了指向该内存的指针赋值次序问题拼写错误被0除失败的case语句(遗漏了break语句)不可移植的代码(依赖了特定的机器实现)宏参数没有使用圆括号符号的丢失异常的表达式变量没有初始化可疑的判断语句(例如,if(x=0))printf/scanf的格式检查现有的Lint程序主要有两个版本:①PC-Lint,由GimpelSoftware提供的支持C/C++的商用程序。官方地址:②Splint(原来的LCLint)是一个有GNU免费授权的Lint程序,只支持c,而不支持c++.官方地址:由于PC-lint是商业软件,虽说功能强大,但是容易获取。这里主要介绍GNU的splint工具。开源的代码静态分析工具SplintSplint是一个动态检查C语言程序安全弱点和编写错误的一个程序,会进行多种错误检查:未使用变量,类型不一致,使用未定义的变量,无法执行的代码,忽略返回值,执行路径没有返回,无限循环等错误。Splint的安装1.在Linux下的安装1.1rpm安装:rpm -ivh splint.xxx.rpmrpm安装包是著名的Linux发行商Redhat推出的基于源代码的软件包方式。这种安装方式的缺点是如软件依赖项有很多并且你没有安装那些依赖项时,哈哈,恭喜你,你有事忙了,需要满互联网的找到那些依赖项并安装好;如果依赖项还有依赖项并且你又没有安装,我只能说,哥们你中彩了。1.2Ubuntu或者Debian下安装sudo apt-get install splint这种安装最省事,唯一的缺点是,安装的软件的版本可能不是最新的,以及总是按照默认的配置来安装的软件的---不够灵活1.3源代码安装(通用)tar -zxvf splint-3.1.2.src.gzcd splint-3.1.2./configuremakemake install2.在window下安装可以使用源代码安装的方式.最新的官网提供了window下的软件安装包(msi格式),地址是:由于本人使用的是Ubuntu12.04LTS,splint安装使用的是apt-get的安装方式,splint的版本是3.1.2,以下的介绍都是以次为基础的。splint的命令 splint的命令语法和其他的GNU/Linux的语法一致,其语法形式如下: splint [-options] &*.c 遇到一些特别的情况可以通过man splint或者浏览手册页来获取帮助。 splint的应用4.1 splint 消息通过以下面的例子来认识典型的splint告警信息:[cpp] 运行splint splint_msg.c之后,观察输出的告警信息:splint_msg.c: (in function func_splint_msg1)splint_msg.c:4:6: Variable a declared but not used &A variable is declared but never used. Use /*@unused@*/ in front of &declaration to suppress message. (Use -varuse to inhibit warning)splint_msg.c: (in function func_splint_msg2)splint_msg.c:10:2: Fresh storage a (type int *) not released before assignment: & & & & & & & & & & &a = NULL &A memory leak has been detected. Storage allocated locally is not released &before the last reference to it is lost. (Use -mustfreefresh to inhibit &warning) & splint_msg.c:9:37: Fresh storage a createdFinished checking --- 2 code warnings蓝色字体部分:给出告警所在函数名,在函数的第一个警告消息报告前打印;红色字体部分:消息的正文,文件名、行号、列号显示在的警告的正文前;黑色字体部分:是有关该可疑错误的详细信息,包含一些怎样去掉这个消息的信息;绿色字体部分:给出格外的位置信息,这里消息给出了是在哪里申请了这个可能泄露的内存。4.2.检查控制splint提供了三种方式可进行检查的控制,分别是.splintrc配置文件、flags标志和格式化注释。flags:splint支持几百个标志用来控制检查和消息报告,使用时标志前加’+‘或’-’,'+'标志开启这个标志,'-'表示关闭此标志,下面例子展示了flags标志的用法:splint -showcol a.c & //在检测a.c时,告警消息中列数不被打印splint -varuse &a.c & //在检测a.c时,告警消息中未使用变量告警不被打印.splintrc配置文件:在使用源码安装splint之后,.splintrc文件将被安装在主目录下,.splintrc文件中对一些标志作了默认的设定,命令行中指定的flags标志会覆盖.splintrc文件中的标志。格式化注释:格式化注释提供一个类型、变量或函数的格外的信息,可以控制标志设置,增加检查效果,所有格式化注释都以/*@开始,@*/结束,比如在函数参数前加/*@null@*/,表示该参数可能是NULL,做检测时,splint会加强对该参数的值的检测。4.3 检测内容分析空引用错误:/*@null@*/--splint支持的注释类型,表明其后跟随的值可能为null实例程序,null.c:[cpp] splint命令: splint null.c结果输出:Splint 3.1.2--- 03 May 2009Spec filenot found: null.lclnull.c:2:65:Comment starts inside commentA commentopen sequence (/*) appears within a comment. This usually means anearliercomment was not closed. (Use -nestcomment to inhibit warning)null.c: (infunction firstChar1)null.c:4:10:Dereference of possibly null pointer s: *sA possiblynull pointer is dereferenced. Value is either the result of afunctionwhich may return null (in which case, code should check it is notnull), ora global, parameter or structure field declared with the nullqualifier.(Use -nullderef to inhibit warning)null.c:3:33:Storage s may become nullFinishedchecking --- 2 code warnings函数firstChar1和firstChar2都使用了null的说明,表示指针s可能是一个空指针,所以splint会对s的值使用情况进行检查,由于firstChar2中对s的值进行了判断,所以没有对firstChar2函数中s输出警告信息。未定义变量错误:C中使用没有定义变量会出错,/*@in@*/说明的变量表示必须先进行定义./*@out*@/表明在执行过函数后,这个变量就进行了定义。--个人感觉/*@out*@/类似与C#中的out关键字。实例1:usedef.c[cpp] splint命令:splint usedef.csplint执行的结果:Splint 3.1.2--- 03 May 2009usedef.c:(in function dumbfunc)usedef.c:8:17:Value *x used before definition#在一些执行路径中一个右值的被使用的时候可能没被初始化,An rvalueis used that may not be initialized to a value on some executionpath. (Use-usedef to inhibit warning)usedef.c:10:17:Passed storage x not completely defined (*x is undefined):getVal(x)Storagederivable from a parameter, return value or global is not defined.Use/*@out@*/ to denote passed or returned storage which need not bedefined.(Use-compdef to inhibit warning)usedef.c:12:21:Passed storage x not completely defined (*x is undefined):mysteryVal(x)Finishedchecking --- 3 code warnings错误原因:由于程序中没有对X定义,所以报出未定义的错误.但是由于setVal()使用了/*@out*@/说明,所以在语句“setVal(x)”和“returnx”中,没有报未定义错误。类型错误:C语言中的变量类型比较多,彼此之间有些细微的差别,splint可以对变量的类型进行检查:实例1.typeerr.c[cpp] splint命令:splint typeerr.csplint执行的结果:Splint 3.1.2--- 03 May 2009typeerr.c:(in function foo)typeerr.c:3:5:Test expression for if is assignment expression: i = 3Thecondition test is an assignment expression. Probably, you mean to use==instead of=. If an assignment is intended, add an extra parentheses nesting(e.g., if((a = b)) ...) to suppress this message. (Use -predassign toinhibitwarning)#错误类型:if语句中的条件表达式是一个赋值语句。typeerr.c:3:5:Test expression for if not boolean, type int: i = 3Testexpression type is not boolean or int. (Use -predboolint to inhibitwarning)#错误类型:if语句中的条件表达式返回值不是bool类型而是int类型typeerr.c:3:17:Return value type bool does not match declared type int: b1Types areincompatible. (Use -type to inhibit warning)#错误类型:!的操作数不是bool类型而是int类型的itypeerr.c:4:6:Operand of ! is non-boolean (int): !iTheoperand of a boolean operator is not a boolean. Use +ptrnegate toallow !to be usedon pointers. (Use -boolops to inhibit warning)#错误类型:||操作符的右操作数不是bool类型而是整型typeerr.c:4:11:Right operand of || is non-boolean (char *): !i || s##错误类型:不应该使用==对两个bool类型进行比较,而应该使用&&typeerr.c:6:5:Use of == with boolean variables (risks inconsistency because ofmultipletrue values): b1 == b2Two boolvalues are compared directly using a C primitive. This may produceunexpectedresults since all non-zero values are considered true, sodifferenttrue values may not be equal. The file bool.h (included insplint/lib)provides bool_equal for safe bool comparisons. (Use -boolcompareto inhibitwarning)Finishedchecking --- 6 code warnings实例2.malloc1.c[cpp] splint命令:splint malloc1.c使用是splint检查malloc1.cSplint 3.1.2--- 03 May 2009malloc1.c:(in function main)malloc1.c:8:28:Function malloc expects arg 1 to be size_t gets int: size1To allowarbitrary integral types to match any integral type, use+matchanyintegral.将size1的定义修改为:size_t size1= 1048567;再次使用splint将行检查:splintmalloc1.cSplint 3.1.2--- 03 May 2009Finishedchecking --- no warnings 内存检查:缓冲区溢出是一种非常危险的c语言错误,大部分安全漏洞都与它有关,splint可以对缓冲区的使用进行检查,报告溢出或越界错误。实例:overflow.c[cpp] splint命令:splint overflow.c +bounds +showconstraintlocationsplint执行的结果:-Splint 3.1.2--- 03 May 2009CommandLine: Setting +showconstraintlocation redundant with current valueoverflow.c:(in function main)overflow.c:4:2:Likely out-of-bounds store: buf[10]Unableto resolve constraint:requires9 &= 10neededto satisfy precondition:requiresmaxSet(buf @ overflow.c:4:2) &= 10A memorywrite may write to an address beyond the allocated buffer. (Use-likelyboundswriteto inhibit warning)Finishedchecking --- 1 code warning错误类型:数组buf的大小是10字节,最大也可使用的buf[9],但是程序中使用了buf[10],数组越界了,所以报错了。实例程序2.bound.c[cpp] splint命令:splint bound.c +bounds +showconstraintlocationsplint执行的结果:Splint3.1.2 --- 03 May 2009CommandLine: Unrecognized option: +A flag isnot recognized or used in an incorrect way (Use -badflag to inhibitwarning)Spec filenot found: showconstraintlocation.lclCannot openfile: showconstraintlocation.cbound.c: (infunction updateEnv)bound.c:5:18:Possible out-of-bounds store: strcpy(str, tmp)Unableto resolve constraint:requiresmaxSet(str @ bound.c:5:25) &= maxRead(getenv(&MYENV&) @bound.c:4:8)neededto satisfy precondition:requiresmaxSet(str @ bound.c:5:25) &= maxRead(tmp @ bound.c:5:29)derivedfrom strcpy precondition: requires maxSet(&parameter 1&) &=maxRead(&parameter2&)A memorywrite may write to an address beyond the allocated buffer. (Use-boundswriteto inhibit warning)bound.c: (infunction updateEnvSafe)bound.c:13:3:Possible out-of-bounds store: str[strSize - 1]Unableto resolve constraint:requiresmaxSet(str @ bound.c:13:3) &= strSize @ bound.c:13:7 + -1neededto satisfy precondition:requiresmaxSet(str @ bound.c:13:3) &= strSize @ bound.c:13:7 - 1Finishedchecking --- 2 code warnings错误类型:由于使用strcpy函数,没有指定复制字符串的长度,所以,可能导致缓冲区溢出。UpdateEnvSafe中使用strncpy进行字符串复制,从而避免了缓冲区溢出的错误。小结 & & & & 在命令行下使用的splint非常的强大,splint同样可以可以集成到IDE 中.具体的要IDE的其他工具的设置。splint同样也可以写到在makefile文件中,然后使用make命令来预先检查代码中常见的静态错误。 & & & & 有了上面的这些简单的实例的演示,我们可以感受到splint的强大之处,当然,这里的介绍仅仅是一个简单抛砖引玉。更多的有关splint的内容可以参考参考文献[4],更多关于splint的使用可以参考splint 的官方手册[4]. & & & & 尽管pc-lint、splint等静态程序分析工具的功能强大,它们对程序的检查也有疏漏的地方,工具的使用并不能提高个人的编程能力,我们更应该通过它们学习各种编码错误和代码隐患,凭积累的编码知识把程序隐患扼杀在摇篮里。 & & & & 除了C有静态的代码工具以外,java中也有一款开源的功能强大的静态代码检查工具。
全国校区查询
技术分享点击榜
技术分享最新文章
官方新版意见收集
*您的积极反馈是我们前进的动力
官方新版意见收集
提交成功,感谢您的反馈。
我们会认真阅读和考虑每个用户的反馈。有哪些好用的轻量级 C 代码静态检测工具? - 知乎214被浏览4889分享邀请回答oschina.net/p/frama-c2. 项目名称:C/C++代码分析工具 cppcheck项目简介:cppcheck 是静态的 C/C++ 代码分析工具,用以检查内存泄漏,错配的内存分配和释放,缓冲区溢出,以及更多的问题。项目地址:3. 项目名称:C 代码漏洞检测工具 Splint项目简介:splint 是一个开源的静态代码检测工具,用于动态检查 C 语言程序安全弱点和编写错误的程序。splint 会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。它以大师级的眼光来审阅你的代码,Splint 只能检测标准 C 代码。项目地址:4. 项目名称:C/C++ 代码静态分析插件 SourceInsight_Scan项目简介:sourceinsight-scan 是一款集成在 SourceInsight 中的 c/c++ 代码静态分析插件,集成了 cppcheck,coverity,pclint 等业界优秀的静态分析工具的优点。旨在帮助开发人员,在 IDE 中快速发现编译器无法发现的非语法错误,降低修复成本。无需编译,平均扫描速度高达10W行/分钟,快速帮您发现潜在的质量风险,包括空指针,越界,内存泄漏及潜在的逻辑错误,平均准确率高达80%。 项目地址:5. 项目名称:Eclipse 的 C/C++ 代码检测插件 Goanna项目简介:Goanna 是一个 Eclipse 用来对 C/C++ 源码进行静态分析的插件,它检测许多种可能出现空的指针引用、重复释放内存、没有初始化的变量等其他常见编程错误。项目地址:6. 项目名称:C语言内存泄漏检测工具 MemLeak项目简介:MemLeak 是一个 C 语言内存泄漏检测工具。 原理是利用 C 语言的宏调用来替代原有的函数调用, memleak 维护了一个链表,在这个链表中保存着程序中对内存函数调用的记录,这些函数包括:malloc、calloc、realloc、free。项目地址:来码云 发现更多优质开源项目:让团队流畅、高效开发:16添加评论分享收藏感谢收起

我要回帖

更多关于 静态代码分析工具 的文章

 

随机推荐