Java Programlama Dili: Statik Analizle Sıfır Hatalar Bulun

Portakalkafa

Global Mod
Global Mod


  1. Java Programlama Dili: Statik Analizle Sıfır Hatalar Bulun

Yeni projeler yeni zorluklar ve yeni bilgiler sunuyor. Mevcut projemde, son zamanlarda statik kodun analizinde sıfır kontrol yönetimi tanımı oluşturdum. Projedeki birçok kişi için parametrelerin yalnızca çalışma zamanında değil, örneğin Objects.requireNonNull(…)) kontrol edilebilir, ancak doğrudan doldurulurken. Bu nedenle, yönetimi doğrulamak için statik kodun analizi üzerine buradan da karar verdik. null Ayarlamak.








Hendrik Advers (@hendrikebbers), JCP uzman grubunun bir üyesi olan Java'nın şampiyonu ve farklı Javaone rock yıldızı hoparlörleri aldı. Kendi açık unsurları şirketi ile Hendrik şu anda Hedera Hashgraph'ı tasarlamaya ve hizmetlerini halka açık hale getirmeye yardımcı oluyor. Hendrik aynı zamanda Juug Dortmund ve Cyberland tarafından ve tüm dünyada Java teması hakkında dersler ve seminerler düzenliyor. “Mastering JavaFx 8 Controls” adlı kitabı 2014 yılında Oracle Press tarafından yayınlandı. Hendrik, TSC Emptopenjdk ve Eclipse WG benimseyenlerin bir üyesidir.







Statik kodun analizi


Bizi Java için değişen ek açıklama ve mevcut kontrol kütüphanelerine daldırmadan önce, statik kodun bir analizinin ne olduğunu kısaca açıklamak istiyorum. Program kodu derleme sırasında bir enstrüman tarafından kontrol edilir. Java'daki şu anda yaygın araç kesinlikle Maven veya Gradale ile yapı ile entegre edilebilen ve sonuçları Sonarchud gibi platformlarda otomatik olarak yayınlanabilen Spotbugs'tur. Statik kodun bir analizi ile bellek taşması, sonsuz bir döngü veya “dışarı çıkma” hatası gibi sorunlar bulabilirsiniz. Basit bir örnek 0 üzerinden bir bölümdür. Kodda böyle bir şey meydana gelirse, analiz bir bildirim sağlayabilir veya yapılandırmaya bağlı olarak başarısızlık olabilir. Projemizde, GitHub eylemlerinde, doğrudan SonerCloud'daki sonuçları ve çekme talebini gösteren böyle bir kontrole sahibiz.

Sıfırın doğru yönetimi


Java ile programlama ile ilgili bir sorun kesinlikle null. Şahsen açıkça inansam bile null Onun gerekçesi, Tony Hoare olsa bile, programlamada sıfır referansın mucitleri

Bununla birlikte, Java'da bir parametre sıfırsa doğal olarak tanımlamak mümkün değildir. Bu şimdi sınıf kütüphanesindeki çeşitli araçları çözmeye çalıştı. Bunun örnekleri java.util.Optional,, Objects.requireNonNull(…) Hatta JSR305.

Kotlin, sıfır referanslar için yerel desteğe sahip bir programlama dilinin açık bir örneğidir. NULL referansları ve ütüsiz referanslar arasında açıkça ayrım yapar. İkincisi burada standarttır, bu nedenle bu referansa sahip bir değişken asla sıfır atanamaz. Sıfır içerebilecek bir değişkene ihtiyacınız varsa, bir temizleme referansı ile çalışmanız gerekir. Bu ? İmzalı karakterler. Aşağıdaki kod, her iki referans için bir Kotlin örneği içerir:


var a: String = "abc" // Regular initialization means
// non-null by default
a = null // compilation error

var b: String? = "abc" // can be set to null
b = null // ok


Java'da yerel bir destek olmadığından, statik kodun analizi yoluyla mümkün olduğunca entegre etmeye çalışır. Genel olarak, burada iki ek açıklama gerekir (@Nullable) bir değerin veya bir değişkenin sıfır olabileceğini ve diğer ek açıklama, bir değerin veya değişkenin asla sıfır olmaması gerektiğini tanımlar (@NonNull).

Anlamak için bir kod, bir yöntemi tanımlayan ve açıklama ve ek açıklama ile yönteme bilgi ekleyen bir örnek vermelidir. null Olabilir:


@NonNull String getName() {
if(isUnique()) {
return „Item „ + getId();
} else {
return null;
}
}


Yöntemin uygulanmasında görebileceğiniz gibi, null geri gelmek. Statik kodun analizinin bir yaralanma gösterdiği bir durum olacaktır. Örneğin, Intellij'i bu sorunları doğrudan belirtecek şekilde yapılandırmak mümkündür.

Aşağıdaki kod @Nullable Kullanılan ek açıklama, analizde bir uyarıya yol açar:


void check(@Nullable String value) {
Objects.hash(value.toLowerCase());
}


Bu örnekte ek açıklama @Nullable Değişken için value Bu değeri tanımlar null Sahip olabilir. Kodun değişkeye erişmesi doğrudan potansiyel olarak bir NullPointerException yürütme aşamasında. Bu, statik kodun analizi ile de değerlendirilecek ve bir sorun olarak yayınlanacaktır.

Projenizdeki kurulum


Projenizde bu kadar statik kodun bir analizini entegre etmek istiyorsanız, bazı basit koşullar oluşturmalısınız. Her şeyden önce, bir veya daha fazla analiz aracı seçmelisiniz. Burada Findbugs'un halefi olan Spotbugs'u öneriyorum. Araç komut satırı üzerinden başlatılabilir veya bir dereceye veya yapı mavenine entegre edilebilir. Karşılaşılan sorunları analiz etmek için, Spotbug Swing istemcisinde onlara bakabilirsiniz veya örneğin, Maven tarafından üretilen bir Maven sitesinin bir parçası olarak HTML'ye dayanan bir genel bakış olarak site-Ziels. Aracı, bir sonar veya sonarcloud üzerindeki sonuçların yüklenmesi için yapılandırmak mümkündür.

DSÖ @Nullable– VE @NonNull-Projedeki ve projedeki ilanlar ek açıklama sağlayan bir kütüphane kullanmak istiyor. Projeniz yalnızca derleme döneminde kütüphaneye bağlı olmalıdır. Burada da (ne yazık ki) ek açıklamalar sağlayan tüm kütüphanelerin zenginliği var. Bireysel kütüphanelerin avantajlarına ve dezavantajlarına göre aydınlatılması görevlerinin bir parçası olacaktır. Bu nedenle, her şeyden önce, Spotbug'un ek açıklamalarını aşağıdaki Maven koordinatları altında bulunabilecek bağımlılık olarak öneriyorum:


<dependency>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-annotations</artifactId>
<version>4.7.3</version>
</dependency>


Ne yazık ki, araçların ve kütüphanelerin bolluğu, mükemmel ve gelecekteki kombinasyonu bulmanızı kolaylaştırmaz. Konuda daha derin olduğumda, bu alandaki çok şey henüz kullanılan standartlar veya en iyi uygulamalar tarafından tanımlanmadığından korkuyordum. Burada Demjsr305 gibi birkaç yaklaşım oldu, ancak bir noktada bunlar her zaman kuma gitti ve şimdi vahşi bir karışımda kullanıldı. Bu yüzden postamı yakın gelecekte bu soruna da ayıracağım.


(RME)
 
Üst