Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "CDT/Archive/designs/StaticAnalysis/CheckerIdeas"

Line 1: Line 1:
This page is collection of ideas for checker that can be implemented for C/C++ Static Analysis in CDT (Codan).
+
This page is collection of ideas for checker that can be implemented for C/C++ Static Analysis in CDT (Codan). Feel free to add your own ideas or links.  
Feel free to add your own ideas or links.
+
 
 +
== Checkers  ==
  
== Checkers ==
 
 
;Unused #include
 
;Unused #include
   #include <stdio.h>
+
 
  int main() { return 1; }
+
   #include &lt;stdio.h&gt;
 +
int main() { return 1; }
 +
 
 
;Malloc called without sizeof consideration
 
;Malloc called without sizeof consideration
 +
 
   int * arr = (int *)malloc(20); // should be malloc(20*sizeof(int))
 
   int * arr = (int *)malloc(20); // should be malloc(20*sizeof(int))
 +
 
;Assigned to itself
 
;Assigned to itself
 +
 
   x = x;
 
   x = x;
;Result of comparison is constant  
+
 
 +
;Result of comparison is constant
 +
 
 
   (x==x)
 
   (x==x)
  (!x && x)
+
(!x &amp;&amp; x)
 +
 
 
;Redundant comparison operations
 
;Redundant comparison operations
 +
 
   (!(!x))
 
   (!(!x))
  (x!=0 || 0!=x)
+
(x!=0 || 0!=x)
 +
 
 
;Comparison is used on "boolean" values
 
;Comparison is used on "boolean" values
   0<x<3
+
 
  !x>5
+
   0&lt;x&lt;3
 +
&nbsp;!x&gt;5
 +
 
 
;Consequent re-assignment without usage (sub-case of Value is never used after assignment)
 
;Consequent re-assignment without usage (sub-case of Value is never used after assignment)
 +
 
   x=1;
 
   x=1;
  x=2;
+
x=2;
 +
 
 
;Value is never used after assignment
 
;Value is never used after assignment
 +
 
   int x;
 
   int x;
  x=23;
+
x=23;
  return;
+
return;
;Unused local variable
+
 
:local variable is not used in function
+
;Unused local variable  
;Undeclared variable
+
:local variable is not used in function  
 +
;Undeclared variable  
 
:This is compiler error - catch early and have a quick fix so Ctrl-1 work like in java, I so like java quick fixes and code generation!
 
:This is compiler error - catch early and have a quick fix so Ctrl-1 work like in java, I so like java quick fixes and code generation!
 +
 
   { x = 5; }
 
   { x = 5; }
 +
 
:Quick fix
 
:Quick fix
 +
 
   { int x = 5; }
 
   { int x = 5; }
;Buffer over flow
+
 
: This code is unsafe
+
;Buffer over flow  
  char x[10];
+
:This code is unsafe
  char y[15];
+
 
  memcpy(x,y,20);
+
char x[10];
 +
char y[15];
 +
memcpy(x,y,20);
 +
 
 +
:Also this code
 +
 
 +
char x[10];
 +
x[11] = 'a';
 +
b = x[11];
 +
 
 
;Invalid value assignment to enum
 
;Invalid value assignment to enum
 +
 
  enum ee { a, b };
 
  enum ee { a, b };
 
  ee dd;
 
  ee dd;
 
  dd = 7;
 
  dd = 7;
;Reduce scope
+
 
:When a variable or a function has a greater scope than where it is used, that scope may be reduced.
+
;Reduce scope  
:For example: a variable with file scope that is only used in one function, can be declared static with function scope.
+
:When a variable or a function has a greater scope than where it is used, that scope may be reduced.  
 +
:For example: a variable with file scope that is only used in one function, can be declared static with function scope.  
 
:Or, a function that is only used in one file, may be declared with the static keyword, and its declaration removed from header files included by other files.
 
:Or, a function that is only used in one file, may be declared with the static keyword, and its declaration removed from header files included by other files.
  
== Links ==
+
;Variable with same name in higher scope
* http://www.aristeia.com/ddjpaper1.html
+
 
 +
int a;
 +
void foo( void )
 +
{
 +
  int a;
 +
}
 +
 
 +
;Missing "break" in "switch"
 +
:finding missing "break" when one "case" ends and another starts, or the "switch" ends. Unless /* no break */
 +
 
 +
switch {
 +
case 1:
 +
  // &lt;- here (before next "case")
 +
case 2:
 +
  /* no break */ // &lt;- This is OK
 +
case 3:
 +
  // &lt;- here (end of "switch")
 +
}
 +
 
 +
;Condition always TRUE / FALSE
 +
 
 +
if( 1 &gt; 2 ) // Always FALSE
 +
if( 1 &lt; 2 ) // Always TRUE
 +
 
 +
== Links ==
 +
 
 +
*http://www.aristeia.com/ddjpaper1.html

Revision as of 08:02, 8 October 2010

This page is collection of ideas for checker that can be implemented for C/C++ Static Analysis in CDT (Codan). Feel free to add your own ideas or links.

Checkers

Unused #include
 #include <stdio.h>
int main() { return 1; }
Malloc called without sizeof consideration
 int * arr = (int *)malloc(20); // should be malloc(20*sizeof(int))
Assigned to itself
 x = x;
Result of comparison is constant
 (x==x)
(!x && x)
Redundant comparison operations
 (!(!x))
(x!=0 || 0!=x)
Comparison is used on "boolean" values
 0<x<3
 !x>5
Consequent re-assignment without usage (sub-case of Value is never used after assignment)
 x=1;
x=2;
Value is never used after assignment
 int x;
x=23;
return;
Unused local variable
local variable is not used in function
Undeclared variable
This is compiler error - catch early and have a quick fix so Ctrl-1 work like in java, I so like java quick fixes and code generation!
 { x = 5; }
Quick fix
 { int x = 5; }
Buffer over flow
This code is unsafe
char x[10];
char y[15];
memcpy(x,y,20);
Also this code
char x[10];
x[11] = 'a';
b = x[11];
Invalid value assignment to enum
enum ee { a, b };
ee dd;
dd = 7;
Reduce scope
When a variable or a function has a greater scope than where it is used, that scope may be reduced.
For example: a variable with file scope that is only used in one function, can be declared static with function scope.
Or, a function that is only used in one file, may be declared with the static keyword, and its declaration removed from header files included by other files.
Variable with same name in higher scope
int a;
void foo( void )
{
 int a;
}
Missing "break" in "switch"
finding missing "break" when one "case" ends and another starts, or the "switch" ends. Unless /* no break */
switch {
case 1:
 // <- here (before next "case")
case 2:
 /* no break */ // <- This is OK
case 3:
 // <- here (end of "switch")
}
Condition always TRUE / FALSE
if( 1 > 2 ) // Always FALSE
if( 1 < 2 ) // Always TRUE

Links

Back to the top