Statik kod analizi ve kod incelemesi arasındaki fark nedir?


9

Sadece statik kod analizi ve kod incelemesi arasındaki farkın ne olduğunu bilmek istedim. Bu ikisinin her biri nasıl yapılır? Daha spesifik olarak, PHP'nin kod incelemesi / statik analizi için bugün kullanılabilecek araçlar nelerdir? Ayrıca herhangi bir dil için kod inceleme için iyi araçlar hakkında bilmek istiyorum.


Kod incelemesi genellikle başka bir programcının kodunuzu gözden geçirdiği manuel bir işlemdir. Kodlama kurallarından vb. Küçük hataları veya sapmaları tespit etmenin ve genel kod kalitesini iyileştirmenin iyi bir yoludur. Statik kod analizi, bir aracı kullanabileceğiniz bir şeydir, ancak bunu hiç yapmadım. Başkalarının cevaplarını görmek ister

9
İki kelimeyle mi? "Beyin".
MSalters

Yanıtlar:


19

Kod incelemesi insanların yaptığı, statik analiz makinelerin yaptığı bir şeydir. (Bazen iyi) statik analiz araçları vardır. Kod incelemesi, bir meslektaşınızın / mentorunuzun / profesörünüzün / arkadaşınızın kodunuzu aşması ve size yapıcı eleştiri vermesidir.

Statik analiz ise, bir makinenin, analiz ettiği dil hakkında bildiklerinden (genellikle tip sisteminden) haberdar olduğu, bir programı analiz ettiği ve yanlış olabilecek şeyleri seçmeye çalıştığı otomatik bir süreçtir, verimsiz, zayıf stil veya başka bir şekilde yetersiz.


2
Her zaman kod inceleme bir tür statik analiz olduğu izlenimi altında bulundum, çünkü bu yazılım yürütmeden sağlığını ölçmek için bir yoldur.
Buhb

4
@Buhb: bağlam hakkında önemli bilgiler ekler. Bir kod inceleyici, kodun yapılması beklenen şeyi yapıp yapmadığını anlamalıdır. Statik bir araç (en iyi, dil bazı dekorasyon / iddia / sözleşme yoluyla izin veriyorsa) resmi olarak her şeyin yolunda olup olmadığını kontrol edecektir ... Yani başka bir şekilde koyabilirsiniz: statik analiz bir tür kod incelemesi, gerçekleştirilen algoritmik.
Francesco

Sadece eklemek için, Lint (statik analist): Dostum bu gerekli değil !! Meslektaşım (Hakemlik): Siz de bu şekilde yapabilirsiniz !!
Kushal

11

Statik analiz, bir yazılımı çalıştırmadan analiz etme işlemidir. Bu çok iyi ve tavsiye edilir, ancak şunu unutmayın:

  1. farklı statik analiz araçları , çalıştıkları kodun farklı bir anlayışına sahiptir, bu nedenle farklı sorunları işaret edebilir (veya göstermeyebilir). Bir araç temiz bir rapor verebilir, diğeri ise bir milyon şeyden şikayet edebilir.
  2. dinamik bir araç (bir örnek vermek gerekirse, valgrind'i düşünün), kaynak tüketimi (zaman, bellek kullanımı) üzerinde ciddi bir yük pahasına birçok başka konu bulabilir. Bunun nedeni genellikle yazılımın enstrümanlı bir versiyonunu çalıştırmanızdır. Bir şekilde araç haline getirerek (malloc'unuzu bir hata ayıklama malloc ile değiştirin), yazılımınızla tam olarak aynı olmadığına dikkat edin (yürütme sürelerinden görebileceğiniz gibi)

Bu yaklaşımların her ikisi de bağlam eksikliğinden muzdariptir: SW'nin neyi başarması gerektiğini bilmiyorlar.

Kod incelemesi, sözde onu bilen ve kontrol edebilen başka bir kodlayıcı tarafından yapılır.

  1. kod doğruysa
  2. yazılım anlamsal olarak doğru ise.

Çok daha pahalıdır ve değişen bir tekrarlanabilirlik derecesine sahiptir, ancak çok yardımcıdır.

