Statik analiz - girişten entegrasyona

Sonsuz kod incelemesinden veya hata ayıklamaktan bıktınız, bazen hayatınızı nasıl basitleştireceğinizi düşünüyorsunuz. Ve biraz araştırdıktan sonra ya da kazara ona rastladığınızda şu sihirli ifadeyi görebilirsiniz: "Statik analiz." Gelin bunun ne olduğunu ve projenizle nasıl etkileşime girebileceğini görelim.

Statik analiz - girişten entegrasyona
Aslında herhangi bir modern dilde yazıyorsanız, farkına bile varmadan onu bir statik analizciden geçirmiş olursunuz. Gerçek şu ki, herhangi bir modern derleyici, küçük de olsa, koddaki olası sorunlar hakkında uyarılar sağlar. Örneğin, Visual Studio'da C++ kodunu derlerken aşağıdakileri görebilirsiniz:

Statik analiz - girişten entegrasyona
Bu çıktıda değişkenin olduğunu görüyoruz. var fonksiyonun hiçbir yerinde kullanılmadı. Yani gerçekte neredeyse her zaman basit bir statik kod analizörü kullandınız. Ancak Coverity, Klocwork veya PVS-Studio gibi profesyonel analizörlerin aksine, derleyici tarafından sağlanan uyarılar yalnızca küçük bir sorun aralığına işaret edebilir.

Statik analizin ne olduğunu ve nasıl uygulanacağını kesin olarak bilmiyorsanız, bu makaleyi okuBu metodoloji hakkında daha fazla bilgi edinmek için.

Neden statik analize ihtiyacınız var?

Özetle: hızlandırma ve basitleştirme.

Statik analiz, kodda birçok farklı sorunu bulmanızı sağlar: dil yapılarının yanlış kullanımından yazım hatalarına kadar. Örneğin, bunun yerine

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Aşağıdaki kodu yazdınız:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Gördüğünüz gibi son satırda yazım hatası var. Örneğin PVS-Studio aşağıdaki uyarıyı verir:

V537 'Y' öğesinin kullanımının doğruluğunu gözden geçirmeyi düşünün.

Bu hatanın farkına varmak istiyorsanız Compiler Explorer'da hazır bir örnek deneyin: *tıklayın*.

Ve anladığınız gibi, kodun bu tür bölümlerine hemen dikkat etmek her zaman mümkün değildir ve bu nedenle, her şeyin neden bu kadar tuhaf çalıştığını merak ederek bir saat boyunca hata ayıklamaya oturabilirsiniz.

Ancak bu açıkça bir hatadır. Peki ya geliştirici dilin bazı inceliklerini unuttuğu için optimal olmayan kod yazdıysa? Hatta kodda buna izin verildi tanımlanmamış davranış? Ne yazık ki, bu tür durumlar tamamen yaygındır ve zamanın aslan payı, özellikle yazım hataları, tipik hatalar veya tanımsız davranışlar içeren çalışan kodlarda hata ayıklamak için harcanmaktadır.

Bu durumlar için statik analiz ortaya çıktı. Bu, geliştiricinin koddaki çeşitli sorunlara işaret edecek ve belgelerde neden bu şekilde yazmanın gerekli olmadığını, neye yol açabileceğini ve nasıl düzeltileceğini açıklayacak bir asistanıdır. İşte neye benzeyebileceğine dair bir örnek: *tıklayın*.

Analizörün tespit edebileceği daha ilginç hataları makalelerde bulabilirsiniz:

Artık bu materyali okuduğunuza ve statik analizin yararlarına ikna olduğunuza göre denemek isteyebilirsiniz. Peki nereden başlamalı? Yeni bir aracı mevcut projenize nasıl entegre edebilirsiniz? Peki ekibi ona nasıl tanıtabilirim? Bu soruların cevaplarını aşağıda bulacaksınız.

Not. Statik analiz, kod incelemeleri gibi yararlı bir şeyin yerini almaz veya iptal etmez. Bu süreci tamamlayarak yazım hatalarının, yanlışlıkların ve tehlikeli tasarımların önceden fark edilmesine ve düzeltilmesine yardımcı olur. Yanlış yerleştirilmiş bir parantez veya kodu aramak yerine, algoritmalar ve kod netliği ile ilgili kod incelemelerine odaklanmak çok daha verimlidir. sıkıcı karşılaştırma işlevlerini okuyun.

