Splint介绍

Splint介绍1 静态分析工具 VS 编译器编译器负责把 C 源程序快速 高效地转变为可执行文件 不对代码做类型检查 特别是对分别编译的程序 有益于做到快速与高效 Lint 没有 高效 的要求 可以花更多时间对代码进行更深入 仔细的检查 2 C 代码静态分析工具 Its4 读取一个或多个 C C 源程序 将每个源程序分割成函数标志流

1. 静态分析工具 VS 编译器

      编译器负责把C源程序快速、高效地转变为可执行文件,不对代码做类型检查(特别是对分别编译的程序),有益于做到快速与高效。

      Lint没有“高效”的要求,可以花更多时间对代码进行更深入、仔细的检查。

2. C代码静态分析工具

Its4

读取一个或多个 C/C++源程序,将每个源程序分割成函数标志流,然后检查生成的标志是否存在于漏洞数据库中,从而得到每个源程序的所有错误警告列表,并带有相关的描 述。其规则库vulns.i4d定义了各种函数的危险等级,描述等,通过规则匹配来报出风险,但它不能理解程序上下文意思,存在很大的误报。

Flawfinder

词法扫描和分析,内嵌了一些漏洞数据库,如缓冲区溢出、格式化串漏洞等,扫描快,按照代码中漏洞的风险等级对漏洞进行划分,可以快速找到存在的问题,误报较高。

Rats

扫描C、C++、Perl、PHP和Python开发的源程序中潜在的漏洞,扫描规则比较粗糙。

PC-lint

一个由Gimpel Software提供的支持C/C++的商用程序

Splint

(原来的 LCLint) 是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。

3. splint安装

./configure  –prefix=$HOME/splint

make make install

4. 配置

•#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配置文件和格式化注释。

 

•flags: splint支持几百个标志用来控制检查和消息报告,使用时标志前加‘+’或‘-’,‘+’标志开启这个标志,‘-’表示关闭此标志。下面例子展示了flags标志的用法:

 

•.splintrc配置文件: .splintrc文件中对一些flags做了默认的设定,命令行中指定的flags会覆盖.splintrc文件中的标志。

 

格式化注释:格式化注释提供一个类型、变量或函数的额外的信息,可以控制标志设置,增加检查效果。所有格式化注释都以/*@开始,@*/结束,比如在函数参数前加 /*@null@*/,表示该参数可能是NULL,做检测时,splint会加强对该参数的值的检测。

 
6.

•在$HOME目录下新增.splintrc文件

  -sysdirs /usr/include/:/usr/include/netinet/:/home/gaps/libevent/include/:/home/gaps/libsrc/hslib/common/:/home/gaps/libsrc/gaps/libsha/libincl:/home/gaps/libsrc/dci/include:/home/gaps/libsrc/hslib/libsxml:/home/gaps/src/mcmi/mcmi_cli:/home/gaps/libsrc/gaps/libgapssql:/home/gaps/libsrc/gaps/libgapssfs/libincl

         +single-include

         +skipsysheaders

          +unixlib +bounds

         -I/usr/include-I/home/gaps/incl

         -I/home/gaps/libevent/include

         -I/home/gaps/libincl

         -I/home/gaps/libsrc/dci/include

         -I/home/gaps/libsrc/gaps/libgapssfs/libincl

         -I/home/gaps/libsrc/gaps/libgapssql

         -I/home/gaps/libsrc/gaps/libsha/libincl -I/home/gaps/libsrc/hslib/common

         -I/home/gaps/libsrc/hslib/libsxml -I/home/gaps/lua/include- I/home/gaps/sqlite/include

        -I/home/gaps/src/mcmi/mcmi_cli -I/home/gaps/src/mcmi/memcached

 
7.
Splint的unixlib包括posixlib包括isolib。但都不包含<limits.h>定义的UINT_MAX等宏