Her zaman olduğu gibi, tüm hataları giderecek ve tüm sorunları önleyecek tek bir gümüş mermi yoktur. Uygulama - yer, kod, zaman, üç kontrol şekli (statik, dinamik, koda gerçekten bakan daha fazla göz (ve beyin)) göz önüne alındığında mümkün olduğunca önerilir.

ps: Araçları sıfırdan uygulamanın genellikle çok daha iyi olduğunu belirtmeliyim. Eski bir sistemi dönüştürmek, yanlış pozitifler nedeniyle çok daha az zevkli bir deneyimdir. Sıfırdan başlar ve her zaman analiz aracını temiz tutmayı hedeflerseniz, muhtemelen birçok sorundan kaçınacaksınız.

pps: araçlar için olduğu gibi, dile bağlıdır. C ve C ++ dünyasında, yerleşik bir statik analiz aracı içeren Visual Studio'nun kendisine bakarak başlayabilirsiniz. Vikipedi'de nispeten tam bir liste bulunabilir.

ppps: Statik analiz, C veya C ++ gibi statik diller için daha uygundur. Python için, bir noktada bir listeye başvuran bir adın, dinamik özellikleri nedeniyle programın geri kalanı için bir listeye işaret edip etmeyeceğini söylemek gerçekten zor olabilir. Bu, PyPy'nin gösterdiği gibi bir JIT çabasının gösterdiği gibi hiçbir şeyin yapılamayacağı anlamına gelmez .


2

Kod İnceleme, bir kıdemli veya özel bir otoritenin kodunuzu, kodlama yönteminizi, kodda izlenen standartları ve özellikle kodun mantık seviyesini kontrol ettiği zamandır.

Statik analiz söz konusu olduğunda, bu yazılımdan oluşturulan programları gerçekten yürütmeden gerçekleştirilen bilgisayar yazılımının analizi (programların yürütülmesi üzerinde yapılan analiz dinamik analiz olarak bilinir)

Teknolojiye göre araçların listesi aşağıdaki linkte verilmiştir

Statik Analiz Araçlarının Listesi

Bu nedenle kod incelemesi ve statik analiz tamamen farklı terimlerdir.


7
OM'nin yanıtı, 'Bir Kıdemli veya Adanmış Bir Otorite kodunuzu kontrol eder ...' ile tartışmam dışında, doğrudur. Bazı işlevsiz dükkanların bu ebeveyn / çocuk tarzında kod incelemeleri yürüttüğü doğrudur, birçok (ve daha iyi) dükkan, bir ev ödevi notunu not eden bir öğretmene benzemeyen eşler arası kod inceleme sistemine sahiptir. Çalıştığım yerde bir yetişkinin bir yetişkinin çalışmasını gözden geçirmesi aynı derecede yaygındır. Amaç, kontrol edilmeden önce ikinci bir gözün tüm koda bakmasını sağlamaktır.
Jim In Texas

2
@JimInTexas, mağazamızda aynı. Kod incelemelerinin en önemli (uzun vadeli) sonucunun, bilgi, birleştirici uygulamalar ve mimari / tasarım vizyonunu ekip boyunca yaymak olduğunu söyleyebilirim. Bu bağlamda, bir kıdemli kodunu gözden geçiren bir çocuk, en iyi yerel en iyi uygulamaları öğrenmenin en kötü yoludur - ancak bir kıdemli asla hata yapmaz ve bir çocuk bunları asla tespit edemez?
Péter Török

1

Kod incelemesi daha nitel bir değerlendirme, statik kod analizi daha nicel bir değerlendirmedir.

Hey, oğlum, bu yöntem daha iyi yazılabilir

vs, fe

Düşük performans. 'Wcslen (str)> 0' yapısı kullanılarak boş bir dizeyi tanımlamak verimsizdir. Daha etkili bir yol kontrol etmektir: str [0]! = '\ 0'.

Düşük performans. Strlen (MyStr.c_str ()) türünün ifadesi MyStr.length () olarak yeniden yazılabilir

Düşük performans. 'Sipariş' yineleyici ise, önek artış şeklini kullanmak daha etkilidir. İterator ++ 'ı ++ iterator ile değiştirin.

İken gerçek hatalar (tabii ki) var olabilir ve SCA tarafından algılanabilir

Yanlış biçim. 'Foo' fonksiyonunun N gerçek argümanını kontrol etmeyi düşünün

