通过某些选项,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 使用带有以下选项的 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 使用带有以下选项的 lint:
% lint -errfmt=macro Test2.c |
产生以下输出,并显示宏替换的步骤: