lint 程序可以使用某些选项显示精确的源文件行,并将指针指向发生错误的行位置。启用此功能的选项为 -errfmt=f,将使 lint 提供以下信息:
源代码行和位置
宏展开
有错误倾向的堆栈
例如,以下程序 Test1.c 包含一个错误。
1 #include <string.h>
2 static void cpv(char *s, char* v, unsigned n)
3 { int i;
4 for (i=0; i<=n; i++){
5 *v++ = *s++;}
6 }
7 void main(int argc, char* argv[])
8 {
9 if (argc != 0){
10 cpv(argv[0], argc, strlen(argv[0]));}
11}在 Test1.c 中使用带 —errfmt=src 选项的 lint 将生成以下输出:
% lint -errfmt=src -Nlevel=2 Test1.c
|static void cpv(char *s, char* v, unsigned n)
| ^ line 2, Test1.c
|
| cpv(argv[0], argc, strlen(argv[0]));
| ^ line 10, Test1.c
warning: improper pointer/integer combination: arg #2
|
|static void cpv(char *s, char* v, unsigned n)
| ^ line 2, Test1.c
|
|cpv(argv[0], argc, strlen(argv[0]));
| ^ line 10, Test1.c
|
| *v++ = *s++;
| ^ line 5, Test1.c
warning: use of a pointer produced in a questionable way
v defined at Test1.c(2) ::Test1.c(5)
call stack:
main() , Test1.c(10)
cpv() , Test1.c(5)第一个警告指示互相矛盾的两个源代码行。第二个警告显示调用堆栈以及导致错误的控制流。
另一个程序 Test2.c 包含一个不同的错误:
1 #define AA(b) AR[b+l]
2 #define B(c,d) c+AA(d)
3
4 int x=0;
5
6 int AR[10]={1,2,3,4,5,6,77,88,99,0};
7
8 main()
9 {
10 int y=-5, z=5;
11 return B(y,z);
12 }在 Test2.c 中使用带 —errfmt= macro 选项的 lint 将生成以下输出,并显示宏替换的步骤:
% lint -errfmt=macro Test2.c
| return B(y,z);
| ^ line 11, Test2.c
|
|#define B(c,d) c+AA(d)
| ^ line 2, Test2.c
|
|#define AA(b) AR[b+l]
| ^ line 1, Test2.c
error: undefined symbol: l
|
| return B(y,z);
| ^ line 11, Test2.c
|
|#define B(c,d) c+AA(d)
| ^ line 2, Test2.c
|
|#define AA(b) AR[b+l]
| ^ line 1, Test2.c
variable may be used before set: l
lint: errors in Test2.c; no output created
lint: pass2 not run - errors in Test2.c