Splint的unixlib比posixlib多了(如果用posixlib,自己写的这几个同名头文件似乎就不会被splint include进去?checking macros阶段看出来用上了?):
[1]<unistd.h>定义的socklen_t,in_addr_t,sa_family_t等类型
[2]<sys/select.h>定义的fd_set类型和select函数(遵循POSIX 1003.1-2001)。
[3]<pthread.h>定义的pthread_t,pthread_mutex_t等类型。但却有pthread_create等函数声明。
怎样查看splint的posixlib库包含了哪些头文件?
Splint 知道的POSIX规格是IEEE 1003.1-1990,所以不支持之后规格(如IEEE Std 1003.1b-1993)导入的特性,如siginfo_t结构体等。有两个办法解决:[1]干净的办法是,更新posix.h后重新生成 posix.lcd和posixstric.lcd。Splint手册第14.2节讲述了这方面内容:splint 源码包的lib目录下就有 standard/posix/unix三个库的头文件和lcd文件。按照指示生成一个lcd文件后,在之后运行splint检查时以“-load”选项加载一个自己创建的lcd(注意:最多只能加载一个自己创建的lcd)。[2]As a quick-and-dirty solution, you could provide a dummy definition for siginfo_t.
(4)自己工程定义的宏没有设置好导致语法错误。






 
8.

有些数据类型或函数是编译器扩展的,例如上面的/usr/include/bits/sigthread.h的33行的__sigset_t应当用sigset_t代替:

  sigemptyset((__sigset_t *)&sa.sa_mask);

9.

GCC编译器内建的数据类型__built_va_list被GCC作为基本类型了。

所以,Splint手册指出系统头文件一般是不可解析的!要处理GCC所有内建的预处理宏、数据结构、函数很难,Splint邮件列表有人尝试以这种方式lint linux内核模块成功了。

可能自编C文件依赖于include的系统头文件中某些扩展宏、数据结构、函数声明,可以自己编写与之同名的头文件。这个很容易的:不需要修改工程中任何文件,并且一般写两三个很短的头文件就行了。

 
http://www.cnblogs.com/qingxia/admin/Files.aspx

转载于:https://www.cnblogs.com/qingxia/archive/2012/09/13/2683535.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231948.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ZigBee协议栈(一)–协议栈介绍

    ZigBee协议栈(一)–协议栈介绍1、Zigbee协议栈简介  协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发。  如图1所示:Zigbee协议分为两部分,IEEE802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范;Zigbee联盟定义了NW

    2022年5月28日
    62
  • pycharm如何打开终端_mac怎么打开终端窗口

    pycharm如何打开终端_mac怎么打开终端窗口Pycharm内打开终端

    2022年8月25日
    10
  • react知识总结_六年级教学工作总结个人

    react知识总结_六年级教学工作总结个人React个人入门总结《六》

    2022年4月21日
    81
  • 领导含泪叮嘱我:MySQL 建表字段记得用 not null,不然就收拾包袱滚蛋

    领导含泪叮嘱我:MySQL 建表字段记得用 not null,不然就收拾包袱滚蛋上午我收到一条短信,内容是“尊敬的null你好,XXX”,当时我就笑了。真是外行看热闹,内行看门道,这是程序员都能Get的笑点,说明程序没有正确从数据库获取到我的姓名,然后把空值格式化为了null。

    2022年6月14日
    17
  • 浙江新增python编程_9月起,浙江省八年级新增Python编程课,未来编程是处理大数据的手段…「建议收藏」

    浙江新增python编程_9月起,浙江省八年级新增Python编程课,未来编程是处理大数据的手段…「建议收藏」原标题:9月起,浙江省八年级新增Python编程课,未来编程是处理大数据的手段最近一个非常火爆的话题在家长群引起热议——浙江省中小学学习编程。浙江官方教育部宣布:今年9月份开始的新学期,三到九年级信息技术课将替换新教材。其中,八年级将新增Python课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法等内容按照教材规划五六年级开始接触。下面我们来具体看一…

    2022年5月13日
    49
  • Druid连接池的意义以及使用

    Druid连接池的意义以及使用建立数据库连接耗时耗费资源,一个数据库服务器能够同时建立的连接数也是有限的,在大型的Web应用中,可能同时会有成百上千的访问数据库的请求,如果Web应用程序为每一个客户请求分配一个数据库连接,将导致性能的急剧下降。数据库连接池的意义在于,能够重复利用数据库连接(有点类似线程池的部分意义),提高对请求的响应时间和服务器的性能。连接池中提前预先建立了多个数据库连接对象,然后将连接对象保存到连接池中…

    2022年7月23日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号