Skip Navigation Links | |
Exit Print View | |
![]() |
Oracle Solaris Studio 12.3: C User's Guide Oracle Solaris Studio 12.3 Information Library |
1. Introduction to the C Compiler
2. C-Compiler Implementation-Specific Information
4.1 Basic and Enhanced lint Modes
4.3.46 -Xustr={ascii_utf16_ushort|no}
4.6 lint Reference and Examples
4.6.1 Diagnostics Performed by lint
4.6.1.3 Questionable Constructs
7. Converting Applications for a 64-Bit Environment
8. cscope: Interactively Examining a C Program
A. Compiler Options Grouped by Functionality
B. C Compiler Options Reference
C. Implementation-Defined ISO/IEC C99 Behavior
E. Implementation-Defined ISO/IEC C90 Behavior
H. Oracle Solaris Studio C: Differences Between K&R C and ISO C
Most of lint’s messages are simple, one-line statements printed for each occurrence of the problem they diagnose. Errors detected in included files are reported multiple times by the compiler, but only once by lint no matter how many times the file is included in other source files. Compound messages are issued for inconsistencies across files and, in a few cases, for problems within them as well. A single message describes every occurrence of the problem in the file or files being checked. When use of a lint filter requires that a message be printed for each occurrence, compound diagnostics can be converted to the simple type by invoking lint with the -s option. See 4.6.2 lint Libraries for more information.
lint’s messages are written to stderr.
You can use several lint options to suppress lint diagnostic messages. Messages can be suppressed with the -erroff option followed by one or more tags. These mnemonic tags can be displayed with the -errtags=yes option.
The following table lists the options that suppress lint messages.
Table 4-8 lint Options to Suppress Messages
|
The lint program can, with certain options, show precise source file lines with pointers to the line position where the error occurred. The option enabling this feature is -errfmt=f, which causes lint to provide the following information:
Source lines and positions
Macro unfolding
Error-prone stacks
For example, the following program, Test1.c, contains an error.
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}
Using lint on Test1.c with the —errfmt=src option produces the following output::
% 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)
The first warning indicates two source lines that are contradictory. The second warning shows the call stack with the control flow leading to the error.
Another program, Test2.c, contains a different error:
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 }
Using lint on Test2.c with the —errfmt= macro option produces the following output, showing the steps of macro substitution:
% 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