lint 命令

用途

检查 C 和 C++ 编程语言以查找潜在的问题。

语法

林特 [ - ] [ -b ] [ -c ] [ -C ] [ - ] [ -我 ] [ -n ] [ -o ] [ -qDBCS ] [ -p ] [ -t ] [ ] [ - ] [ -w [ ... ] ] [ -x ] [ -MA ] [ -恩德数字 ] [ -恩尔数字 ] [ -恩数字 ] [ -恩特数字 ] [ -我目录 ] [ -D名称 [=定义 ] ] [ -U名称 ] 文件 ...

描述

lint 命令查找 C 和 C++ 语言的源代码的编码错误、语法错误以及效率低或不可移植的代码。 可以使用此程序:

  • 识别源代码和库不兼容。
  • 强制实施类型检查规则比编译器更严格。
  • 识别变量的潜在问题。
  • 确定函数的潜在问题。
  • 识别流控制问题。
  • 识别可能产生错误或效率低下的法律构造。
  • 标识未使用的变量和函数声明。
  • 识别可能不可移植的代码。

    注:使用 lint 命令检查 C++ 语言文件需要有 C Set++ 编译器的软件包。

检查函数的文件内使用,以查找在一些实例中返回值,而在其他实例中不返回值的函数、调用时参数数量和类型会变化的函数以及其值没有被使用,或其值被使用了,但没有返回值的函数。

lint 命令按如下解释文件扩展名:

  • .c 结尾的 文件名 是 C 语言源文件。
  • .C 结尾的 文件 名称是 C++ 语言源文件。
  • .ln结尾文件名lint命令在使用-c -o标志时产生的非 ASCII 文件。

lint 命令会警告其他后缀的文件并忽略它们。

lint 命令获取所有的由 -l 标志指定的 .c.C 以及 .ln 文件和库,并以它们在命令行上出现的顺序处理。 缺省情况下,将标准 llib-lc.ln lint 库添加到文件列表的结尾部分。 然而,当选择了 -p 标志的时候,lint 命令使用 llib-port.ln 可移植库。 缺省情况下,lint 的第二遍检查此列表中的文件的相互兼容性;然而,如果指定了 -c 标志,那么会忽略 .ln llib-lx.ln 文件。

-c -o 标志允许对 C 和 C++ 语言源文件集中增量使用 lint 命令。 通常对每个源文件使用一次带有 -c 标志的 lint 命令。 每次运行都会生成一个对应于 .c 文件的 .ln 文件,并 写出关于该源文件的所有信息。 当对所有文件单独使用了 lint 命令后,再不带 -c 标 志运行一次,使用需要的 -l 标志列示所有的 .ln 文件。 这会写出所有的文件内部的不一致。 此过程与 make 命令工作得很 好,允许其仅对那些自从上次检查过该源文件集合后又修改过的源文件运行 lint 命令。

lint LINT 预处理器符号定义是为允许 lint 命令修改或删除某些可能有问题的代码而定义的。 因此,lintLINT 符号应该被看作为 计划被 lint 检查的所有代码的一个保留字符。

以下 C 和 C++ 语言源程序中的注释改变了 lint 命令在检查源程序的时候的操作方式:

描述
/*NOTREACHED*/ 禁止关于无法访问代码的注释。
/*VARARGS编号*/ 禁止检查以下旧样式函数声明中的可变数量的参数,但是 仍检查第一个 Number 参数的数据类型。 如果没有为 Number 包含一个值,那么 lint 命令不会检查 参数(Number=0)。 ANSI 函数原型应该使用省略号来表示 未指定的参数以取代此注释机制。
/*ARGSUSED*/ 禁止关于函数参数在函数定义中未使用的警告。
/*LINTLIBRARY*/ 如果将此注释放置在文件的开头,那么 lint 命令不会识别此文件中的不使用的函数和函数参数。 这在对库运行 lint 命令的时候使用。
/*NOTUSED*/ 在文件中,从它出现的地方开始禁止关于不使用的外部符号、函数和函数参数的警告。 这是 /*LINTLIBRARY*/ 注释伪指令的超集,但是也应用于外部符号。 它对于禁止关于不使用的函数原型和其他的外部对象声明的警告是有用的。
/*NOTDEFINED*/ 在文件中,从它出现的地方开始禁止关于被使用了但是未经定义的外部符号和函数的警告。
/*LINTSTDLIB*/ 通过使得函数原型声明看起来像函数声明来允许从头文件生成标准原型检查库。 该伪指令暗中激活 /*NOTUSED*//*LINTLIBRARY*/ 注释伪指令,以 减少警告噪声级别。

lint 命令警告信息给出了 文件名和行号。 在每个文件经受第一遍检查的时候报告了每个文件和每个行号的警告信息。

如果没有指定 -c 标志,lint 命令会收集从所有输入文件中收集到的信息,然后检查其一致性。 在这一点,如果不清楚某条信息是起源于给定的源文件还是起源于它的一个包含文件,那么,lint 命令会在显示的源文件名后跟上一个问号。

包含了许多标准头文件的 ANSI 程序可能希望设置 -wD 标志 以减少关于原型未使用的警告的数量,并设置 -n 标志 以禁用 ANSI 标准库进行检查。 对于非 ANSI 的程序,建议 指定 -wk 标志来减少 关于函数原型不存在的警告数量。

标志

