Statik Kod Analizinde Soyut Yorumlama

Soyut Yorumlamanın Açıklaması: Kafes Teorisinden Çıkarım ve Astrée'ye

Yazdığınız her testi geçen iki programı düşünün. Biri doğru çalışıyor. Diğeri ise yalnızca belirli bir girdi kombinasyonu aynı anda geldiğinde tetiklenen, sıfıra bölme hatası veriyor; testleriniz bu kombinasyonu asla üretmiyor. Geleneksel test yöntemleri hangisinin doğru, hangisinin yanlış olduğunu söyleyemez. Soyut yorumlama ise söyleyebilir.

Soyut yorumlama, statik analiz araçlarına bir programı çalıştırmadan tüm olası davranışları hakkında akıl yürütme yeteneği veren matematiksel çerçevedir. Facebook'un Infer aracının büyük ölçekte boş işaretçi hatalarını bulmasının, Astrée analiz aracının Airbus uçuş kontrol yazılımını resmi olarak doğrulamasının ve sağlamlık iddiasında bulunan her statik analiz aracının arkasındaki teknik budur; bu garanti, bir programın analizden geçmesi durumunda, kontrol edilen hata sınıfından gerçekten arınmış olduğunun garantisidir. Nasıl çalıştığını anlamak, bazı araçların diğerlerinin kaçırdığı hataları neden bulduğunu ve bu garantilerin neden belirli ödünleşmelerle birlikte geldiğini açıklar.

Kodu Çalıştırmadan Analiz Etme

SMART TS XL Portföyünüzdeki her dil üzerinde eş zamanlı olarak yapısal statik analiz uygular.

Daha fazla bilgi

Soyut Yorumlama Nedir?

Soyut yorumlama, Patrick Cousot ve Radhia Cousot tarafından 1977'de geliştirilen bir program yaklaştırma teorisidir. Temel fikir şudur: Genellikle çözümlenemeyen tüm olası program durumlarının tam kümesini hesaplamak yerine, analiz edilmesi kolay olan basitleştirilmiş bir matematiksel alan kullanarak güvenli bir üst yaklaştırma hesaplamaktır.

Buradaki "soyut" kelimesi belirsiz veya kavramsal anlamına gelmez. Belirli bir matematiksel işlemi ifade eder: Somut değerler kümesini, önemsediğiniz özellikleri korurken gereksiz ayrıntıları ortadan kaldıran daha basit bir gösterime dönüştürmek. Örneğin, somut bir tamsayı değeri; 42 İşaret analizi soyutlamasında, bu ifade basitçe "pozitif" olur. Bu soyutlama bilgi kaybına yol açar (artık kesin değeri bilemezsiniz) ancak işlenebilirlik kazanır (herhangi bir tamsayının işareti üç olasılıktan biridir: pozitif, negatif veya sıfır).

Bu yöntemin program analizi için faydalı olmasının sebebi, sağladığı garantidir: eğer analiz soyutlanmış alanda hiçbir hata bulmazsa, somut yürütmede de hiçbir hata yoktur. Potansiyel bir hata bulursa, bu hata pratikte ortaya çıkabilir veya çıkmayabilir, ancak hiçbir gerçek hata gizlenemez. İşte bu, sağlamlıktır.

Soyut Yorumlama, AST Analizi ve Dinamik Analiz Karşılaştırması

Bu terimler sıklıkla karıştırılıyor; "AST kod analizi" bu makalenin arama verilerinde yer alıyor ve farklı şeyleri tanımlıyorlar.

Soyut Sözdizimi Ağacı (AST) , kaynak kodun dilbilgisel yapısını temsil eden bir veri yapısıdır. Her derleyici ve kod denetleyicisi bir tane oluşturur. Ayrıştırma, yeniden düzenleme araçları ve kalıp tabanlı statik analiz için temel oluşturur. AST tabanlı analiz kalıpları bulur: bir kurala uyan kod (çok fazla parametreye sahip bir fonksiyon, birleştirme yoluyla oluşturulmuş bir SQL dizesi) işaretlenir. Değerler veya çalışma zamanı davranışı hakkında çıkarım yapmaz.

Soyut yorumlama, programı çalıştırmadan çalışma zamanı davranışı hakkında akıl yürütür. AST'yi girdi olarak kullanır ancak çok daha ötesine geçer: değerlerin program boyunca nasıl aktığını, değişkenlerin hangi aralıkları alabileceğini, bir işaretçinin belirli bir çağrı noktasında boş olup olamayacağını, bir döngünün sonlanıp sonlanmayacağını modeller. AST analizi, kalıp eşleştirmedir. Soyut yorumlama ise davranışsal akıl yürütmedir.

