Hangi açık kaynak C ++ statik analiz araçları mevcuttur? [kapalı]


301

Java, FindBugs , Checkstyle ve PMD gibi çok iyi açık kaynaklı statik analiz araçlarına sahiptir . Bu araçların kullanımı kolaydır, çok yardımcı olur, birden fazla işletim sisteminde çalışır ve ücretsizdir .

Ticari C ++ statik analiz ürünleri mevcuttur. Bu tür ürünlere sahip olmak harika olsa da, maliyet öğrenciler için çok fazladır ve deneme sürümünü almak genellikle zordur.

Alternatif, birden fazla platformda (Windows ve Unix) çalışacak açık kaynaklı C ++ statik analiz araçlarını bulmaktır. Açık kaynaklı bir araç kullanılarak, belirli ihtiyaçlara uyacak şekilde değiştirilebilir. Araçları bulmak kolay olmadı.

Aşağıda, başkaları tarafından bulunan veya önerilen C ++ statik analiz araçlarının kısa bir listesi bulunmaktadır.

Bazıları nelerdir diğer taşınabilir açık kaynak C ++ statik analiz araçları kimse bilir ve tavsiye edilebilir mi?

İlgili bazı bağlantılar.


Ticari, DMS Software Reengineering Toolki, Java, C, C ++ ve COBOL ile ilgilenir, ayrıştırma, AST oluşturma, ad / tip çözümleme, kontrol / veri akışı analizi, özel analiz ve dönüşüm sağlar. Semanticdesigns.com/Products/DMS/DMSToolkit.html adresine bakın .
Ira Baxter

1
Ticari araç için ayrıca CppDepend ( cppdepend.com ) vardır ve belki deneme sürümü öğrenciler için yeterli olabilir.

Yanıtlar:


21

Oink, Elsa C ++ ön ucunun üzerine inşa edilmiş bir araçtır. Mozilla'nın Domuzu Elsa / Oink'in bir çatal.

Bkz. Http://danielwilkerson.com/oink/index.html


1
Hayatımda 1000'den fazla program derledim, ama Tanrı sevgisi için ne olursa olsun bu paketi derleyemiyorum. Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows kullanmaya çalıştım - ama hayır. Bir şey her zaman eksik ve belgeler sadece korkunç. Beni yanlış anlamayın, sanırım araç mükemmel. Ancak web sitesi ve dokümantasyon 10-15 yıl içinde hiç kimse onlara dokunmadı.
Apache

73

CppCheck açık kaynaklı ve çapraz platformdur.

Mac OS X:

brew install cppcheck

1
@gio Ben şahsen herhangi bir sorun görmedim. CppCheck, kapsamı daraltmaya yardımcı olan belirli yolları veya dosyaları yoksayma veya dışlama yeteneğine sahip olduğuna inanıyorum.
Soo Wei Tan

1
Windows'ta:choco install cppcheck
KindDragon

53

GNU derleyicisine ilişkin olarak, gcc zaten -Wall'lara ek uyarı sağlayan yerleşik bir seçeneğe sahiptir . Seçenek -Weffc ++ ve Scott Meyers'ın " Effective and More Effective C ++ " adlı kitabında yayınlanan bazı kuralların ihlali ile ilgili .

Bu seçenek özellikle aşağıdaki öğeleri algılar:

  • Dinamik olarak ayrılmış belleğe sahip sınıflar için bir kopya oluşturucu ve atama işleci tanımlayın.
  • Yapıcılarda atama başlatmayı tercih edin.
  • Temel sınıflarda yıkıcıları sanal hale getirin.
  • "Operatörü =" için * bir referans döndürün.
  • Bir nesneyi döndürmeniz gerektiğinde başvuru döndürmeye çalışmayın.
  • Ön ek ve son düzeltme artış ve azaltma işleçlerini ayırt edin.
  • Asla "&&", "||" veya "," üzerine aşırı yükleme yapmayın.

