Hlavní navigace

PMD - statická analýza kódu

7. 3. 2003
Doba čtení: 3 minuty

Sdílet

Při programování je dobré dodržovat určitý úzus, který se jazyk od jazyka liší. Programátor by zkrátka měl být "slušný" a používat programovací jazyk tak, aby vše bylo zřetelné a jasné. Programy pro statickou analýzu zdrojového kódu umí odhalit nedostatky nebo upozornit na ty části, které by mohly být problémové.

V následujícím článku se budeme zaobírat programem PMD, který je určen pro programovací jazyk Java. Jelikož je práce s analyzátory kódu prakticky ve všech případech stejná, článek může být užitečný i pro ty, kteří Javu nevyužívají.

PMD je v mnoha ohledech výjimečný. Kromě toho, že se jedná o Open Source projekt, je PMD výborně navržen (jak už bývá u programů v Javě zvykem). Umožňuje velice snadno vytvářet vlastní pravidla formou XML značek a javovských tříd, které pak mohou být přijaty do oficiální distribuce.  Proto toho umí PMD již dnes (verze 1.0.3) hodně a nová a nová pravidla se týden co týden přidávají.

Pokud používáte IDE prostředí (Eclipse, Netbeans…), jistě jste si již zvykli, že vás prostředí upozorňuje na nedostatky v kódu (nemám na mysli chyby, předpokládejme, že kód lze přeložit). Pokud preferujete příkazovou řádku, určitě jste se někdy setkali s varováním překladače. Taková neinicializovaná proměnná je klasickým případem, který obvykle generuje varování.

To je právě práce pro PMD. Umí lokalizovat a upozornit na takovéto problémy, přičemž řada z nich není až tak triviální. Instalace se provádí jednoduše (viz. články Instalujeme programy v Javě), spouštění pak probíhá z příkazové řádky. PMD umí odhalit přes 200 problémů a další na sebe nenechají dlouho čekat. Zejména v různých specifických oblastech (programování J2EE, MIDP atd) je ještě mnoho volného prostoru pro další pravidla.

Výstupem PMD je prostý text, XML nebo HTML dokument. Je snadné si PMD nastavit ve vašem oblíbeném IDE jako External Tool a poté se klikáním na vzniklé chyby přesouvat okamžitě na inkriminované oblasti. Kromě toho PMD nabízí také Ant Task, takže jej můžete směle používat s Antem, a navíc se PMD dodává s pluginy pro nejpoužívanější IDE (Eclipse, Netbeans, Sun ONE, JBuilder, IDEA, Emacs, JEdit atd). Výhoda těchto pluginů je zřejmá. Nalezené problémy se obvykle objevují přímo ve zdrojovém kódu, v TODO listech nebo kompilačních oknech daného prostředí. Abychom jenom neteoretizovali, ukážeme si na příkladu, jaké chyby například umí PMD zjistit.

Tabulka č. 390
import java.util.ArrayList;
import java.util.HashSet;

// nepouzity import
import java.awt.color.ICC_ColorSpace;

public class Test {

// prilis kratky nazev clenske promenne
    // promenna navic neni pouzita
    private int i;

  // nepouzita clenska promenna
 // navic retezce je lepe inicializovat pomoci = a "
   private static String bar = new String("Test"); 

    // proc vracet implementaci misto rozhrani?
   public ArrayList getList() {
      return new ArrayList();
   }

   public static void main(String[] pars) { 
// zbytecne volani toString
        System.out.println(bar.toString());
   }

   // pretizime pouze equals
 public boolean equals(Object arg0) {
      try {
// je vyhodnejsi pouzivat rozhrani
         // misto implementacni tridy
          HashSet hs = new HashSet();
       } catch (Exception e) {
// prazdny blok catch
        }

// vyhodnejsi je return (1 == 2)
     if (1 == 2) {
         return true;
      } else {
          return false;
     }
 }

}

Ukázkový příklad plný nemotorných obratů

Po prozkoumání kódu PMD seřadí vzniklé problémy podle priorit a vrátí výsledek. V tomto případě je to snad desítka různých varování a doporučení. Vidíte, a přesto se program přeloží. Inu, i takhle lze programovat. Na obrázku vidíte IDE Eclipse (viz. článek Eclipse – IDE na všechno) s pluginem PMD v akci.

IDE Eclipse

CS24_early

Skvělé je to, že díky kompilátoru JavaCC, který PMD používá, je přidání nového pravidla hračkou. Můžeme se tak těšit na sadu pravidel pro J2EE, které nás třeba upozorní na vytvoření třídy Socket v Enterprise JavaBeansu a podobně. Za zmínku stojí také to, že díky technologii XML byl PMD snadno integrován do automatického sestavovacího frameworku Maven, který např. používá většina projektů na Apache.org. Maven umožňuje pomocí Antu udělat CVS checkout, provést kompilaci, vytvořit API dokumentaci, generovat statické stránky nápověd a tutoriálů, spustit JUnit testy a code measuring programy, také provést kontrolu kódu pomocí PMD (!), vytvořit distribuční balíčky s binárkami a zdrojovými kódy (tzv. snapshots) a dělat jiné plně konfigurovatel­né úkony.

Dnešní moderní integrovaná prostředí nabízejí mnoho a obvykle mají již nějakou statickou analýzu kódu implementovánu. Ve většině případů se však rozsah rozpoznaných problémů nemůže rovnat se specializovanými programy tohoto typu, jakým je například PMD.

Byl pro vás článek přínosný?

Autor článku