JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

4.  lint 源代码检验器

4.1 基本和增强 lint 模式

4.2 使用 lint

4.3 lint 命令行选项

4.3.1 -#

4.3.2 -###

4.3.3 -a

4.3.4 -b

4.3.5 -C filename

4.3.6 -c

4.3.7 -dirout=dir

4.3.8 -err=warn

4.3.9 -errchk=l(, l)

4.3.10 -errfmt=f

4.3.11 -errhdr=h

4.3.12 -erroff=tag(, tag)

4.3.13 -errsecurity=level

4.3.14 -errtags=a

4.3.15 -errwarn=t

4.3.16 -F

4.3.17 -fd

4.3.18 -flagsrc=file

4.3.19 -h

4.3.20 -Idir

4.3.21 -k

4.3.22 -Ldir

4.3.23 -lx

4.3.24 -m

4.3.25 -m32|-m64

4.3.26 -Ncheck=c

4.3.27 -Nlevel=n

4.3.27.1 -Nlevel=1

4.3.27.2 -Nlevel=2

4.3.27.3 -Nlevel=3

4.3.27.4 -Nlevel=4

4.3.28 -n

4.3.29 -ox

4.3.30 -p

4.3.31 -Rfile

4.3.32 -s

4.3.33 -u

4.3.34 -V

4.3.35 -v

4.3.36 -Wfile

4.3.37 -XCC=a

4.3.38 -Xalias_level[=l ]

4.3.39 -Xarch=amd64

4.3.40 -Xarch=v9

4.3.41 -Xc99[= o]

4.3.42 -Xkeeptmp=a

4.3.43 -Xtemp=dir

4.3.44 -Xtime=a

4.3.45 -Xtransition=a

4.3.46 -Xustr={ascii_utf16_ushort| no}

4.3.47 -x

4.3.48 -y

4.4 lint 消息

4.4.1 用于禁止消息的选项

4.4.2 lint 消息格式

4.5 lint 指令

4.5.1 预定义值

4.5.2 指令

4.6 lint 参考和示例

4.6.1 由 lint 执行的诊断

4.6.1.1 一致性检查

4.6.1.2 可移植性检查

4.6.1.3 可疑的构造

4.6.2 lint

4.6.3 lint 过滤器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO C 之间的差异

索引

4.3 lint 命令行选项

lint 程序是一个静态分析器。它不能求出它检测到的依赖性的运行时结果。例如,某些程序可能包含数百个执行不到的 break 语句,这些语句并不重要,但是 lint 仍然会标记它们。例如,可以在源文本中使用 lint 命令行选项和嵌入为注释的特殊指令,如下所示:

下面按字母顺序列出了 lint 选项,其中有几个 lint 选项与禁止 lint 诊断消息有关。在这些按字母顺序说明的选项之后有一个表 4-8,其中也列出了这些选项,并且列出了这些选项禁止的特定消息。用于调用增强 lint 的选项以 -N 开头。

lint 能够识别许多 cc 命令行选项,其中包括 -A-D-E-g-H-O-P-U-Xa-Xc-Xs-Xt-Y,尽管 -g-O 会被忽略。未识别的选项被警告并忽略。

4.3.1 -#

启用详细模式,显示每个组件,就像其被调用一样。

4.3.2 -###

显示调用但实际上并不执行的每个组件。

4.3.3 -a

抑制某些消息。请参阅表 4-8

4.3.4 -b

抑制某些消息。请参阅表 4-8

4.3.5 -C filename

使用指定的文件名创建一个 .ln 文件。这些 .ln 文件仅是 lint 的第一遍检查产生的文件。filename 可以是完整路径名。

4.3.6 -c

为命令行上的每个名为 .c 的文件创建一个 .ln 文件,该文件包含与 lint 的第二遍检查相关的信息。不执行第二遍检查。

4.3.7 -dirout=dir

指定目录 dir,其中存放 lint 输出文件(.ln 文件)。此选项会影响 -c 选项。

4.3.8 -err=warn

-err=warn用于 -errwarn=%all 的宏。请参见4.3.15 -errwarn=t

4.3.9 -errchk=l(, l)

执行l 指定的附加检查。缺省值为 -errchk=%none。指定 -errchk 与指定 -errchk=%all 等效。l 是一个以逗号分隔的检查列表,由下表中的一个或多个标志组成,例如 -errchk=longptr64,structarg

