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) | ^ 2 行目, Test1.c | | cpv(argv[0], argc, strlen(argv[0])); | ^ 10 行目, Test1.c 警告: ポインタ/整数の組み合わせは不適切です:2 番目の引数 | |static void cpv(char *s, char* v, unsigned n) | ^ 2 行目, Test1.c | |cpv(argv[0], argc, strlen(argv[0])); | ^ 10 行目, Test1.c | | *v++ = *s++; | ^ 5 行目, Test1.c 疑わしい方法で作成されたポインタを使用しています v, 定義された場所: Test1.c(2) ::Test1.c(5) 呼び出しスタック: main() , Test1.c(10) cpv() , Test1.c(5) |
1 つめの警告は、2 つのコード行の間で矛盾があることを示しています。2 つめの警告には、その時のコールスタックとエラーに到るまでの制御フローが表示されます。
次に示すプログラム 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 |
結果として、次のような出力が得られます。