lint详解

12 月 13, 2024

Linting 代码的本意就是找出程序中的错误,这些错误包括潜在的语法错误,编译错误,拼写错误等。

简单来说就是使用工具来对代码提供一些检查,保证提交代码的质量。

lint(剥棉绒,语言分析)是最著名的C语言工具之一,是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析,一般由UNIX系统提供。

在一些项目中也提供了这个工具来对代码质量进行控制。

2021-05-16_9-50-17

Lint 这个单词的本意就是衣服上的棉球,通过 Linting 这个单词的意思就是去除代码中可能存在问题的意思。 

工具介绍

与大多数C语言编译器相比,lint可以对程序进行更加广泛的错误分析,是一种更加严密的编译工具。最初,lint这个工具用来扫描C源文件并对源程序中不可移植的代码提出警告。但是现在大多数lint实用程序已经变得更加严密,它不但可以检查出可移植性问题,而且可以检查出那些虽然可移植并且完全合乎语法但却很可能是错误的特性。

随着历史的推移,Lint后来形成了一系列的工具,包括PC-Lint/FlexeLint(Gimpel),LintPlus(Cleanscape)以及Splint。

基本功能

lint检查C程序中潜在的错误,包括(但不限于)可疑的类型组合、未使用的变量、不可达的代码以及不可移植的代码。lint会产生一系列程序员有必要从头到尾仔细阅读的诊断信息。

使用lint的好处是:

1.它可以检查出被编译器漏掉的错误;

2.可以关联很多文件进行错误的检查和代码分析,具有较强大灵活性.

lint可以检查的错误类型大体如下:

  • 可能的空指针
  • 在释放内存后使用了指向该内存的指针
  • 赋值次序问题
  • 拼写错误
  • 被0除
  • 失败的case语句(遗漏了break语句)
  • 不可移植的代码(依赖了特定的机器实现)
  • 宏参数没有使用圆括号
  • 符号的丢失
  • 异常的表达式
  • 变量没有初始化
  • 可疑的判断语句(例如,if(x=0))
  • printf/scanf的格式检查

系统版本

UNIX系统 在UNIX系统中,可自动获得lint,它是一个标准的UNIX工具。

Linux系统 在Linux各种发行版中,使用lint的版本是GNU下的Splint(前身是LClint)

Windows 在Windows系统中,从第三方获得的lint工具的名称是PC lint以及Splint

PC-lint

简介

PC-Lint是GIMPEL SOFTWARE公司开发的C/C++软件代码静态分析工具,是一个历史悠久(30年之久)且功能异常强大的静态代码检测工具,它的全称是PC-Lint/FlexeLint for C/C++。PC-Lint能够在Windows、MS-DOSOS/2平台上使用,以二进制可执行文件的形式发布,而FlexeLint运行于其它平台,以源代码的形式发布。PC-lint在全球拥有广泛的客户群,许多大型的软件开发组织(比如Miscrosoft )都把PC-Lint检查作为代码走查的第一道工序。对小公司和个人开发者而言,PC-Lint也非常的重要。小公司往往受到开发成本的考虑,不能对代码进行全面的测试。此时利用PC-Lint的强劲的功能可以很好的提高代码的质量。

C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,

但相应也使得代码编写具有很大的随意性,另外C/C++编译器不进行强制类型检查,也不做任何边界检查,这就增加了代码中存在隐患的可能性。如果能够在代码提交测试之前发现这些潜在的错误,就能够极大地减轻测试人员的压力,减少软件项目的除错成本,可是传统的C/C++编译器对此已经无能为力,这个任务只能由专用的代码检查工具完成。而PC-Lint就是这样的代码检查工具。PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。在代码走读和单元测试之前使用PC-Lint可以提前发现程序中的隐藏错误,提高代码质量,节省测试时间;并提供编码规则检查,规范软件开发人员的编码行为。

作用

PC-Lint的作用广泛,单单控制选项就300多个,涉及程序编译及语法使用中大方方面面。具体如下

  1. PC-Lint是一种静态代码检测工具,是一种更加严格的编译器,不仅可以检查出一般的语法错误,还可以检查出虽然完全符合要求,但是却可能存在潜在的,不易发现的错误
  2. PC-lint不仅可以检测单个文件,也可以从整个项目的角度来检测问题,因为C语言编译器固有的单个编译,这些问题在编译器环境下很难被检测,而PC-Lint在检查当前文件的同时还会检查所有与之相关的文件,可想而知,它会对我们有很大的帮助。
  3. PC-lint支持几乎所有流行的编辑环境和编译器,比如BorlandC++从1.x到5.x各个版本、Borland C++ Build、GCC、VC、watcom C/C++、Source insight、intel C/C++等等,也支持16/32/64的平台环境。支持Scott Meyes的名著(Effective C++/More Effective C++)中说描述的各种提高效率和防止错误的方法。

更多关于PC-Lint的介绍参考可以参考的词条.

告警消息分类

错误说明CC++告警级别
1-1991001-11991
语法错误200-2990
致命错误300-3990
告警400-6991400-16992
消息700-8001700-18993
可选信息900-9991900-19994

代码检查告警级别

w0 不产生信息(除了遇到致命的错误)

w1 只生成错误信息– 没有告警信息和其它提示信息

w2 只有错误和告警信息

w3 生成错误、告警和其它提示信息(这是默认设置)

w4 生成所有信息

函数库头文件的告警级别

wlib(0) 不生成任何库信息

wlib(1) 只生成错误信息(当处理库的源代码时)

wlib(2) 生成错误和告警信息

wlib(3) 生成错误、告警和其它信息(这是默认设置)

wlib(4) 产生所有信息

一般代码检查功能

PC Lint能检查出代码的语法错误和可能引起程序异常执行的逻辑告警。但它更侧重于后者的检查,因为这类问题更容易被人忽略(前者通过平台编译器去发现)。所以它的代码检查功能通常表现在下面几方面:

强类型检查:强类型检查选项“-strong”和它的辅助(补充)选项“-index”可以对typedef定义的数据类型进行强类型检查,以保证只有相同类型之间的变量才能互相赋值

变量值跟踪:包括对变量值初始化,变量值,函数内变量这些情况进行跟踪,发现其中不符合语法规范的告警

赋值顺序检查:检查当一个表达式的值依赖于赋值的顺序时,是否会出问题

弱定义检查:检查当宏定义、typedef名字、声明、结构、联合和枚举类型这些东西可能在模块中被过多定义且不被使用的情况。

格式检查:检查printf和scanf(及其家族)中的格式冲突告警

缩进检查:检查代码中的缩进问题是为避免出现代码结构不良或者大括号的遗漏等问题

const变量检查

volatile变量检查

发表回复

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