表 4-1 -errchk 标志

含义
%all
执行 -errchk 的所有检查。
%none
不执行 -errchk 的任何检查。这是缺省值。
[no%]locfmtchk
lint 的第一遍检查期间检查类似 printf 的格式字符串。无论是否使用 -errchk=locfmtchklint 都会在第二遍检查期间检查类似 printf 的格式字符串。
[no%]longptr64
检查是否可移植到其 long 整型和指针大小为 64 位、平整型大小为 32 位的环境。即使使用了显式强制类型转换,也检查指针表达式和 long 整型表达式是否赋值为平整型。
[no%]structarg
检查通过值传递的结构参数,并在形式参数类型未知时报告情况。
[no%]parentheses
检查代码中优先级的透明度。使用此选项可增强代码的可维护性。如果 -errchk=parentheses 返回一个警告,请考虑使用额外的括号明确地表示代码中操作的优先级。
[no%]signext
检查如下情况:标准 ISO C 值保留规则允许在无符号整型的表达式中进行带符号整型值的符号扩展。仅当同时指定 -errchk=longptr64 时,该选项才会产生错误消息。
[no%]sizematch
检查较长整数到较短整数的赋值并发出警告。对于具有不同符号的相同长度的整数之间的赋值(unsigned int 获取 signed int),也会发出这些警告。

4.3.10 -errfmt=f

指定 lint 输出的格式。f 可以是下列值之一:macrosimplesrctab

表 4-2 -errfmt 标志

含义
macro
显示错误的源代码、行号和位置,并展开宏。
simple
对于一行(简单)诊断消息,在括号中显示错误的行号和位置号。类似于 -s 选项,但是包含错误的位置信息。
src
显示错误的源代码、行号和位置(不展开宏)。
tab
以制表格式显示。这是缺省值。

缺省值为 -errfmt=tab。指定 -errfmt 与指定 -errfmt=tab 等效。

如果指定了多种格式,则使用最后指定的格式,并且 lint 发出有关未使用格式的警告。

4.3.11 -errhdr=h

在同时指定了 -Ncheck 的情况下,允许 lint 报告某些头文件消息。h 是一个以逗号分隔的列表,它包含以下项中的一项或多项:dirno%dir%all%none%user

表 4-3 -errhdr 标志

含义
dir
报告目录 dir 中包含的头文件的 -Ncheck 消息。
no%dir
不报告目录 dir 中包含的头文件的 -Ncheck 消息。
%all
检查使用的所有头文件。
%none
不检查头文件。这是缺省值。
%user
检查所有已使用的用户头文件,即,除 /usr/include 及其子目录中的头文件以及由编译器提供的头文件之外的所有头文件。

缺省值为 -errhdr=%none。指定 -errhdr 与指定 -errhdr=%user 等效。

示例:

% lint -errhdr=inc1 -errhdr=../inc2

检查目录 inc1../inc2 中已使用的头文件。

% lint -errhdr=%all,no%../inc

检查除目录 ../inc 中的头文件之外的所有已使用的头文件。

4.3.12 -erroff=tag(, tag)

抑制或启用 lint 错误 消息。

t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tagno% tag%all%none

表 4-4 -erroff 标志

含义
tag
禁止由该 tag 指定的消息。可通过 -errtags=yes 选项来显示消息的标记。
no%tag
启用由该 tag 指定的消息。
%all
禁止所有消息。
%none
启用所有消息。这是缺省值。

缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。

示例:

% lint -erroff=%all,no%E_ENUM_NEVER_DEF,no%E_STATIC_UNUSED

仅输出消息 "enum never defined" 和 "static unused",并禁止其他消息。

% lint -erroff=E_ENUM_NEVER_DEF,E_STATIC_UNUSED

仅禁止消息 "enum never defined" 和 "static unused"。

4.3.13 -errsecurity=level

可使用 -errsecurity 选项检查代码中的安全漏洞。

level 必须为下表中显示的值之一。

表 4-5 -errsecurity 标志

level
含义
core
此级别检查的源代码构造几乎始终是不安全或难以验证的。此级别的检查包括:
  • 将可变格式字符串与 printf()scanf() 系列函数一起使用

  • scanf() 函数中使用无限制字符串 (%s) 格式

  • 使用无安全用法的函数:gets()cftime()ascftime()creat()

  • 错误地使用 open()O_CREAT

    将在此级别生成警告的源代码视为错误。应更改有问题的源代码。在所有情况下,都应采用更安全简单的代码。