7
Gcc'nin -Wall ve -Weffc ++ 'a ek olarak, -Wextra iyi bir serbest statik analiz yapar, örneğin, bir değer döndürmeyen dallar veya imzasız olanların sıfırdan küçük olup olmadığını kontrol etme. Profesyonel programcıların ikincisinin iyi bir fikir olduğunu düşündüğü dikkat çekici ...
Flash Sheridan

24
Yuck, büyük bir kod tabanında mükemmel derecede iyi olan tonlarca yapıyı -Weffc++uyarıyor . Yine de ikinci önerim ; onsuz evden çıkma! -Wextra
Tom

29

Şimdilik geliştiriliyor, ancak clang C analizi yapıyor ve C ++ 'ı zaman içinde ele almayı hedefliyor. LLVM projesinin bir parçası .

Güncelleme : Açılış sayfasında "Analizör sürekli bir çalışmadır" derken, yine de artık hem C hem de C ++ için statik bir analizör olarak belgelenmiştir .

Soru: Statik analiz için GCC / Clang'ı nasıl çalıştırabilirim? (yalnızca uyarılar)

Derleyici seçeneği: -fsyntax-only


1
LLVM, gcc'ye kıyasla daha kısa sürede optimize edilmiş ikili dosyalar üreten çok ilginç bir projedir; ve clang, tamamlandığında, ön ucu olacak ...
Nicola Bonelli

Başka bir düzenleyici, bilgileri yalnızca -fsyntax anahtarına ekledi. Sadece derleyicinin gerçekten derlemeden çalışacağı analizi yürütmenin bir istek olduğunu ve uyarıları yayınladığını unutmayın. Emin değilim, ama bunun statik analizden farklı olduğunu düşünüyorum.
Don Wakefield

17

Birisi -Weffc ++ 'dan bahsetti, ancak bu aslında varsayılan olarak açılmadığım tek GCC uyarılarından biri. Bununla birlikte, açtığım uyarı kümesi, kitimdeki en önemli statik analiz aracıdır. Önerilen uyarıların tam listesini görebilirsiniz .

Özetle:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wlogical-op -Wmissing-bildirimleri -Wmissing-include-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-varsayılan -Wundef -Werror -Wno-kullanılmamış

Bunlardan bazılarının gcc'nin yeni bir sürümünü gerektirdiğini unutmayın, bu nedenle 4.5'e veya başka bir şeye takılırsanız bunları listenizden kaldırmanız gerekebilir.



7

Açık Kaynak ile, gerçekten "özgür" demek istediyseniz , Microsoft'un prefast analizi iyi bir çözümdür . Sadece Windows. Visual Studio ve derleyiciye tamamen entegre edilmiştir. Örneğin:

cl /analyze Sample.cpp

Bu hangi sürüm ve sürümde mevcut?
twk

Ücretsiz derleyiciye inşa edilmiş gibi görünüyor. Entegrasyon yalnızca Team sürümüdür.
JBRWilkinson


4

Atel C için faturayı dolduruyor gibi görünüyor.

Eğer açık kaynak belirtmek olmadıysa söyleyebilirim Gimpel Yazılım 'ın PCLint muhtemelen C ++ statik kod denetimi için mevcut en iyi araçlardan biridir. Ancak, elbette, açık kaynak değildir.

Mac OS X:

brew install splint

2
Ama tek bir geliştirici için pahalı :) Ben daha iyi ücretsiz seviyorum
Robert Gould

6
atel C ++ için değil C içindir. Kapsamı genişletmeyi planlayıp planlamadıklarını bilmiyorum. Umarım!
Harold Bamford

Evet, denemeye değer pclint, unix'deki karşı kısmı flexe-lint olarak adlandırılır, 9.0 sürümü daha hızlı olmalıdır 8.x sürümü, 9.0 sürümü de analiz hızlandırmak için önceden derlenmiş üstbilgiyi destekler. Pc-lint'i evcilleştirmeniz zaman alır, seçici olarak görmezden gelemiyorsanız sizi rahatsız edebilecek yanlış pozitiftir.
zhaorufei

3

Microsoft PREFast , Windows Sürücü Seti'nde de bulunmaktadır. Sürüm 7.0 buradan indirilebilir .