0. Aracı tanıma

Her şey deneme sürümüyle başlar. Aslında, aracı daha önce canlı olarak görmediyseniz, geliştirme sürecine bir şey uygulamaya karar vermek zordur. Bu nedenle yapmanız gereken ilk şey indirmektir. Deneme sürümü.

Bu aşamada öğrenecekleriniz:

  • Analizörle etkileşim kurmanın yolları nelerdir;
  • Analizör geliştirme ortamınızla uyumlu mu?
  • Şu anda projelerinizde ne gibi sorunlar var?

İhtiyacınız olan her şeyi yükledikten sonra yapmanız gereken ilk şey, tüm projenin analizini yapmaktır (Windows, Linux, macOS). Visual Studio'daki PVS-Studio durumunda benzer bir resim göreceksiniz (tıklanabilir):

Statik analiz - girişten entegrasyona
Gerçek şu ki, statik analizörler genellikle büyük kod tabanına sahip projeler için çok sayıda uyarı yayınlıyor. Projeniz zaten çalıştığı için hepsini düzeltmeye gerek yok, yani bu sorunlar kritik değil. Sen yine de en ilginç uyarılara bakabilirsiniz ve gerekirse bunları düzeltin. Bunu yapmak için çıktıyı filtrelemeniz ve yalnızca en güvenilir mesajları bırakmanız gerekir. Visual Studio için PVS-Studio eklentisinde bu, hata düzeylerine ve kategorilere göre filtreleme yoluyla yapılır. En doğru çıktı için yalnızca bırakın Yüksek и genel (ayrıca tıklanabilir):

Statik analiz - girişten entegrasyona
Aslında 178 uyarıyı görüntülemek birkaç bin uyarıyı görüntülemekten çok daha kolaydır...

Sekmelerde Orta и Düşük Genellikle iyi uyarılar vardır, ancak bu kategoriler daha az doğruluğa (güvenilirliğe) sahip olan teşhisleri içerir. Uyarı düzeyleri ve Windows altında çalışma seçenekleri hakkında daha fazla bilgiyi burada bulabilirsiniz: *tıklayın*.

En ilginç hataları başarıyla gözden geçirmiş olmak (ve bunları başarıyla düzeltmiş olmak), kalan uyarıları bastır. Yeni uyarıların eskilerin arasında kaybolmaması için bu gereklidir. Ek olarak, statik analizör programcının asistanıdır ve bir hata listesi değildir. 🙂

1. Aвтоматизация

Tanıştıktan sonra eklentileri yapılandırmanın ve CI'ya entegre etmenin zamanı geldi. Bu, programcılar statik analiz cihazını kullanmaya başlamadan önce yapılmalıdır. Gerçek şu ki, programcı analizi etkinleştirmeyi unutabilir veya bunu hiç yapmak istemeyebilir. Bunu yapmak için, test edilmemiş kodun genel geliştirme dalına girmemesi için her şeyin son kontrolünü yapmanız gerekir.

Bu aşamada öğrenecekleriniz:

  • Araç hangi otomasyon seçeneklerini sağlar;
  • Analizör montaj sisteminizle uyumlu mu?

Mükemmel dokümantasyon mevcut olmadığından bazen yazmanız gerekir. destek. Bu normaldir ve size yardımcı olmaktan mutluluk duyarız. 🙂

Şimdi sürekli entegrasyon (CI) hizmetlerine geçelim. Herhangi bir analizör ciddi bir sorun olmadan bunlara uygulanabilir. Bunu yapmak için işlem hattında genellikle derleme ve birim testlerinden sonra bulunan ayrı bir aşama oluşturmanız gerekir. Bu, çeşitli konsol yardımcı programları kullanılarak yapılır. Örneğin, PVS-Studio aşağıdaki yardımcı programları sağlar:

Analizi CI'ya entegre etmek için üç şey yapmanız gerekir:

  • Analizörü kurun;
  • Analizi çalıştırın;
  • Teslim edilen sonuçlar.

Örneğin, PVS-Studio'yu Linux'a (Debian tabanlı) kurmak için aşağıdaki komutları çalıştırmanız gerekir:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

Windows çalıştıran sistemlerde analizörü paket yöneticisinden kurmanın bir yolu yoktur ancak analizörü komut satırından dağıtmak mümkündür:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