standard
此级别检查包括 core 级别的所有检查,以及可能安全、但有更好的可用替代代码的构造的检查。检查新近编写的代码时建议采用此级别检查。此级别的其他检查包括:
  • 使用除 strlcpy() 之外的字符串复制函数

  • 使用弱随机数函数

  • 使用不安全的函数生成临时文件

  • 使用 fopen() 创建文件

  • 使用调用 shell 的函数

    使用新的或经过大幅修改的代码替换在此级别生成警告的源代码。应权衡消除传统代码中的这些警告对应用程序造成的不稳定风险。

extended
此级别检查包含几乎所有检查,包括 core 级别和 standard 级别的所有检查。此外,还会生成许多有关在某些情况下可能不安全的构造的警告。此级别的检查可用作检查代码的辅助措施,但无需将这些检查用作判断源代码是否可接受的标准检查。此级别的其他检查包括:
  • 在循环中调用 getc()fgetc()

  • 使用易于产生路径名争用情况的函数

  • 使用 exec() 函数系列

  • stat() 和其他函数之间的争用情况

    检查在此级别生成警告的源代码,确定是否存在潜在安全问题。

%none
禁用 -errsecurity 检查

如果未指定 -errsecurity 的设置,lint 会将它设置为 -errsecurity=%none。如果在指定 -errsecurity 时未指定参数,lint 会将它设置为 -errsecurity=standard

4.3.14 -errtags=a

显示每个错误消息的消息标志。a 可以是 yesno。缺省值为 -errtags=no。指定 -errtags 与指定 -errtags=yes 等效。

可与所有 -errfmt 选项一起使用。

4.3.15 -errwarn=t

如果发出了指定的警告消息,lint 会以失败状态退出。t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tagno% tag%all%none。标记的顺序很重要。例如,如果发出了除 tag 以外的任何警告,%all,no%tag 会导致 lint 以致命状态退出。下表列出了 -errwarn 值。

表 4-6 -errwarn 标志

tag
含义
tag
如果此 tag 指定的消息作为警告消息发出,将导致 lint 以致命状态退出。如果未出现 tag,则没有影响。
no%tag
如果 tag 指定的消息仅作为警告消息发出,将防止 lint 以致命状态退出。如果未出现 tag,则没有影响。为了避免在发出警告消息时导致 lint 以致命状态退出,可使用该选项来还原以前用该选项和 tag%all 指定的警告消息。
%all
如果发出了任何警告消息,将导致 lint 以致命状态退出。%all 可以后跟 no%tag,以避免该行为的特定警告消息。
%none
如果发出了任何警告消息,将防止任何警告消息导致 lint 以致命状态退出。

缺省值为 -errwarn=%none。单独指定 -errwarn-errwarn=%all 等效。

4.3.16 -F

引用命令行上命名的 .c 文件时,会输出命令行上提供的路径名而不仅仅是它们的基名。

4.3.17 -fd

报告有关旧样式函数的定义或声明情况。

4.3.18 -flagsrc=file

使用文件 file 中包含的选项执行 lint。可在 file 中指定多个选项(每行一个)。

4.3.19 -h

抑制某些消息。请参阅表 4-8

4.3.20 -Idir

目录 dir 中搜索包含的头文件。

4.3.21 -k

改变 /* LINTED [message] */ 指令或 NOTE(LINTED(message)) 注释的行为。通常,lint 会针对这些指令后面的代码禁止警告消息。如果不设置该选项,lint 不禁止消息,而是输出包含指令或注释内部的注释的附加消息。

4.3.22 -Ldir

-l 一起使用时,在目录 dir 中搜索 lint 库。

4.3.23 -lx

访问 lint llib-lx.ln

4.3.24 -m

抑制某些消息。请参阅表 4-8

4.3.25 -m32|-m64

指定所分析程序的内存模型。还搜索与所选的内存模型(32 位或 64 位)相对应的 lint 库。

使用 -m32 可验证 32 位 C 程序;使用 -m64 可验证 64 位程序。

在所有 Oracle Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、pointer 数据类型)是缺省值。在支持 64 位的 Linux 平台上缺省为 LP64 内存模型(64 位 long 和 pointer 数据类型)。-m64 仅允许在支持 LP64 模型的平台上使用。

