• data-use analysis to find errors such as data used before initialisation,
variables declared but not used, and redundant writes;
• range-bound analysis to find errors such as array indices outside the
boundaries of the array;
• interface analysis to find errors such as mismatches in argument lists