Hlavní navigace

PMD - statická analýza kódu

Lukáš Zapletal 7. 3. 2003

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

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.

Našli jste v článku chybu?

4. 4. 2006 14:06

m (neregistrovaný)
PMD umi samozrejme zkontrolovat cely projekt, ne pouze jeden soubor. Mezi vstupni data muzete zaradit take adresare i soubory .jar nebo .zip. PMD projde vsechny archivy i podadresare v dane lokaci, pokud obsahuji soubory .java. Existuji pluginy pro vetsinu znamych vyvojovych prostredi. Plugin pro Eclipse je velmi zdarily.

16. 4. 2004 17:26

Jano (neregistrovaný)

Asi Vas sklamem, ale ani pri specifikovani vstupnych podmienok velmi dalej nezajdete. Presnejsie povedane, ano, existuju triedy programovych schem, pre ktore sa pri zadanych vstupnych podmienkach da urcit, ci program skutocne skonci.

V praxi vsak taketo programy nenajdete - max. algoritmus na par desiatok riadkov, ktory bol pisany specialnym sposobom, prave kvoli moznosti dokazu konecnosti alebo spravnosti.



120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?