Çoğu kod denetleyicisi (ESLint, Checkstyle, Pylint) öncelikle AST tabanlıdır. Çoğu biçimsel doğrulama aracı (Infer, Astrée, Polyspace) soyut yorumlama kullanır. Dinamik analiz (programı çalıştırmak ve gerçek davranışı gözlemlemek) yalnızca belirli girdiler tarafından tetiklenen hataları bulur. Soyut yorumlama ise programı hiç çalıştırmadan tüm olası girdilerdeki hataları bulur.

Statik Analizin Temel Matematiksel Prensipleri

Arama verilerinde doğrudan "Statik analiz araçlarının ardındaki matematiksel prensipler nelerdir?" sorusu yer alıyor. İşte sade cevap.

Soyut yorumlama üç matematiksel yapıya dayanmaktadır:

Kafesler. Bir kafes, her eleman çiftinin en küçük üst sınırı (birleşim) ve en büyük alt sınırı (kesişim) olan kısmen sıralı bir kümedir. Statik analizde, kafes soyut etki alanını, taşıdıkları bilgi miktarına göre sıralanmış olası soyut değerler kümesini temsil eder. İşaret analizi için kafes şu şekilde görünür:

        ⊤ (unknown -- could be anything)
       / \
   pos   neg
       \ /
        0
        |
        ⊥ (unreachable -- no possible value)

Izgara üzerinde yukarı doğru hareket etmek, hassasiyeti kaybetmek (daha az bilmek) anlamına gelir. Aşağı doğru hareket etmek ise hassasiyeti artırmak (daha çok bilmek) anlamına gelir. En üstteki eleman ⊤ "işe yarar hiçbir şey bilmiyoruz" anlamına gelir. En alttaki eleman ⊥ ise "bu duruma ulaşılamaz" anlamına gelir.

Galois bağlantıları. Galois bağlantısı, somut alan (gerçek program değerleri) ile soyut alan (basitleştirilmiş gösterim) arasındaki biçimsel ilişkidir. İki fonksiyondan oluşur: somut değerleri soyut gösterimlerine eşleyen bir soyutlama fonksiyonu α ve soyut değerleri temsil ettikleri somut değerler kümesine geri eşleyen bir somutlaştırma fonksiyonu γ.

Kritik özellik: soyut alan güvenli bir üst yaklaşım olmalıdır. γ(α(S)) ⊇ S Her somut küme S için. Soyutlama, gerçekte var olandan daha fazla değer içerebilir; bu da yanlış pozitiflere yol açar, ancak asla gerçekte var olan değerleri dışlamamalıdır. Gerçek değerleri dışlamak, gerçek hataları gözden kaçırmak anlamına gelir.

Sabit noktalı yineleme. Döngü içeren programlarda, analiz kararlı bir duruma ulaşana kadar tekrarlanmalıdır. Örneğin, şu şekilde bir döngü için:

c

int x = 0;
while (condition) {
    x = x + 1;
}

