Jakie są różnice między PMD a FindBugs?

107

Pojawiło się pytanie porównujące PMD i CheckStyle . Nie mogę jednak znaleźć ładnego zestawienia różnic / podobieństw między PMD i FindBugs. Uważam, że kluczową różnicą jest to, że PMD działa na kodzie źródłowym, podczas gdy FindBugs działa na skompilowanych plikach kodu bajtowego. Ale jeśli chodzi o możliwości, czy powinien to być wybór albo / albo, czy też się one uzupełniają?

Thomas Owens
źródło

Odpowiedzi:

151

Używam obu. Myślę, że się uzupełniają.

Jak powiedziałeś, PMD działa na kodzie źródłowym i dlatego znajduje problemy, takie jak: naruszenie konwencji nazewnictwa, brak nawiasów klamrowych, niewłaściwe sprawdzanie wartości null, długa lista parametrów, niepotrzebny konstruktor, brak przerwy w przełączniku itp. PMD mówi również o Cyclomatic złożoność twojego kodu, co uważam za bardzo pomocne (FindBugs nie mówi ci o złożoności cyklomatycznej).

FindBugs działa na kodzie bajtowym. Oto kilka problemów, które FindBugs wyszukuje, których PMD nie ma: metoda equals () nie działa na podtypach, metoda clone może zwrócić wartość null, porównanie referencji wartości logicznych, niemożliwe rzutowanie, 32-bitowy int przesunięty o kwotę spoza zakresu 0-31, kolekcja, która zawiera samą siebie, metoda equals zawsze zwraca true, nieskończoną pętlę itp.

Zwykle każdy z nich znajduje inny zestaw problemów. Użyj obu. Narzędzia te wiele mnie nauczyły o tym, jak pisać dobry kod w języku Java.

wąż
źródło
Jaki jest konkretny kod błędu, który zobaczyłeś, gdy kolekcja zawiera samą siebie i dlaczego został oznaczony jako prawdopodobny błąd przez FindBugs?
Geek
cóż, ponieważ Sonarqube 6.3 już nie jest ... Sonarqube potrzebuje teraz Java 8, a Findbugs obsługuje jeszcze tylko Javę 7
Markus
22

Najlepszą cechą PMD są reguły XPath w pakiecie z narzędziem Rule Designer, które umożliwiają łatwe tworzenie nowych reguł na podstawie próbek kodu (podobnie jak w przypadku kreatorów GUI RegEx i XPath). FindBugs jest silniejszy od razu po wyjęciu z pudełka, ale tworzenie reguł i wzorców specyficznych dla projektu jest bardzo ważne.

Na przykład napotkałem problem z wydajnością obejmujący 2 zagnieżdżone pętle for, co skutkowało czasem działania O (n ^ 2), którego można było łatwo uniknąć. Użyłem PMD do skonstruowania zapytania ad-hoc , aby przejrzeć inne instancje zagnieżdżonych pętli for - // ForStatement / Statement // ForStatement. Wskazało to na 2 kolejne przypadki problemu. To wcale nie jest ogólna zasada.

Dekel
źródło
2

PMD jest

  • sławny
  • szeroko stosowane w przemyśle
  • możesz dodać swoje reguły w xml
  • zapewnia szczegółową analizę poziomów błędów i poziomów ostrzegawczych
  • możesz także zeskanować swój kod w poszukiwaniu „kopiuj i wklejaj linie”. Powielony kod. Daje to dobry pomysł na temat implementacji błędów Java.
kunal saxena
źródło
Nie rozmawia z FindBugs; uzupełniają się, ponieważ ich zestawy problemów nie są identyczne.
Stevers