zoukankan      html  css  js  c++  java
  • Splint介绍

    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标志的用法:

          splint -showcol a.c //在检测a.c时,告警消息中列数不被打印
    splint -varuse a.c //在检测a.c时,告警消息中未使用变量告警不被打印

    •.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的系统头文件中某些扩展宏、数据结构、函数声明,可以自己编写与之同名的头文件。这个很容易的:不需要修改工程中任何文件,并且一般写两三个很短的头文件就行了。
     
  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/qingxia/p/2683535.html
Copyright © 2011-2022 走看看