PVS-Studio'nun Windows çalıştıran sistemlere dağıtımı hakkında daha fazla bilgi edinebilirsiniz *burada*.

Kurulumdan sonra analizi doğrudan çalıştırmanız gerekir. Ancak bunu yalnızca derleme ve testler geçtikten sonra yapmanız önerilir. Bunun nedeni statik analizin genellikle derlemeden iki kat daha uzun sürmesidir.

Başlatma yöntemi platform ve proje özelliklerine bağlı olduğundan, örnek olarak C++ (Linux) seçeneğini göstereceğim:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

İlk komut analizi gerçekleştirecek ve ikinci komut Zarflarraporu metin formatına çevirir, ekranda görüntüler ve uyarı varsa 0 dışında bir dönüş kodu döndürür. Bunun gibi bir mekanizma, hata mesajları olduğunda bir yapıyı engellemek için rahatlıkla kullanılabilir. Ancak bayrağı istediğiniz zaman kaldırabilirsiniz -w ve uyarılar içeren bir derlemeyi engellemeyin.

Not. Metin formatı uygunsuz. Basitçe örnek olarak verilmiştir. Daha ilginç bir rapor biçimi olan FullHtml'e dikkat edin. Kod içerisinde gezinmenizi sağlar.

CI analizini ayarlama hakkında daha fazla bilgiyi "makalesinde okuyabilirsiniz"PVS-Studio ve Sürekli Entegrasyon" (Windows) veya "Travis CI'da PVS-Studio nasıl kurulur" (Linux'ta).

Tamam, analizörü yapı sunucusunda yapılandırdınız. Şimdi, birisi test edilmemiş kod yüklediğinde, doğrulama aşaması başarısız olur ve sorunu tespit edebileceksiniz, ancak bu tamamen uygun değildir, çünkü projeyi şubeler birleştirildikten sonra değil, kontrol etmek daha verimli olur. ondan önce, çekme isteği aşamasında.

Genel olarak, bir çekme isteği analizi oluşturmak, CI'da bir analizin olağan başlatılmasından çok farklı değildir. Değiştirilen dosyaların bir listesini alma ihtiyacı dışında. Bunlar genellikle git kullanılarak dallar arasındaki farklar sorgulanarak elde edilebilir:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Şimdi bu dosya listesini analizöre girdi olarak aktarmanız gerekiyor. Örneğin, PVS-Studio'da bu, bayrak kullanılarak uygulanır. -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Çekme isteklerini analiz etme hakkında daha fazla bilgi edinebilirsiniz *burada*. CI'nız makalede bahsedilen hizmetler listesinde olmasa bile, bu tür analizlerin teorisine ayrılmış genel bölümü yararlı bulacaksınız.

Çekme isteklerinin analizini ayarlayarak, uyarı içeren taahhütleri engelleyebilir, böylece test edilmemiş kodun geçemeyeceği bir sınır oluşturabilirsiniz.

Bunların hepsi kesinlikle iyi, ancak tüm uyarıları tek bir yerde görebilmek istiyorum. Yalnızca statik analizörden değil, aynı zamanda birim testlerden veya dinamik analizörden de. Bunun için çeşitli hizmetler ve eklentiler var. Örneğin PVS-Studio'da SonarQube'a entegrasyon için eklenti.

2. Geliştirici makinelere entegrasyon

Artık analizörü günlük geliştirme kullanımı için kurmanın ve yapılandırmanın zamanı geldi. Bu noktaya gelindiğinde, çalışma yöntemlerinin çoğuna zaten aşina oldunuz, dolayısıyla bu, en kolay kısım olarak adlandırılabilir.

En basit seçenek olarak geliştiriciler gerekli analizörü kendileri kurabilirler. Ancak bu çok zaman alacak ve geliştirme sürecinden uzaklaşacak, böylece bir yükleyici ve gerekli işaretler kullanarak bu süreci otomatikleştirebilirsiniz. PVS-Studio için çeşitli seçenekler mevcuttur otomatik kurulum için işaretler. Ancak her zaman paket yöneticileri vardır, örneğin Chocolatey (Windows), Homebrew (macOS) veya Linux için onlarca seçenek.

Daha sonra gerekli eklentileri yüklemeniz gerekecek, örneğin Visual Studio, IDEA, Binici vb.

3. Günlük kullanım