请注意,在以前的编译器发行版中,内存模型 ILP32 或 LP64 是通过选择 -Xarch 选项来隐式指定的。从 Oracle Solaris Studio 12 编译器开始,就不再是此行为了。在大多数平台上,只需在命令行上添加 -m64,就可以通过 lint 调用 64 位程序。

4.3.26 -Ncheck=c

检查头文件中的相应声明,并检查宏。c 是一个以逗号分隔的检查列表,它包含以下项中的一项或多项:macroextern%all%noneno%macrono%extern

表 4-7 -Ncheck 标志

含义
macro
检查文件之间的宏定义的一致性。
extern
检查源文件与关联的头文件(例如,file1.cfile1.h)之间声明的一一对应关系。确保头文件中既无多余的 extern 声明,也不缺少 extern 声明。
%all
执行 -Ncheck 的所有检查。
%none
不执行 -Ncheck 的任何检查。这是缺省值。
no%macro
不执行 -Ncheck 的任何 macro 检查。
no%extern
不执行 -Ncheck 的任何 extern 检查。

缺省值为 -Ncheck=%none。指定 -Ncheck 与指定 -Ncheck=%all 等效。

值可能使用逗号组合在一起,例如 -Ncheck=extern,macro

以下示例执行除宏检查之外的所有检查。

% lint -Ncheck=%all,no%macro

4.3.27 -Nlevel=n

通过指定用于报告问题的增强 lint 分析级别,启用增强 lint 模式。此选项用于控制检测到的错误量。级别越高,检验时间越长。n 是一个数字: 1234。没有缺省值。如果未指定 -Nlevellint 会使用其基本分析模式。如果指定不带任何参数的 -Nlevellint 会设置 -Nlevel=4

有关基本和增强 lint 模式的说明,请参见4.2 使用 lint

4.3.27.1 -Nlevel=1

分析单个过程。报告发生在某些程序执行路径上的无条件错误。不执行全局数据和控制流分析。

4.3.27.2 -Nlevel=2

分析整个程序,包括全局数据和控制流。报告发生在某些程序执行路径上的无条件错误。

4.3.27.3 -Nlevel=3

分析整个程序,包括常量传播(常量用作实际参数时的情况)以及在 -Nlevel=2 下执行的分析。

在此分析级别检验 C 程序所用的时间比前一级别长 2 到 4 倍。需要额外的时间是因为 lint 通过为程序变量创建可能值的集合对程序进行部分解释。这些变量集合是以常量以及包含程序中的常量操作数的条件语句为基础创建的。这些集合形成创建其他集合的基础(一种常量传播形式)。

作为分析结果接收的集合根据以下算法来评估正确性:

4.3.27.4 -Nlevel=4

分析整个程序,并报告使用某些程序执行路径时会发生的条件错误,以及在 -Nlevel=3 下执行的分析。

在此分析级别上,存在更多诊断消息。分析算法通常对应于 -Nlevel=3 的分析算法,所不同的是任何无效值现在会生成一条错误消息。在此级别上进行分析所需的时间增大两个数量级(大约慢 20 到 100 倍)。在此情况下,需要的多余时间与以递归、条件语句等类似内容为特征的程序复杂性直接成比例。因此,对于超过 100,000 行的程序,可能难于使用此级别的分析。

4.3.28 -n

抑制检查与缺省 lint 标准 C 库的兼容性。

4.3.29 -ox

导致 lint 创建一个名为 llib-lx.lnlint 库。该库是从 lint 在其第二遍检查中使用的所有 .ln 文件创建的。-c 选项会使 -o 选项的任何使用无效。要生成 llib-lx.ln 而不产生任何无关消息,可以使用 -x 选项。如果 lint 库的源文件仅为外部接口,则 -v 选项会很有用。如果使用 -lx 调用 lint,则生成的 lint 库可以在以后使用。

缺省情况下,使用 lint 的基本格式创建库。如果使用 lint 的增强模式,则创建的库将为增强格式,并且只能在增强模式下使用。

4.3.30 -p

启用某些与可移植性问题相关的消息。

4.3.31 -Rfile

.ln 文件写入 file,以供 cxref(1) 使用。如果此选项打开,此选项将禁用增强模式。

4.3.32 -s