描述
-a 禁止关于将长值赋值给不够长的变量的信息。
-b 禁止关于无法访问 break 语句的信息。
-c 促使 lint 命令在命令行上为每个 .c 文件生成 .ln 文件。 这些.ln 文件仅仅是 lint 命令第一遍的产品,不会检查其内部函数的兼容性。
-C 指定使用 C++ 库(在 /usr/lpp//xlC/lib 目录中)。
-h 不尝试检测错误、不正确的风格或减少浪费。
-l密钥 包含额外的 llib-l Key.ln lint 库。 可以通过在命令行上指定 -lm 来 包含 llib-lm.ln 数学库的 lint 版本,或者在命令行上指定 -ldos 标志 来包含 llib-ldos.ln 库。 当检查作为有大量文件的项目中的部分文件时,使用该标志来包含本地 lint 库。 该标志并不禁止 lint 命令使用 llib-lc.ln 库。 lint 库必须位于 /usr/ccs/lib 目录中。
-n 禁止使用或者标准或者可移植 lint 库来检查兼容性。 这同时适用于 ANSI 和扩展方式库。
-o 促使 lint 命令创建 llib-lLibrary.ln lint 库。 -c 标志使任何 -o 标志使用无效。 生成的 lint 库是第二遍 lint 命令的输入。 -o 标志仅导致此文件存储在指定的 lint 库中。 为了生成不带有外部消息的 llib-lLibrary.ln,使用 -x 标志。 如果 lint 库的源文件只是外部接口(例如,写入 llib-lc 文件的方式),那么 -v 标志是有用的。 通过使用 lint 命令注释行,这些标志设置也是可用的。
-p 检查对其他 C 语言方言的可移植性。
-t 当从 32 位移植到 64 位的时候,检查有问题的赋值。 仅检查下列情况:
  • 标出所有的 shift / mask 操作,因为有些在 32 位下工作正常的操作在 64 位下可能会导致问题。
  • 对以下类型的赋值给出警告。
    int = long
    int = ptr
-U 禁止关于未经定义而使用或定义但未使用的函数和外部变量的消息。 使用该标志对一个较大的程序的文件子集运行 lint 命令。
-v 禁止函数参数未使用的信息。
-w [类 ...] 控制警告类的报告。 缺省情况下,所有的警告类是活动的,但是可以通过包括适当的选项作为 Class 参数的一部分来逐个取消激活。 单独选项列示为:
a
非 ANSI 特征。
c
与无符号值比较。
声明一致性。
h
探索性方法申诉。
k
用于 K+R 类型的源代码。
L
将长值赋值给不够长的变量。
n
无效代码。
o
未知的求值顺序。
p
涉及不同的可移植性。
R
返回语句一致性。
存储容量检查。
u
变量和函数的正确使用。
a
取消激活所有的警告。
C
有条件出现的常量。
外部声明未使用。
O
将被废弃的特征。
函数原型存在。
R
检测到无法访问的代码。
-x 禁止关于有外部声明,但是从未使用的变量的消息。
-ma 强制执行 ANSI C 语言标准规则。 缺省方式为扩展 C 方式。 NSI 方式预先设置标准 ANSI 库函数原型来代替缺省 C 扩展方式 lint 库。 ANSI 方式强制执行了更严格的内部文件对象参考并提供了定义链接检查。
-Nd数字 将表的维大小更改为 NumberNumber 的缺省值为 2000。
-Nl编号 将类型节点的数量更改为 NumberNumber 的缺省值为 8000。
-Nn数字 将符号表的大小增加为 NumberNumber 的缺省值为 1500。
-Nt编号 将树节点的数量更改为 NumberNumber 的缺省值为 1000。

另外,lint 命令 识别了 cpp 命令(宏预处理器)的以下标志:

描述
-I目录 Directory 添加到 lint 命令会在其中搜索 #include 文件的目录列表中。
-D名称[=定义] 定义 名称,就像通过 #define 文件一样。 Definition 的缺省值为 1。
-qDBCS 设置由当前语言环境指定的多字节方式。
-U名称 删除任何 Name 的初始化定义,其中 Name 是一个保留符号,由特定的预处理器预先定义。

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 成功完成。
> 0 发生错误。

示例

  1. 要检查 C 程序是否有错误,请输入:
    lint command.c
  2. 要禁止某些消息,请输入:
    lint -v -x program.c
    此检查program.c,但不显示有关未使用的函数参数 (-v) 或未使用的外部值 (-x) 的错误消息。
  3. 要针对其他 lint 库检查程序,请输入:
    lint -lsubs program.c
    此检查program.c针对 /usr/ccs/lib/llib-lc.ln 标准 lint 库和 /usr/lib/llib-lsubs.ln lint 库。
  4. 要检查可移植库和其他库,请输入:
    lint -lsubs -p program.c
    此检查program.c针对 /usr/ccs/lib/llib-port.ln 可移植 lint 库和 /usr/lib/llib-lsubs.ln lint 库。
  5. 要仅针对非标准库进行检查,请输入:
    lint -lsubs -n program.c
    此检查program.c仅针对 /usr/lib/llib-lsubs.ln

文件

描述
/usr/lib/lint[12} 程序
/usr/ccs/lib/llib-lansi 标准 ANSI 函数(源)的声明
/usr/ccs/lib/llib-lansi.ln 标准 ANSI 函数(二进制格式)的声明
/usr/ccs/lib/llib-lc 标准函数(源)的声明
/usr/ccs/lib/llib-lc.ln 标准函数(二进制格式)的声明
/usr/ccs/lib/llib-lcrses curses 函数(源)的声明
/usr/ccs/lib/llib-lcrses.ln curses 函数(二进制格式)的声明
/usr/ccs/lib/llib-lm 标准 math 函数(源)的声明
/usr/ccs/lib/llib-lm.ln 标准 math 函数(二进制格式)的声明
/usr/ccs/lib/llib-port 可移植函数(源)的声明
/usr/ccs/lib/llib-port.ln 可移植函数(二进制格式)的声明
/usr/lpp//xlC/lib 包含了 C++ 库的目录
/var/tmp/*lint* 临时文件