Jakie narzędzia analizy statycznej C ++ typu open source są dostępne? [Zamknięte]

301

Java ma kilka bardzo dobrych narzędzi analizy statycznej typu open source, takich jak FindBugs , Checkstyle i PMD . Narzędzia te są łatwe w użyciu, bardzo pomocne, działają na wielu systemach operacyjnych i są bezpłatne .

Dostępne są komercyjne produkty do analizy statycznej C ++. Chociaż posiadanie takich produktów jest świetne, dla studentów jest to o wiele za dużo i zazwyczaj trudno jest uzyskać wersję próbną.

Alternatywą jest znalezienie narzędzi do analizy statycznej C ++ typu open source, które będą działać na wielu platformach (Windows i Unix). Korzystając z narzędzia typu open source, można je zmodyfikować w celu dostosowania do określonych potrzeb. Znalezienie narzędzi nie było łatwym zadaniem.

Poniżej znajduje się krótka lista narzędzi do analizy statycznej C ++, które zostały znalezione lub zasugerowane przez innych.

Jakie są inne przenośne narzędzia do analizy statycznej C ++ typu open source, o których każdy wie i które można polecić?

Niektóre powiązane linki.

jnancheta
źródło
Komercyjne, DMS Software Reengineering Toolki, obsługuje Java, C, C ++ i COBOL, zapewnia parsowanie, budowanie AST, rozpoznawanie nazw / typów, analizę sterowania / przepływu danych, analizę niestandardową i transformację. Zobacz semanticdesigns.com/Products/DMS/DMSToolkit.html .
Ira Baxter
1
W przypadku narzędzia komercyjnego istnieje również CppDepend ( cppdepend.com ), a może wersja testowa może być wystarczająca dla studentów.

Odpowiedzi:

21

Oink to narzędzie zbudowane na froncie Elsa C ++. Wieprzowina Mozilli to widelec Elsa / Oink.

Zobacz: http://danielwilkerson.com/oink/index.html

Daniel S Wilkerson
źródło
1
W swoim życiu skompilowałem ponad 1000 programów, ale na miłość boską nie mogę skompilować tego pakietu bez względu na wszystko. Próbowałem użyć Fedory, Ubuntu, WSL, Cygwin, MSYS2, Windows - ale nie. Zawsze czegoś brakuje, a dokumentacja jest po prostu okropna. Nie zrozum mnie źle, myślę, że to narzędzie jest doskonałe. Ale strona internetowa i dokumentacja wygląda na to, że nikt nie dotknął ich przez 10-15 lat.
Apache
73

CppCheck to oprogramowanie typu open source i wieloplatformowe.

Mac OS X:

brew install cppcheck
Soo Wei Tan
źródło
1
@gio Nie widziałem żadnych problemów osobiście. Uważam, że CppCheck ma możliwość ignorowania lub wykluczania niektórych ścieżek lub plików, co pomaga zawęzić zakres.
Soo Wei Tan
1
W systemie Windows:choco install cppcheck
KindDragon
53

Jeśli chodzi o kompilator GNU, gcc ma już wbudowaną opcję, która włącza dodatkowe ostrzeżenia dla -Wall. Opcją jest -Weffc ++ i dotyczy naruszenia niektórych wytycznych Scotta Meyersa opublikowanych w jego książkach „ Skuteczne i bardziej skuteczne C ++ ”.

W szczególności opcja wykrywa następujące elementy:

  • Zdefiniuj konstruktor kopii i operator przypisania dla klas z dynamicznie przydzielaną pamięcią.
  • Wolę inicjalizację niż przypisanie w konstruktorach.
  • Wirtualizatory w wirtualnych klasach podstawowych.
  • Niech „operator =” zwróci odwołanie do * tego.
  • Nie próbuj zwracać referencji, gdy musisz zwrócić obiekt.
  • Rozróżnij formy przedrostków i postfiksów operatorów inkrementacji i dekrementacji.
  • Nigdy nie przeciążaj „&&”, „||” lub „,”.