生成具有 "warning:" 或 "error:" 前缀的简单诊断。缺省情况下,lint 会缓冲某些消息以生成复合输出。

4.3.33 -u

抑制某些消息。请参阅表 4-8。此选项适用于对较大程序的文件子集运行 lint

4.3.34 -V

将产品名称及发行版写入标准错误中。

4.3.35 -v

抑制某些消息。请参阅表 4-8

4.3.36 -Wfile

.ln 文件写入 file,以供 cxref(1) 使用。如果此选项打开,此选项将禁用增强模式。

4.3.37 -XCC=a

接受 C++ 样式的注释。特别是,可使用 // 指示注释的开始。a 可以是 yesno。缺省值为 -XCC=no。指定 -XCC 与指定 -XCC=yes 等效。


注 - 仅当使用 -xc99=none 时,才需使用此选项。使用 -xc99=all(缺省值)时,lint 接受由 // 指示的注释。


4.3.38 -Xalias_level[=l ]

使用此选项时,l下列值之一:anybasicweaklayoutstrictstdstrong。有关不同的歧义消除级别的详细说明,请参见表 B-13

如果未指定 -Xalias_level,则标志的缺省值为 -Xalias_level=layout,这意味着将不会执行任何基于类型的别名分析。如果指定了 -Xalias_level,但未提供级别,则缺省值为 -Xalias_level=layout

请确保运行 lint 时所在的歧义消除级别不如运行编译器时所在的级别严格。如果运行 lint 时所在的歧义消除级别比编译时所在的级别更严格,结果将很难解释并且可能令人误解。

有关歧义消除的详细说明以及有助于歧义消除的 pragma 的列表,请参见4.6.3 lint 过滤器

4.3.39 -Xarch=amd64

(Solaris 操作系统)已过时。不要使用。请参见4.3.25 -m32|-m64

4.3.40 -Xarch=v9

(Solaris 操作系统)已过时。不要使用。请参见4.3.25 -m32|-m64

4.3.41 -Xc99[= o]

-Xc99 标志控制编译器对 C99 标准(ISO/IEC 9899:1999,编程语言-C)中已实现功能的识别。

o 可以是下列值之一: allnone

-Xc99=none 会禁用对 C99 功能的识别。-Xc99=all 会启用对支持的 C99 功能的识别。

指定不带任何参数的 -Xc99 与指定 -Xc99=all 等效。


注 - 虽然编译器的支持级别缺省为表 C-6 中列出的 C99 功能,但 Oracle Solaris 软件在 /usr/include 中提供的标准头文件仍不符合 1999 ISO/IEC C 标准。如果遇到错误消息,请尝试使用 -Xc99=none 获取这些头文件的 1990 ISO/IEC C 标准行为。


4.3.42 -Xkeeptmp=a

保留执行 lint 期间创建的临时文件,而非自动删除它们。a 可以是 yesno。缺省值为 -Xkeeptmp=no。指定 -Xkeeptmp 与指定 -Xkeeptmp=yes 等效。

4.3.43 -Xtemp=dir

将临时文件的目录设置为 dir。如果没有此选项,临时文件将放在 /tmp 中。

4.3.44 -Xtime=a

报告执行每遍 lint 检查所需的时间。a 可以是 yesno。缺省值为 -Xtime=no。指定 -Xtime 与指定 -Xtime=yes 等效。

4.3.45 -Xtransition=a

针对 K&R C 和 Oracle Solaris Studio ISO C 之间的差异发出警告。a 可以是 yesno。缺省值为 -Xtransition=no。指定 -Xtransition 与指定 -Xtransition=yes 等效。

4.3.46 -Xustr={ascii_utf16_ushort| no}

选项允许编译器将 U"ASCII-string" 形式的文本字符串识别成无符号短整型数组。缺省值为 -Xustr=no,它禁止编译器识别 U"ASCII-string" 文本字符串。-Xustr=ascii_utf16_ushort 允许编译器识别 U"ASCII-string" 文本字符串。

4.3.47 -x

抑制某些消息。请参阅表 4-8

4.3.48 -y

命令行上命名的各个 .c 文件视为以指令 /* LINTLIBRARY */ 或注释 NOTE(LINTLIBRARY) 开头。lint 库通常是使用 /* LINTLIBRARY */ 指令或 NOTE(LINTLIBRARY) 注释创建的。