İlk denemede, x is {0}Bir döngü gövdesinden sonra, x olabilir {0, 1}İki gün sonra, {0, 1, 2}Bu küme sürekli büyüyor, asla kendi kendine istikrara kavuşmuyor. Çözüm ise... genişletme: daha geniş bir yaklaşıma atlayarak yakınsamayı zorlayan bir operatör (tipik olarak [0, +∞) (aralık analizi için). Analiz daha sonra şunu kullanır: daralma Bir miktar hassasiyeti geri kazanmak için.

Bu sabit noktalı hesaplama, soyut yorumlamayı döngüler de dahil olmak üzere tüm yürütme yollarında eksiksiz kılan ve onu basit kalıp eşleştirmeden hesaplama açısından daha pahalı hale getiren şeydir.

Soyut Alanlar: Yaklaşım Yöntemini Seçmek

Soyut alan, analizin neleri bulabileceğini ve neleri bulamayacağını belirler. Farklı alanlar, program davranışı hakkında farklı sorulara cevap verir.

Soyut AlanNeleri İzliyorÖrnek KullanımNeyi Eksik Bırakıyor?
İşaret analiziDeğerlerin pozitif, negatif veya sıfır olması fark etmez.Sıfıra bölme hatası tespitiKesin değerler, taşma koşulları
Aralık analiziSayısal değerler için üst ve alt sınırlarTampon taşması, dizi erişim güvenliğiDeğişkenler arasındaki ilişkiler
Sekizgen alanDeğişken çiftleri arasındaki doğrusal ilişkilerDaha hassas taşma tespitiDoğrusal olmayan ilişkiler
İşaretçi analiziİşaretçilerin boş olup olamayacağı veya birbirlerinin takma adlarını kullanıp kullanamayacağıNull referanssızlaştırma, serbest bırakıldıktan sonra kullanımNesne ömrü, yığın şekli
Kirlilik analiziDeğerlerin güvenilmez kaynaklardan gelip gelmediğiSQL enjeksiyonu, XSS tespitiKontrol yoluyla gerçekleşen örtük akışlar
Çokyüzlü alanKeyfi doğrusal aritmetik kısıtlamalarDöngüye bağlı doğrulamaPerformans maliyeti katlanarak artar.

Alanlar arasındaki denge her zaman hassasiyet ve performans arasındadır. Aralık alanı hızlıdır ve çoğu sayısal hatayı yakalar. Çok yüzlü alan çok daha hassastır ancak değişken sayısında üstel karmaşıklığa sahiptir. Pratik statik analiz araçları, hedef uygulamaları için bu dengeyi sağlayan alanları seçer; güvenlik açısından kritik gömülü sistemler daha yavaş, daha hassas analizleri kaldırabilir; CI/CD entegre linter'ların saniyeler içinde bitirmesi gerekir.

Üç Gerçek Araç Soyut Yorumlamayı Nasıl Kullanıyor?

Teoriyi tek başına açıklamak yerine, somut araçlar uygulamasını netleştirir.

Facebook Infer , Java, C, C++ ve Objective-C dillerinde null işaretçi hataları, kaynak sızıntıları ve yarış koşullarını analiz etmek için bi-abduction adı verilen bir soyut yorumlama biçimi kullanır. Bi-abduction, fonksiyonlar için ön koşulları ve son koşulları otomatik olarak keşfederek, manuel belirtim gerektirmeden prosedürler arası analize olanak tanır. Infer, milyonlarca satırlık kod tabanlarına ölçeklenebilirken, kontrol ettiği hata sınıfları için sağlam kaldığı için Facebook, Spotify, Mozilla ve diğer birçok büyük kuruluşta sürekli entegrasyon (CI) ortamında çalışmaktadır.

Astrée, C programlarında çalışma zamanı hatalarının bulunmadığını kanıtlamak için sayısal soyut alanlarla soyut yorumlamayı kullanır. Airbus tarafından A380'in birincil uçuş kontrol yazılımını resmi olarak doğrulamak için kullanılmış ve tüm kontrol sisteminde çalışma zamanı hatalarının bulunmadığını kanıtlamıştır; bu, hiçbir test programının sağlayamayacağı bir garantidir. Astrée, kontrol ettiği hata sınıfları için sıfır yanlış negatif bulur, ancak manuel inceleme gerektiren yanlış pozitifler üretebilir.

Polyspace (MathWorks), güvenlik açısından kritik uygulamalarda gömülü C ve C++ kodları için soyut yorumlama uygular. Her işlemi "yeşil" (kanıtlanabilir şekilde hata yok), "kırmızı" (kesinlikle hata) veya "turuncu" (inceleme gerektiren potansiyel hata) olarak sınıflandırır. Yeşil sınıflandırma, resmi bir kanıttır: hiçbir yürütme o işlemde çalışma zamanı hatasına neden olamaz.

Sağlamlık-Hassasiyet-Performans Üçgeni

Soyut yorumlama araçları, birbiriyle rekabet eden özelliklerin temel bir üçgeninde yol alırlar. Hiçbir araç bu üç özelliği aynı anda en üst düzeye çıkaramaz.

Sağlamlık, yanlış negatiflerin olmaması anlamına gelir: analiz edilen sınıftaki her gerçek hata tespit edilir. Sağlam araçlar garanti sağlar; sağlam olmayan araçlar hataları gözden kaçırabilir.

Hassasiyet, az sayıda yanlış pozitif anlamına gelir: bulgular, gerçekleşmesi mümkün olmayan teorik sorunlardan ziyade gerçek sorunlara karşılık gelir. Yüksek hassasiyet, daha rafine soyut alanlar ve prosedürler arası analiz gerektirir.

Performans , analizin faydalı bir sürede tamamlanması anlamına gelir. Daha hassas analiz daha pahalıdır. Bir milyon satırlık bir kod tabanında tüm çalışma zamanı hatalarının bulunmadığını kanıtlamak saatler sürer; bir linter taraması ise saniyeler sürer.

Farklı uygulamalar bu üçgenin farklı noktalarını gerektirir:

  • IDE astarlama ve CI/CDÖnce performans, sonra hassasiyet, sağlamlık ise isteğe bağlı.
  • Güvenlik taraması: Öncelik hassasiyettedir (geliştirici uyarı yorgunluğunu azaltır), yüksek önem dereceli sınıflar için sağlamlık önemlidir.
  • Güvenlik açısından kritik sertifikasyon: Öncelik sağlamlık (gerçek hataları gözden kaçırmamak gerekir), performans ikinci planda, yanlış pozitifler manuel inceleme süreciyle kabul edilebilir.

Gömülü ve Güvenlik Açısından Kritik Geliştirmelerde Soyut Yorumlama

"Gömülü sistem geliştirmede statik analizin faydaları" sorusu, soyut yorumlamanın en önemli uygulama alanlarından birine işaret etmektedir. Gömülü sistemler, otomotiv kontrol üniteleri, tıbbi cihaz yazılımları, havacılık uçuş kontrol yazılımları, soyut yorumlamayı özellikle değerli kılan kısıtlamalara sahiptir:

Tüm durumlar için test düzeneği mevcut değil. Bir otomotiv ECU'su, binlerce sensör kombinasyonuna gerçek zamanlı olarak yanıt verir. Her kombinasyon için testler oluşturmak imkansızdır. Soyut yorumlama, tüm durumları aynı anda kapsar.

Sertifikasyon gereksinimleri. DO-178C (havacılık ve uzay), ISO 26262 (otomotiv) ve IEC 62443 (endüstriyel kontrol), yazılımın tüm koşullar altında doğru şekilde davrandığını göstermeyi gerektirir. Soyut yorumlama kullanan biçimsel doğrulama, test kapsamı raporlarının sağlayamayacağı bir şekilde bu gereksinimi karşılayabilir.

Kaynak kısıtlamaları. Gömülü yazılımlarda genellikle bellek ayırıcı, istisna işleme ve işletim sistemi yedekleme mekanizması bulunmaz. Çalışma zamanı hatası, boş işaretçi referanssızlaştırması, dizi sınırlarının dışına çıkma gibi durumlar ciddi sistem arızalarıdır. Bu hataları gözden kaçırmanın maliyeti bir çökme raporu ve bir düzeltme değil, bir güvenlik olayıdır.

Astrée ve Polyspace analizörleri özellikle bu bağlam için geliştirilmiştir. Tasarımları, yanlış negatiflerin gözden kaçmaması garantisi karşılığında yüksek yanlış pozitif oranlarını ve yavaş analiz hızını kabul eder.

Yanlış Pozitifler ve Giderek Büyüyen Sorun

Soyut yorumlama araçlarına yönelik en yaygın eleştiri, gerçek uygulamada meydana gelmesi mümkün olmayan potansiyel hatalar hakkında uyarı veren yanlış pozitiflerdir. Yanlış pozitiflerin bir kalite eksikliği değil, doğasında var olan bir durum olduğunu anlamak, bunların yönetilmesini kolaylaştırır.

Yanlış pozitif sonuçlar iki kaynaktan kaynaklanır:

Soyut alanda aşırı yaklaştırma. Eğer aralık alanı izlerse x ∈ [0, 100]Bu durum, şu durumlar arasında ayrım yapamaz: x Pratikte her zaman 50'den azdır. Bir bölme işlemi x Program mantığı sıfıra bölmeyi garanti etse bile, sıfıra bölme olasılığı nedeniyle işaretlenebilir. x > 0Daha hassas bir etki alanı (tam değeri izleyen veya bağlantı kuran bir kısıtlama) x (Başka bir değişkene) aktarmak yanlış pozitifleri ortadan kaldırır, ancak daha yüksek hesaplama maliyetine neden olur.

Genişleme. Döngü analizini kolaylaştıran yakınsama operatörü, kaçınılmaz olarak bilgi kaybına neden olur. Genişletme işleminden sonra x itibaren [0, 5] için [0, +∞)Analiz cihazı artık bunu bilmiyor. x Sınırlı kalır. Kod kontrol ederse assert(x < 1000) Döngüden sonra, bu iddia pratikte doğru olsa bile artık kanıtlanamaz. x her zaman 1000'in oldukça altında kalır.

Yanlış pozitifleri yönetmek için pratik stratejiler: Kritik modüller için daha hassas alanlar kullanacak şekilde analizi yapılandırın (daha yavaş analizi kabul edin), hedefli açıklamalarla doğrulanmış yanlış pozitifleri bastırın ve aracın turuncu/bilinmeyen bulgularını doğrulanmış hatalar yerine öncelikli inceleme kuyruğu olarak ele alın.

Ne kadar SMART TS XL Kurumsal Ölçekte Statik Analiz Uygulamaları

SMART TS XL Soyut yorumlama teorisinin kurumsal gerçeklikle buluştuğu alanda faaliyet gösteriyor: birden fazla dili kapsayan kod tabanları, on yıllarca süren geliştirme süreçleri ve program bazında resmi doğrulamayı pratik olmaktan çıkaran organizasyonel sınırlar.

Tüm programlara tek bir soyut etki alanı uygulamak yerine, SMART TS XL'S statik kod analizi Ortamdaki her dil için uygun yapısal analiz tekniklerini bir araya getirerek (COBOL, JCL, Java, Python, RPG, PL/I, SQL ve modern teknolojiler), tüm portföy genelinde eş zamanlı olarak kalite ölçütleri, bağımlılık verileri ve güvenlik bulguları üretir.

Uygulama bağımlılık eşleme özelliği, diller arası çağrı grafiğine grafik kuramsal analiz uygulayarak, programların, veri kümelerinin ve iş akışlarının dil sınırları boyunca nasıl bağlandığını belirler; bu, tek dilli araçların gerçekleştiremediği türden bütünsel bir sistem analizidir. Bu, sistem düzeyinde yapısal akıl yürütmedir: bireysel programların özelliklerini kanıtlamak değil, bunların nasıl bağlandığının özelliklerini kanıtlamaktır.

Etki analizi özelliği, bağımlılık grafiği üzerinde erişilebilirlik analizi uygular: bir düğümde önerilen bir değişikliğe göre, o düğümden erişilebilen tüm düğümlerin kümesini hesaplar. Bu, statik analiz sorusu olan "ne etkilenecek?" sorusuna, çalışma zamanı gözlemi veya insan tahmini yerine kodun yapısından yola çıkarak verilen bir cevaptır.

Ekipler için miras modernizasyonu programları SMART TS XLYapısal analiz, biçimsel soyut yorumlama araçları (ki bunlar dile özgüdür ve yapılandırmak için alan uzmanlığı gerektirir) ile büyük, belgelenmemiş, çok dilli eski sistemlerin aslında ne yaptığını anlama ihtiyacı arasındaki boşluğu kapatır; bu da, en pahalı sürprizlerini uygulama sırasında keşfetmek istemeyen herhangi bir modernizasyon programı için ön koşuldur.

Sıkça Sorulan Sorular

Soyut yorumlama ve model denetimi arasındaki fark nedir? Her ikisi de program doğrulama için kullanılan biçimsel yöntemlerdir. Soyut yorumlama, olası durumlar kümesini aşırı yaklaşık olarak belirler (sağlam ancak potansiyel olarak kesin olmayan). Model denetimi ise durum uzayını kapsamlı bir şekilde araştırır (eksiksiz ancak yalnızca sonlu, sınırlı sistemler için uygulanabilir). Soyut yorumlama büyük programlara uygulanabilir. Model denetimi ise daha küçük modellerdeki karmaşık özelliklere uygulanabilir. Bunlar birbirini tamamlayıcıdır, rekabet halinde değildir.

Soyut yorumlama yalnızca güvenlik açısından kritik yazılımlar için mi geçerlidir? Hayır, ancak en belirgin değerini orada gösterir. Çıkarım (Infer) büyük teknoloji şirketlerinde standart CI/CD işlem hatlarında çalışır ve günlük Java ve C kodlarında boş işaretçi hatalarını ve kaynak sızıntılarını bulur. Uygulanan titizlik derecesi bir tercih meselesidir: bir uçta biçimsel garantilerle tam sağlamlık, diğer uçta hafif sezgisel analiz ve en pratik araçlar ikisinin arasında bir yerdedir.

Soyut yorumlama COBOL'u analiz edebilir mi? Soyut yorumlama, bir teori olarak dilden bağımsızdır. Bunu COBOL'a uygulamak, COBOL'un işlemleri, PIC alan aritmetiği, REDEFINES maddeleri, seviye 88 koşul adları vb. için soyut aktarım fonksiyonlarının uygulanmasını gerektirir. Genel amaçlı soyut yorumlama araçları (Infer, Astrée) COBOL'u desteklemez. COBOL'u doğal olarak anlayan kurumsal yapısal analiz platformları, COBOL kod tabanlarındaki kalite sorunlarını, ölü kodu ve mimari sorunları bulmak için ilgili statik analiz tekniklerini uygular.