İfade iki kez parantez içine alınmıştır: ((ifade)). Bir çift parantez gereksiz veya yanlış baskı var

'Memset' işlevinin çağrılması, 'dest.lfFaceName' ara belleğinin taşmasına neden olur.


sana hakaret ettiğim için üzgünüm. Benim (kayboldum?) Yorumumun ne demek istediği kadar - bir insanın statik kod analizinden çıktı örnekleri olarak sağladığınız aynı yorumları sunamamasının bir sebebini biliyor musunuz?
sq33G

@ sq33G: Hayır. Ofis malzemeleri olan herkes (neredeyse sonsuz miktarda kağıt) keyfi Turing makinesini taklit edebilir. Ancak sıkıcı ve zaman alıcıdır. (Muhtemelen verilen değil, C'de tanımlanmamış davranışlar söyleyin).
Maciej Piechotka

Ah. Bu nedenle OP'nin sorusuna gerçek cevap Turing makinelerinin insan eksiksiz olmadığıdır.
sq33G

0

Statik analiz, bir artefakt yürütülmeden analiz edilir. Herhangi bir esere uygulanabilse de, genellikle kaynak koduna veya nesne koduna uygulanır ve bu iş ürünlerini analiz etmek ve bu ürünler hakkında bilgi edinmek için belirli araçların kullanımını ifade eder. Bu araçlar, bir mühendis tarafından yapım aşamasında sistemin kalitesini belirlemede kullanılmak üzere yorumlanan ve geliştirme ve bakım planlaması için bir kılavuz olarak raporlanan raporlar üretir. Wikipedia, dile göre düzenlenmiş ve yeteneklerinin kısa bir açıklamasıyla birlikte statik analiz için bir araç listesine sahiptir .

Yorumlar, kod olabilecek bazı iş ürünlerinin insan değerlendirmesidir. İncelemeler ayrıca tasarımlar veya diğer belgeler üzerinde de yapılabilir. Fikir, geliştirici dışındaki iş ürününe aşina olan kişilerin, güvenlik sorunlarından kodlama standardının ihlallerine kadar çeşitli hataları bulmak için ona baktığıdır.

Teknik olarak, kod gözden geçirme sırasında kod gerçekte yürütülmediğinden, kod incelemesi bir statik analiz biçimi olarak düşünülebilir. Bununla birlikte, yaygın terminolojide, "statik analiz" tipik olarak kaynak veya nesne dosyalarının makine ayrıştırılması anlamına gelirken "inceleme", analizi yapan insanların olduğunu belirtir.


-2

Kod incelemesi, kaynak koddaki sorunları çok erken aşamada koklamak için yararlı bir tekniktir. Bu alıştırmanın bir parçası olarak, performans, ölçeklenebilirlik ve kodlama standartları gibi birçok konu tanımlanmış ve düzeltilmiştir. Bu kod kalitesini artıracaktır.

Statik analiz, siklometrik karmaşıklık, sürdürülebilirlik endeksi, kalıtım derinliği ve sınıf kaplinleri gibi kod kalitesi metriklerini analiz etmek için kullanılır. Kod kalitesini analiz etmek için piyasada bulunan çeşitli araçlar. C # geliştiricisi metrik raporlar oluşturmak için Microsoft Visual Studio'yu kullanır.


-3

statik kod analizi otomatik araç tarafından yapılır, kodun işlenmesinden önce kod gözden geçirme işlemi insanlarla yapılır.

Kod incelemesi için araçlar:

1. karşılaştırmanın ötesinde

2. sürüm kontrol yazılımının farkı

Bu araçlar her zaman eski sürüm ile yeni sürüm arasındaki farkı oluşturmak için kullanılır.


2
1) Kod işlenmeden önce olmak zorunda değildir - kod incelemesi insanlar tarafından yapılır ve 2) diff inceleme araçlarının kod inceleme araçları "ilginç" olarak tanımlanması kesinlikle inceleme için kodu tanımlamak için kullanılan araçlardır, ancak Muhtemelen süreci yönetmeye yardımcı olanlara işaret edeceğim kod inceleme araçları hakkında bana sorulmuştur (örneğin Fırın ve Pota kullandım).
Murph
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.