Kod hatalarını tanımlamak için Intel açık kaynaklı ControlFlag makine öğrenimi sistemi

Intel, kod kalitesini artırmak için bir makine öğrenimi sistemi oluşturmayı amaçlayan ControlFlag araştırma projesiyle ilgili gelişmeleri keşfetti. Proje tarafından hazırlanan araç seti, büyük miktarda mevcut kod üzerinde eğitilmiş bir modele dayanarak, C/C++ gibi üst düzey dillerde yazılan kaynak metinlerdeki çeşitli hata ve anormalliklerin tespit edilmesine olanak tanıyor. Sistem, yazım hatalarından ve hatalı tür kombinasyonlarından işaretçilerdeki eksik NULL değer kontrollerini ve bellek sorunlarını tanımlamaya kadar koddaki çeşitli sorun türlerini tanımlamak için uygundur. ControlFlag kodu C++ dilinde yazılmıştır ve MIT lisansı altında açık kaynaklıdır.

Sistem, GitHub ve benzeri halka açık depolarda yayınlanan açık projelerin mevcut kod dizisinin istatistiksel bir modelini oluşturarak kendi kendine öğreniyor. Eğitim aşamasında sistem, koddaki yapıların oluşturulmasına yönelik tipik kalıpları belirler ve bu modeller arasında programdaki kod yürütme akışını yansıtan sözdizimsel bir bağlantı ağacı oluşturur. Sonuç olarak, analiz edilen tüm kaynak kodların geliştirme deneyimlerini birleştiren bir referans karar verme ağacı oluşturulur.

İncelenmekte olan kod, referans karar ağacına göre kontrol edilen kalıpların belirlenmesine yönelik benzer bir süreçten geçer. Komşu dallarla büyük farklılıklar, kontrol edilen modelde bir anormalliğin varlığını gösterir. Sistem ayrıca yalnızca şablondaki bir hatayı tanımlamanıza değil, aynı zamanda düzeltme önermenize de olanak tanır. Örneğin OpenSSL kodunda sözdizimi ağacında yalnızca 1 kez karşımıza çıkan “(s2 == NULL) ∧ (s8 == NULL)” yapısı tanımlanırken, en yakın dal “(s1 ==) değerine sahip. BOŞ) || (s2 == NULL)” yaklaşık 7 bin kez yaşandı. Sistem ayrıca bir anormallik tespit etti “(s1 == NULL) | (s2 == NULL)” ifadesi ağaçta 32 kez göründü.

Kod hatalarını tanımlamak için Intel açık kaynaklı ControlFlag makine öğrenimi sistemi

Kod parçasını analiz ederken “if (x = 7) y = x;” Sistem, sayısal değerleri karşılaştırmak için "if" operatöründe genellikle "değişken == sayı" yapısının kullanıldığını belirlemiştir, bu nedenle "if" ifadesindeki "değişken = sayı" göstergesinin büyük olasılıkla bir yazım hatası. Geleneksel statik analizörler böyle bir hatayı yakalayabilirdi, ancak onlardan farklı olarak ControlFlag, olası tüm seçenekleri sağlamanın zor olduğu hazır kuralları uygulamaz, ancak çeşitli yapıların çok sayıda kullanımına ilişkin istatistiklere dayanır. projelerden oluşuyor.

Bir deneme olarak, genellikle yüksek kaliteli ve test edilmiş kod örneği olarak anılan cURL yardımcı programının kaynak kodunda ControlFlag kullanılarak, "s->keepon" yapı elemanı kullanıldığında statik analizörlerin tespit edemediği bir hata tespit edildi, sayısal bir türe sahipti, ancak TRUE Boolean değeriyle karşılaştırıldı. OpenSSL kodunda yukarıda bahsedilen "(s1 == NULL) ∧ (s2 == NULL)" problemine ek olarak "(-2 == rv)" ifadelerinde de anormallikler tespit edildi (eksi bir yazım hatası) ve "BIO_puts(bp, ":")

Kaynak: opennet.ru

Yorum ekle