Statik kod analizinin gerçek faydaları nelerdir?


18

Pc-lint veya QAC gibi araçlar , bir kod tabanı üzerinde statik kod analizi yapmak için kullanılabilir.

Deneyimlerime göre, statik analiz genellikle büyük miktarda gürültü, yani gerçek böcek olmayan ancak belirli bir kural kümesindeki kurallardan birini ihlal eden şeylerle ilgili uyarılar verir. Belirli kuralları kapatmak (kural kümesinde iyi olmak için veya koddaki özel yorumlar yoluyla) gerçek bir külfetli süreç olabilir.

Statik kod analizinin gerçek faydaları nelerdir?

Yanıtlar:


17

Coverity Prevent adlı ticari bir statik kod analiz sistemi kullanılan bir yerde çalıştım ve şaşırtıcıydı! Gerçekten sofistike ve akıllı.

Yaklaşık 18 GB'lık hem açık kaynaklı hem de tescilli C ve C ++ kodunu attık ve kod yollarını izleyecek ve bir insanı sonsuza dek izlemesi gereken ince hataları hızlı bir şekilde bulacaktır. Genellikle Heisenbugs olacak şeyleri saptamak da harikaydı.

Her birkaç günde bir kod tabanımıza karşı koştu ve güzel bir özellik, "Bu gerçekten bir hata değil" diyebiliriz ve gelecekte bunu hatırlardı.

Anladım, Coverity gerçekten pahalı. Maliyetleri yayınlamıyorlar, ancak ticari projeler için bunun yılda yüz binlerce dolar ile başladığını hissediyorum. Ama muhtemelen bize bir sürü geliştiriciler ve QA personel kiralamak zorunda kurtardı, bu yüzden tüm bizim yönetim iyi bir satın olduğunu düşünüyorum gibiydi.

Bu deneyimi yaşadım, statik kod analizine oldukça olumlu bakıyorum.


2
Coverity kLOC tarafından tahsil edildiğine inanıyorum.
Paul Nathan

1
kLOC veya takım büyüklüğü
StingyJack


7

Yeni bir dil ile başlarken bir koç olması güzel. Statik analiz araçlarını bu şekilde düşünüyorum. Çok fazla javascript yazıyorum ve başlangıçta bazı şeyleri eski dillerden aktardığım için birkaç kötü alışkanlık aldım. Javascript oldukça esnektir, bu yüzden hemen hemen her şeyden kurtulabilirsiniz, ancak jslint'i bazı desenler hakkında uyarsaydım, daha sonra yeniden bir şeyler öğrenmek zorunda kalmadan daha iyi kodlama desenleri alırdım.


6

Statik analizörler temel olarak makine destekli kod incelemeleridir. Düzenli test sırasında gözden kaçırılabilecek şüpheli alanları işaret edecekler.

Örneğin, yazar gerçekten bu şartta bir ödev yapmak istedi mi?

if (x = 1) {
    ...
}

Ya da belki bir çaylak sözlüksel dökümü karıştırır:

char* number = "123";
int converted = number;

Kesinlikle statik analizörler ince ayar gerektirir. Daha sonra, revizyon kontrolü, wiki'ler, hata izleyiciler, güzel yazıcılar ve diğer araçlar da bazı kurulumlar gerektirir. Proje ne kadar büyük olursa, ilk emeğin ödülü o kadar iyi olur.


5

Bir danışmanın bakış açısından, her statik analiz aracı bir miktar gürültüye sahip olacaktır, ancak tüm statik analizörler eşit yaratılmayacaktır. Coverity, Klocwork, Grammatech gibi statik analiz araçları, daha doğru sonuçlar vermesi gereken iyi analiz tekniklerine sahiptir. Biraz daha ayarlar ve ayarlarsanız tipik olarak daha iyi sonuçlar alırsınız (sonuçta, statik analizörlerin küçük bir tıbbi cihazdan bir ağ işletim sistemine kadar tüm farklı kod türlerinde çalışabilmesi gerekir). "Gürültü" tanımlaması, düzeltilmeye değer bir raporun ne olduğuna ilişkin ölçütlerinize de bağlıdır. Spektrumun bir ucunda, bazı geliştiriciler düzeltmedikleri tüm raporları "yanlış" (düzeltmek için zamanları olmayan kötü yazılmış kodlar bile) olarak işaretler ve diğer ucunda,

Bu araçların bazıları daha merkezi analiz odaklı, diğerleri ise daha fazla masaüstü odaklıdır - üçünün de her ikisini de destekleyen özellikler vardır. @Bob'un belirttiği gibi, paraya mal olurlar.


4

Önceki şirketimde Parasoft'un statik analizörünü kullandık. Takım içinde, çalışma zamanı hatalarının en az% 60'ının derlemeden önce yakalandığına inanılıyordu.


2

Statik analiz, yazılım kodu üzerinde manuel incelemeler yaparak aletsiz de yapılabilir. Bu genellikle kod kalitesini artırmanın en uygun maliyetli yoludur.

İkinci en iyi seçenek, bir veya daha fazla üst düzey statik analiz aracına (daha önce bahsedilen Coverity veya KLOCwork gibi) yatırım yapmaktır. Bu araçlar tiftikten çok daha derin analizler gerçekleştirdiğinden, örneğin sinyal-gürültü oranı çok daha iyidir.

Yüksek gürültü seviyesi nedeniyle tiftiği üçüncü seçenek olarak görüyorum. Mevcut bir projeye tiftik uygulamak göz korkutucu bir görev olabilir.

Genel olarak, statik program analizi son yıllarda çok ilerlemiştir. Mevcut statik analiz araçları, prosedürler öncesi ve sonrası prosedürü otomatik olarak tanımlayabilen derin prosedürler arası analizler yapabilir. Bu, daha sonraki kod incelemeleri için de büyük bir yardımcı olabilir.


1

Yüksek yanlış pozitif oranı nedeniyle, her derleme için statik bir analiz aracı (lif veya FindBugs gibi) kullanmamalısınız.

Aksine, bir hata olduğunda ve bunu anlayamadığınızda danışmak güzel bir akıl sağlığı kontrolüdür . Bu durumda, yanlış pozitifleri eğlendirebilirsiniz ve hatanın olası kaynaklarını zaten daraltmış olabilirsiniz. Örneğin, hatalarınızı bazı modül yürütmeden bile yeniden oluşturursanız, FindBugs'un onlar için söylediklerini göz ardı edebilirsiniz. Bir kod parçasına bakarken ve bir şey söylediğini düşünürken bu özellikle yararlıdır , derleyici bunu tam anlamıyla okur (örneğin equals, sınıfın türünü alan bir yönteminiz olduğunda Java gibi Object).

Statik analiz araçlarının geliştirme sürecinizin bir parçası olmasını da sağlayabilirsiniz: Bir geliştirici kod incelemesi aldığında, üzerinde FindBugs çalıştırmalıdır. Kısacası, yararlıdır, ancak derleyici veya metin düzenleyicisi kadar sık ​​kullanmazsınız.


1
Buna karşı çıkardım. Bu anekdottur ve eminim eski / büyük projelerde daha kötüdür, ancak gürültüyle sıralama o kadar da kötü olmamıştır. PC-lint'i çok sayıda yanlış pozitif üreten ve daha sık çalıştıran tetikleyicileri görmezden gelmek için ayarladım (ve daha sonra daha az sıklıkta çalıştırıyorum). Ne kadar uzun beklerseniz - o kadar kötü olacak!
Frederick
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.