139 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| .NH
 | |
| Ideas for further development
 | |
| .PP
 | |
| Although the program in its current state is a useful program,
 | |
| there are still a lot of features that should be implemented
 | |
| in following versions.
 | |
| I'll summarize them in this section.
 | |
| .IP \(bu
 | |
| Actually the program consists of three passes.
 | |
| The filter
 | |
| .I sort
 | |
| is a complete pass, just as the first and the second pass.
 | |
| I think we speed up the program by removing the filter and making
 | |
| the second pass accept an unsorted file.
 | |
| The sorting process can be done in parallel to the first pass if
 | |
| both processes communicate through a pipe.
 | |
| In addition to this sorting, the second pass can generate already
 | |
| some warnings.
 | |
| (Warnings like \f(CW%s defined but never used\fP can only be
 | |
| generated after having processed all the input.)
 | |
| These warnings generated in parallel to the warnings of the first pass,
 | |
| should be sent to an intermediate file, otherwise the warnings would
 | |
| get messed up.
 | |
| Such an improvement will have best effect on a multi processing
 | |
| machine, but even on single processing machines this will give a better
 | |
| performance. (On a single processing machine the pipe should be
 | |
| replaced by an intermediate file.)
 | |
| .IP \(bu
 | |
| Expressions could be classified so
 | |
| .I lint
 | |
| can warn for some classes of expressions in strange contexts.
 | |
| Suppose as class <boolean>.
 | |
| \f(CWb\fP Will be of class <boolean> if e.g. \f(CWb\fP is assigned to
 | |
| the expression \f(CW<ex1> || <ex2>\fP.
 | |
| The following expression should then give a warning
 | |
| .DS B
 | |
| .ft CW
 | |
| b + i;    /* weird expression */
 | |
| .R
 | |
| .DE
 | |
| .IP \(bu
 | |
| A mechanism to check printf like routines.
 | |
| This mechanism should verify the format string against the following
 | |
| arguments.
 | |
| There is a public domain program that can be used to do this job.
 | |
| It is called printfck and should be used as a filter between the
 | |
| source files and
 | |
| .I lint.
 | |
| .IP \(bu
 | |
| Raise warnings for incomplete initializer lists like
 | |
| .DS B
 | |
| .ft CW
 | |
| int a[10] = {0, 1, 2};
 | |
| /* initializer list not complete */
 | |
| .R
 | |
| .DE
 | |
| .IP \(bu
 | |
| Warnings for constructs like
 | |
| .DS B
 | |
| .ft CW
 | |
| for (i = 0; i < 10; i++) {
 | |
|         . . . .
 | |
|         i--;
 | |
|         /* loop control variable affected */
 | |
|         . . . .
 | |
| }
 | |
| .R
 | |
| .DE
 | |
| and
 | |
| .DS B
 | |
| .ft CW
 | |
| while (var) {
 | |
|         /* statements in which the value
 | |
|          * of var is never changed
 | |
|          */
 | |
| }
 | |
| /* loop control variable not updated */
 | |
| .R
 | |
| .DE
 | |
| .IP \(bu
 | |
| A warning \f(CWbad layout\fP for program fragments like
 | |
| .DS B
 | |
| .ft CW
 | |
| if (cond1)
 | |
|         if (cond2)
 | |
|                 statement();
 | |
| else  /* bad layout */
 | |
|         statement();
 | |
| .R
 | |
| .DE
 | |
| .IP \(bu
 | |
| A warning \f(CWassignment in conditional context\fP in case of
 | |
| .DS B
 | |
| .ft CW
 | |
| if (a = b)
 | |
| .R
 | |
| .DE
 | |
| .IP
 | |
| The programmer probably meant \f(CWif (a == b)\fP.
 | |
| No warning should be given for \f(CWif ((a = b) != c)\fP,
 | |
| nor for \f(CWif ((a = b))\fP.
 | |
| .IP \(bu
 | |
| Warnings for empty statements in strange contexts, like
 | |
| .DS B
 | |
| .ft CW
 | |
| if (cond);  /* mistake */
 | |
|         statement();
 | |
| .R
 | |
| .DE
 | |
| .IP
 | |
| (This mistake would also be detected by a warning \f(CWbad layout\fP.)
 | |
| .IP \(bu
 | |
| A mechanism to prevent the warning \f(CWpossible pointer alignment
 | |
| problem\fP for functions of which the programmer already knows that
 | |
| no problem will arise.
 | |
| E.g. for functions like malloc and family.
 | |
| .IP \(bu
 | |
| The current version of
 | |
| .I lint
 | |
| warns for conversions from long to int (if -a flag is
 | |
| on).
 | |
| It even warns if the programmer used the proper cast, as e.g.
 | |
| .DS B
 | |
| .ft CW
 | |
| int i;
 | |
| long l = 0L;
 | |
| 
 | |
| i = (int)l;
 | |
| .R
 | |
| .DE
 | |
| .IP
 | |
| In this case I think
 | |
| .I lint
 | |
| need not warn.
 | |
| The explicit cast indicates that the programmer knows what he is
 | |
| doing.
 | |
| This feature is not implemented because the expression tree doesn't
 | |
| show if the cast was implicit or explicit.
 | |
| .bp
 |