Nicola Bonelli
źródło
7
Oprócz -Wall i -Weffc ++ gcc, -Wextra wykonuje dobre, bezpłatne analizy statyczne, np. Gałęzie, które nie zwracają wartości, lub sprawdza, czy wartość bez znaku jest mniejsza niż zero. To niezwykłe, jak często profesjonalni programiści myślą, że ten drugi jest dobrym pomysłem…
Flash Sheridan
24
Fuj, -Weffc++ostrzega przed mnóstwem konstruktów, które są doskonale w dużej bazie kodu. Popieram jednak sugestię -Wextra; nie wychodź z domu bez niego!
Tom
29

Na razie w fazie rozwoju, ale clang wykonuje analizę C i ma na celu obsługę C ++ w czasie. Jest to część projektu LLVM .

Aktualizacja : Chociaż strona docelowa mówi „Analizator jest ciągłym procesem w toku”, jest on jednak teraz udokumentowany jako analizator statyczny zarówno dla C, jak i C ++.

Pytanie: Jak uruchomić GCC / Clang do analizy statycznej? (tylko ostrzeżenia)

Opcja kompilatora: -fsyntax-only

Don Wakefield
źródło
1
LLVM to bardzo interesujący projekt, który w porównaniu do gcc generuje bardziej zoptymalizowane pliki binarne w krótszym czasie; i brzęczenie, gdy zostanie ukończone, będzie jego frontonem ...
Nicola Bonelli,
Inny edytor dodał informacje o przełączniku -fsyntax. Zauważ tylko, że jest to w zasadzie prośba o uruchomienie analizy, którą kompilator uruchomiłby bez faktycznej kompilacji, i wysłanie ostrzeżeń. Nie jestem pewien, ale myślę, że różni się to od analizy statycznej.
Don Wakefield
17

Ktoś inny wspomniał -Weffc ++, ale tak naprawdę jest to jedno z niewielu ostrzeżeń GCC, które domyślnie nie włączam. Jednak zestaw ostrzeżeń, które włączam, jest najważniejszym narzędziem analizy statycznej w moim zestawie. Możesz zobaczyć pełną listę zalecanych ostrzeżeń .

W podsumowaniu:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wlogical-op -Wissing-deklarations -Wississ-include-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign -version -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Nno-unused

Zauważ, że niektóre z nich wymagają nowej wersji gcc, więc może być konieczne wyeliminowanie ich z listy, jeśli utkniesz z powrotem w 4.5 lub coś.

David Stone
źródło
14

John Carmack wspomina również o PVS-Studio w tym ciekawym poście na blogu „Static Code Analysis” .

Alex Zakharenko
źródło
4
Nie jest ani „open source”, ani absolutnie i pozytywnie nie jest „wolny” w żadnym znaczeniu tego słowa. Jest to dobrze znane narzędzie do analizy statycznej (myślę, że jest to drugi co do pokrycia), ale jego cena jest dość wysoka.
Tomas Pruzina
7

Jeśli przez Open Source naprawdę miałeś na myśli „darmowy”, to szybka analiza Microsoftu jest dobra. Oczywiście tylko w systemie Windows. Jest w pełni zintegrowany z Visual Studio i kompilatorem. na przykład:

cl /analyze Sample.cpp
użytkownik15071
źródło
W której wersji i wydaniu jest dostępna?
twk
Wydaje się być wbudowany w kompilator, który jest bezpłatny. Integracja jest prawdopodobnie tylko w wersji Team.
JBRWilkinson
4

Wydaje się, że szyna wypełnia rachunek za C.

Jeśli nie podałeś open source, powiedziałbym , że PCLint firmy Gimpel Software jest prawdopodobnie jednym z najlepszych dostępnych narzędzi do sprawdzania kodu statycznego w C ++. Ale oczywiście nie jest to oprogramowanie typu open source.

Mac OS X:

brew install splint
Onorio Catenacci
źródło
2
Ale drogi dla jednego dewelopera :) Lubię bardziej za darmo
Robert Gould
6
szyna jest dla C, a nie C ++. Nie wiem, czy planują rozszerzyć zasięg, czy nie. Mam nadzieję!
Harold Bamford
Tak, pclint jest warty wypróbowania, jego odpowiednik w Uniksie nazywa się Flexe-Lint, wersja 9.0 musi być szybsza niż wersja 8.x, wersja 9.0 obsługuje również wstępnie skompilowany nagłówek, aby przyspieszyć analizę. Oswajanie PC-lint zajmuje trochę czasu, ma fałszywie dodatni efekt, który może sprawić kłopoty, jeśli nie możesz go selektywnie zignorować.
zhaorufei
3