Microsoft belgeleri, yalnızca sürücü koduna karşı çalıştırılması gerektiğini belirtir, ancak bu (eski) blog gönderisi , onu çalıştırmak için adımlar atar. Belki de normal bir inşa sürecine entegre edilebilir?


PREFast, oluşturma sürecinizi çok yavaşlatacaktır, herhangi bir gerçek proje için yapı sunucunuz bunu karşılayamayabilir.
zhaorufei

@zhaorufei: Çoğu statik analiz "hızlı" değildir; tanım olarak yapmak için oldukça karmaşık bir kod analizi işi var. Yapı maliyetini her zaman sevmiyorsanız, isteğe bağlı yapın.
Ira Baxter

2

Metrikülatör adı verilen bir Eclipse CDT eklentisi üzerinde çalışıyoruz. Halen geliştirilme aşamasındadır, ancak bazı büyük metrikler (örn. LSLOC, McCabe, EfferentCoupling) zaten uygulanmaktadır.

Video gösterimi ve dokümantasyon gibi daha fazla ayrıntı için http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation sayfasına bakın .

En son gece sürümüne kurulum sitesi üzerinden http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/ adresinden ulaşılabilir.

Daha Fazla Açıklama

Metrikülatör C ++ kaynak kodunu statik olarak analiz eder ve yazılım metrikleri üretir. Metrikler Codan denetleyicisi olarak uygulanır. Analiz sonuçları ayrı bir görünümde incelenebilir. Her metriğin yapılandırılabilir özellikleri vardır (örneğin, 'işlev başına maksimum kod satırı' için bir eşik). Bu eşiği aşmak bir sorun bildirecek ve kaynak kodu düzenleyicisinde bir işaretleyici oluşturacaktır.

metrikülatör ile şunları yapabilirsiniz:

  • C ++ dosyalarını / klasörlerini / projelerini analiz etme
  • Codans tercih sayfasını kullanarak metrik eşiklerini tanımlayın ve metriği etkinleştirin / devre dışı bırakın
  • kaynak kodu düzenleyicilerinde sorunlu işaretçiler bulundurmak
  • metrik sonuçları keşfedin
  • metrik sonuçlarını etiket bulutu olarak dışa aktarma (güncelleme sitesi aracılığıyla isteğe bağlı özellik olarak sunulur)

Şu anda metrikülatör aşağıdaki metriklerle geliyor:

  • McCabe (Siklomatik Karmaşıklık)
  • Tür Başına EfferentCoupling
  • Mantıksal Kaynak Kodları
  • Tür Başına Üye Sayısı
  • İşlev Başına Parametre Sayısı

1

Xemacs ile harika bir entegrasyona sahip oo-tarayıcıyı denemelisiniz


1

Ayrıca , bazı özel analizler yapmak için MELT'deki GCC uzantılarını (GCC'yi genişletmek için tasarlanmış alana özel bir dil) veya C'deki GCC eklentilerini (çok daha zor) kodlayabilirsiniz .


2
MELT ile ilgili PDF'den birini okudum ve gcc'yi eriyikle genişlettikten sonra, hissim gcc'ye kendi eklentilerinizi eklemenin hala çok karmaşık / zor olduğu. Sıradan kullanıcı için pratik bir yol değildir.
zhaorufei

1
GCC'yi genişletmek karmaşıktır, her ne şekilde yaparsanız yapın (C eklentileri, MELT veya Python aracılığıyla). Bunun nedeni GCC'nin karmaşık olmasıdır. C ++ dil belirtimi çok karmaşık olduğundan ve herhangi bir C ++ statik analiz aracını özelleştirmek zordur ve bu karmaşıklığın çoğunu ele almanız gerekir (önemsiz olmayan C ++ programları, belki de C ++ standart kitaplığı aracılığıyla çok sayıda C ++ özelliği kullanır) .
Basile Starynkevitch

0

Doxygen bazı akış analizlerini kontrol eder ve grafikler üretir. Bunlar aradığınız şey olmayabilir, ancak bakmak için onlara yardımcı oldum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.