linux下代码走查工具介绍---splint

2024-04-20 18:38

本文主要是介绍linux下代码走查工具介绍---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的系统头文件中某些扩展宏、数据结构、函数声明,可以自己编写与之同名的头文件。这个很容易的:不需要修改工程中任何文件,并且一般写两三个很短的头文件就行了。


转载的文章,暂时 还未测试

这篇关于linux下代码走查工具介绍---splint的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921029

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软