PREFast firmy Microsoft jest również dostępny w zestawie sterowników Windows. Wersja 7.0 jest do pobrania tutaj .

Dokumenty firmy Microsoft stwierdzają, że należy go uruchamiać tylko w oparciu o kod sterownika, ale ten (stary) post na blogu określa kroki do uruchomienia. Być może można go zintegrować z normalnym procesem kompilacji?

Tmitchell
źródło
PREFast bardzo spowolni proces kompilacji, w przypadku każdego prawdziwego projektu serwer kompilacji może sobie na to nie pozwolić.
zhaorufei
@zhaorufei: Większość analiz statycznych nie jest „szybkich”; z definicji mają dość skomplikowane zadanie analizy kodu. Jeśli cały czas nie podoba ci się koszt kompilacji, po prostu ustaw go jako opcjonalny.
Ira Baxter
2

Pracowaliśmy nad wtyczką Eclipse CDT o nazwie metriculator. Jest wciąż w fazie rozwoju, ale niektóre główne wskaźniki (np. LSLOC, McCabe, EfferentCoupling) są już wdrożone.

Zobacz http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation, aby uzyskać więcej informacji, takich jak prezentacja wideo i dokumentacja.

Najnowszą kompilację nocną można zainstalować za pośrednictwem strony aktualizacji: http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

Dalszy opis

Metriculator analizuje statycznie kod źródłowy C ++ i generuje metryki oprogramowania. Metryki są wdrażane jako warcaby Codana. Wyniki analizy można zbadać w osobnym widoku. Każda metryka ma konfigurowalne właściwości (np. Próg „maksymalnej liczby linii kodu na funkcję”). Przekroczenie tego progu zgłosi problem i utworzy znacznik w edytorze kodu źródłowego.

z metriculatorem możesz:

  • analizować pliki / foldery / projekty C ++
  • zdefiniuj progi metryk i włącz / wyłącz metrykę za pomocą strony preferencji Codans
  • mają znaczniki problemów w edytorach kodu źródłowego
  • przeglądaj wyniki pomiarów
  • eksportuj wyniki pomiaru jako chmurę znaczników (dostępne jako opcjonalna funkcja za pośrednictwem witryny aktualizacji)

Obecnie metryka zawiera następujące dane:

  • McCabe (cykliczność)
  • EfferentCoupling według typu
  • Logiczne źródła linii kodu
  • Liczba członków według typu
  • Liczba parametrów na funkcję
Juliusz
źródło
1

Powinieneś wypróbować oo-browser, która ma niesamowitą integrację z xemacs

Juda
źródło
1

Można również kodować rozszerzenia GCC w MELT (język specyficzny dla domeny przeznaczony do rozszerzania GCC) lub wtyczki GCC w C (znacznie trudniej), aby przeprowadzić niestandardową analizę.

Basile Starynkevitch
źródło
2
Przeczytałem jeden z plików PDF o MELT i rozszerzaniu gcc za pomocą stopienia, mam wrażenie, że wciąż jest zbyt skomplikowany / trudny, aby dodać własne wtyczki do gcc. Niepraktyczny sposób dla zwykłego użytkownika.
zhaorufei
1
Rozszerzenie GCC jest skomplikowane, niezależnie od tego, jak to zrobisz (poprzez wtyczki C, przez MELT, a nawet przez Python). Jest tak, ponieważ GCC jest złożony. Dostosowanie dowolnego narzędzia do analizy statycznej C ++ jest trudne, ponieważ specyfikacja języka C ++ jest bardzo złożona i trzeba poradzić sobie z większością tej złożoności (każdy nietrywialny program C ++ wykorzystuje wiele funkcji C ++, być może poprzez standardową bibliotekę C ++) .
Basile Starynkevitch
0

Doxygen przeprowadza analizę przepływu sterowania i generuje wykresy. To może nie być to, czego szukasz, ale uważam, że warto na nie spojrzeć.

Paul Nathan
źródło