5.5 lint 指令
5.5.1 预定义值
运行 lint 对 lint 标记进行预定义。有关预定义标记的列表,另请参见 cc(1) 手册页。
5.5.2 指令
现有注释支持 /*...*/ 形式的 lint 指令,但将来的注释不支持这些指令。建议对所有注释使用源代码注释形式 (NOTE(...)) 的指令。
通过包括 note.h 文件可指定源代码注释形式的 lint 指令,例如:
#include <note.h>
lint 与其他多种工具共享源代码注释方案。安装 Oracle Developer Studio C 编译器时,还会自动安装 /usr/lib/note/SUNW_SPRO-lint 文件,该文件包含 LockLint 可识别的所有注释的名称。但是,Oracle Developer Studio C 源代码检验器 lint 还检查 /usr/lib/note 和 Oracle Developer Studio 缺省位置 install-directory/prod/lib/note 中的所有文件以查找所有有效的注释。
可通过设置环境变量 NOTEPATH 来指定 /usr/lib/note 以外的位置,如下所示:
setenv NOTEPATH $NOTEPATH:other_location
下表列出了 lint 指令及其操作。
表 16 lint 指令
|
|
NOTE(ALIGNMENT(fname,n)) where n=1, 2, 4, 8, 16, 32, 64, 128
|
指示 lint 将其后面的函数结果设置为以 n 字节对齐。例如,将 malloc() 定义为实际返回 word(甚至 doubleword)对齐的指针时返回一个 char* 或 void*。
禁止以下消息:
|
NOTE(ARGSUSED(n))
/*ARGSUSEDn*/
|
该指令的作用类似于下一个函数的 -v 选项。
禁止针对其后的函数定义中除前 n 个参数之外的各个参数发出以下消息。缺省值为 0。对于 NOTE 格式,必须指定 n。
|
NOTE(ARGUNUSED
(par_name[,par_name...]))
|
指示 lint 不检查提到的参数的用法(此选项仅适用于下一个函数)。
禁止对 NOTE 或指令中列出的各个参数发出以下消息。
|
NOTE(CONSTCOND)
/*CONSTCOND*/
|
禁止发出关于条件表达式的常量操作数的警告消息。禁止对该指令之后的构造发出以下消息。
亦作 NOTE(CONSTANTCONDITION) 或 /* CONSTANTCONDITION */。
constant in conditional context
constant operands to op: "!"
logical expression always false: op "&&"
logical expression always true: op "||"
|
NOTE(EMPTY) /*EMPTY*/
|
禁止由于 if 语句而引起 null 语句时发出警告信息。该指令应放在测试表达式之后和分号之前。当空 if 语句后跟有效 else 语句时,提供该指令以支持空 if 语句。它禁止针对空 else 结论发出消息。
禁止在 if 的控制表达式与分号之间插入时发出以下消息。
|
NOTE(FALLTHRU)
/*FALLTHRU*/
|
禁止在 case 或 default 带标签语句失败时发出警告消息。该指令应放在标签之前并紧挨着标签。
禁止对该指令之后的 case 语句发出以下消息。亦作 NOTE(FALLTHROUGH) 或 /* FALLTHROUGH */。
|
NOTE(LINTED (msg))
/*LINTED [msg]*/
|
禁止所有文件内警告(由 lint 第 1 遍发出的警告),处理未使用的变量或函数时发出的警告除外。未能使用 LINTED 指令禁止 lint 第 2 遍发出的需要文件间分析的消息,并且通常会提供一条指出未使用 LINTED 禁止指令的警告消息来指示此情况。该指令应放在紧挨着发生 lint 警告的位置之前的行上。-k 选项改变 lint 处理该指令的方式。lint 会打印注释中包含的附加消息(如果有),而非禁止消息。该指令可与 -s 选项一起用于 post-lint 过滤。
未调用 -k 时,将禁止针对该指令之后的代码行发出关于文件内问题的任何警告,但以下警告除外:
-
argument unused in function
-
declarations unused in block
-
set but not used in function
-
static unused
-
variable not used in function
将忽略 msg。
|
NOTE(LINTLIBRARY)
/*LINTLIBRARY*/
|
调用了 -o 时,仅会将以该指令开头的 .c 文件中的定义写入到库 .ln 文件。该指令禁止发出关于此文件中存在未使用的函数和函数参数的消息。
|
NOTE(NOTREACHED)
/*NOTREACHED*/
|
在适当的点,停止关于无法执行到的代码的注释。此注释通常放在诸如 exit(2) 的函数调用之后。
禁止在函数末尾该指令之后存在右花括号时发出以下消息。
-
statement not reached
对于该指令之后的无法执行到的语句;
-
fallthrough on case statement
对于该指令之后无法从前面的 case 执行到的 case;
-
function falls off bottom without returning value
|
NOTE(PRINTFLIKE(n))
NOTE(PRINTFLIKE(fun_name,n))
/*PRINTFLIKEn*/
|
将其后函数定义中的第 n 个参数视为 [fs]printf() 格式字符串,并在其余参数与转换定义之间不匹配时发出以下消息。缺省情况下,如果标准 C 库提供的 [fs]printf() 函数调用中存在错误,lint 会发出这些警告。
对于 NOTE 格式,必须指定 n。
-
malformed format strings
对于该参数中的无效转换定义,以及函数参数类型与格式不一致
-
too few arguments for format
-
too many arguments for format
|
NOTE(PROTOLIB(n))
/*PROTOLIBn*/
|
当 n 为 1,并且使用了 NOTE(LINTLIBRARY) 或 /* LINTLIBRARY */ 时,仅将该指令之后的 .c 文件中的函数原型声明写入库 .ln 文件。缺省值为 0,它取消该进程。
对于 NOTE 格式,必须指定 n。
|
NOTE(SCANFLIKE(n))
NOTE(SCANLIKE(fun_name,n))
/*SCANFLIKEn*/
|
与 NOTE(PRINTFLIKE(n)) 或 /* PRINTFLIKEn */ 相同,只是函数定义的第 n 个参数会被视为 [fs]scanf() 格式字符串。缺省情况下,如果标准 C 库提供的 [fs]scanf() 函数调用中存在错误,lint 会发出警告。
对于 NOTE 格式,必须指定 n。
|
NOTE(VARARGS(n))
NOTE(VARARGS(fun_name,n))
/*VARARGSn*/
|
禁止对以下函数声明中可变数量的参数执行常规检查。检查前 n 个参数的数据类型;缺少 n 时,会将其视为 0。建议在新代码或更新的代码中,在定义中使用省略号 (...) 作为终结符。
对于其定义在该指令之后的函数,禁止在调用带有 n 个或更多参数的函数时发出以下消息。对于 NOTE 格式,必须指定 n。
|
|