Bu aşamada analizörü günlük kullanımda hızlandırmanın yolları hakkında birkaç söz söylemenin zamanı geldi. Projenin tamamının eksiksiz bir analizi çok zaman alır, ancak tüm proje boyunca kodu aynı anda ne sıklıkla değiştiririz? Kod tabanının tamamını anında etkileyecek kadar büyük bir yeniden düzenleme neredeyse yoktur. Bir seferde değiştirilen dosya sayısı nadiren bir düzineyi geçer, bu nedenle bunları analiz etmek mantıklıdır. Böyle bir durum için var artımlı analiz modu. Paniğe kapılmayın, bu başka bir araç değil. Bu, yalnızca değiştirilen dosyaları ve bunların bağımlılıklarını analiz etmenize olanak tanıyan özel bir moddur ve eklentinin yüklü olduğu bir IDE'de çalışıyorsanız, oluşturma işleminden sonra bu otomatik olarak gerçekleşir.

Analizci yakın zamanda değiştirilen kodda sorunlar tespit ederse bunu bağımsız olarak raporlayacaktır. Örneğin, PVS-Studio size bir uyarı kullanarak bunu anlatacaktır:

Statik analiz - girişten entegrasyona
Elbette geliştiricilere aracı kullanmalarını söylemek yeterli değil. Onlara bir şekilde bunun ne olduğunu, nasıl olduğunu anlatmalıyız. Örneğin burada PVS-Studio'ya hızlı bir başlangıç ​​hakkında makaleler bulunmaktadır, ancak tercih ettiğiniz herhangi bir araç için benzer eğitimleri de bulabilirsiniz:

Bu tür makaleler günlük kullanım için gerekli tüm bilgileri sağlar ve fazla zaman almaz. 🙂

Aracı tanıma aşamasında bile ilk çalıştırmalardan birinde birçok uyarıyı bastırdık. Ne yazık ki statik analizörler mükemmel değildir, bu nedenle zaman zaman yanlış pozitifler verebilirler. Bunları bastırmak genellikle kolaydır; örneğin, Visual Studio için PVS-Studio eklentisinde yalnızca bir düğmeye tıklamanız yeterlidir:

Statik analiz - girişten entegrasyona
Ancak onları bastırmanın ötesinde daha fazlasını da yapabilirsiniz. Örneğin, bir sorunu desteğe bildirebilirsiniz. Yanlış pozitif düzeltilebiliyorsa, gelecekteki güncellemelerde her seferinde kod tabanınıza özgü hatalı pozitiflerin giderek azaldığını fark edebilirsiniz.

Entegrasyonlar

Böylece statik analizi geliştirme sürecine entegre etmenin tüm aşamalarını geçtik. Bu tür araçları CI'da kurmanın önemine rağmen, bunları çalıştıracak en önemli yer geliştiricinin bilgisayarıdır. Sonuçta bir statik analizci sizden uzakta bir yerde kodun iyi olmadığını söyleyen bir yargıç değildir. Tam tersine yorulduğunuzu söyleyen, unuttuğunuz bir şey varsa hatırlatan bir asistandır.

Doğru, düzenli kullanım olmadan statik analizin geliştirmeyi önemli ölçüde basitleştirmesi pek mümkün değildir. Sonuçta, bir geliştirici için asıl faydası, kodun karmaşık ve tartışmalı bölümlerini aramak değil, bunların erken tespit edilmesidir. Düzenlemeler test için gönderildikten sonra bir sorunun keşfedilmesinin sadece rahatsız edici değil, aynı zamanda çok zaman alıcı olduğunu da kabul edin. Statik analiz, düzenli kullanıldığında doğrudan bilgisayarınızdaki her değişikliğe bakar ve kod üzerinde çalışırken şüpheli yerleri rapor eder.

Siz veya meslektaşlarınız analizörü uygulamaya değip değmeyeceğinden hala emin değilseniz, şimdi makaleyi okumaya başlamanızı öneririm "Statik kod analizörü PVS-Studio'yu geliştirme sürecine dahil etmenin nedenleri". Geliştiricilerin statik analizin zamanlarını alacağı ve benzeri konulardaki tipik endişelerini giderir.

Statik analiz - girişten entegrasyona

Bu makaleyi İngilizce konuşan bir kitleyle paylaşmak istiyorsanız lütfen çeviri bağlantısını kullanın: Maxim Zvyagintsev. Statik Analiz: Başlangıçtan Entegrasyona.

Kaynak: habr.com

Yorum ekle