Tipik analiz - Typestate analysis

Tipik analizbazen aradı protokol analizi, bir biçimdir program analizi Içinde istihdam edilen Programlama dilleri. En yaygın olarak nesne odaklı Diller. Tip durumları, belirli bir tipin bir örneği üzerinde gerçekleştirilebilecek geçerli işlem sıralarını tanımlar. Tip durumları, adından da anlaşılacağı gibi, durum bilgilerini bu türdeki değişkenlerle ilişkilendirir. Bu durum bilgisi, derleme zamanında hangi işlemlerin türün bir örneği üzerine çağrılmak üzere geçerli olduğunu belirlemek için kullanılır. Genellikle sadece çalışma zamanında yürütülecek olan bir nesne üzerinde gerçekleştirilen işlemler, nesnenin yeni durumu ile uyumlu olacak şekilde değiştirilen tip durum bilgisi üzerine gerçekleştirilir.

Tür durumları, "yöntem" gibi davranışsal tür iyileştirmelerini temsil edebilir Bir yöntemden önce çağrılmalıdır B çağrılır ve yöntem C ".Tipler, bir dosyayı açık durumda bırakmak gibi geçersiz dizilerin aksine" açıp kapat "gibi anlamsal olarak geçerli dizileri zorlayarak aç / kapat semantiğini kullanan kaynakları temsil etmek için çok uygundur. kaynaklar dosya sistemi öğelerini, işlemleri, bağlantıları ve protokolleri içerir. Örneğin, geliştiriciler dosyaların veya soketlerin okunmadan veya yazılmadan önce açılması gerektiğini ve kapatıldıkları takdirde artık okunamayacaklarını veya yazılamayacaklarını belirtmek isteyebilirler. "typestate" adı, bu tür bir analizin genellikle her nesne türünü bir sonlu durum makinesi. Bu durum makinesinde, her durum iyi tanımlanmış bir dizi izin verilen yöntem / mesaja sahiptir ve yöntem çağrıları durum geçişlerine neden olabilir. Petri ağları aynı zamanda olası bir davranış modeli olarak önerilmiştir. ayrıntılandırma türleri.[1]

Tipik analiz 1983 yılında Rob Strom tarafından tanıtıldı[2]Ağ Uygulama Dili'nde (NIL) geliştirilen IBM'in Watson Laboratuvarı Strom ve Yemini tarafından 1986 tarihli bir makalede resmileştirildi.[3]değişkenlerin başlatılma derecesini izlemek için typestate'in nasıl kullanılacağını açıklayan, işlemlerin hiçbir zaman yanlış başlatılmış verilere uygulanmayacağını garanti eder ve daha da genelleştirilir. Hermes Programlama dili.

Son yıllarda, çeşitli çalışmalar, tip devlet kavramını nesne yönelimli dillere uygulama yollarını geliştirmiştir.[4][5]

Yaklaşmak

Bir tür değişkeninin başlatılmasından kaynaklanan doğrusal olmayan tipestat kafes yapı {int x; int y; int z;}.
En küçük eleman ⊥, başlatılmamış hiçbir yapı bileşeninin durumu ∅ ile çakışır.

Strom ve Yemini (1986), belirli bir tipin kısmen sipariş öyle ki, bazı bilgiler atılarak daha yüksek bir tipten daha düşük bir tip durum elde edilebilir. Örneğin, bir int değişken C tipik olarak tip statülere sahiptir "başlatılmamış" < "başlatıldı"ve a DOSYA* işaretçi tür durumlarına sahip olabilir "ayrılmamış" < "ayrılmış, ancak başlatılmamış" < "başlatıldı, ancak dosya açılmadı" < "dosya açıldı". Dahası, Strom ve Yemini her iki tip devletin de en büyük alt sınıra sahip olmasını, yani kısmi düzenin bir buluşma-semilattice; ve her siparişin her zaman "⊥" olarak adlandırılan en küçük bir öğesi olduğunu.

Analizleri, her bir değişkenin basitleştirilmesine dayanmaktadır. v program metnindeki her nokta için yalnızca bir tip durumu atanır; eğer bir nokta p iki farklı yürütme yolu ile ulaşılır ve v her bir yol aracılığıyla farklı tip durumlarını, ardından v -de p kalıtsal tip durumların en büyük alt sınırı olarak alınır. Örneğin, aşağıdaki C kod parçasında değişken n tip durumunu devralır "başlatıldı" ve "başlatılmamış"dan sonra ve (boş) Başka sırasıyla bölüm, dolayısıyla tip statüsü vardır "başlatılmamış"tüm koşullu ifadeden sonra.

int n;                // burada, n "başlatılmamış" tipine sahiptirEğer (...) {    n = 5;            // burada, n "başlatılmış" tip durumuna sahiptir} Başka {    /*hiçbir şey yapma*/    // burada, n "başlatılmamış" tipine sahiptir}                     // burada, n "uninitialized" = büyük_düşük_bound ("başlatılmış", "başlatılmamış") tipine sahiptir

Her temel işlem[not 1] bir ile donatılmış olmalı tip durum geçişiyani, her bir parametre için sırasıyla işlemden önce ve sonra gerekli ve temin edilen tip durum. Örneğin, bir operasyon fwrite (..., fd) gerektirir fd tipe sahip olmak "dosya açıldıDaha doğrusu, bir operasyonun birden fazla sonuçlar, her biri kendi tip durumu geçişine ihtiyaç duyar. Örneğin, C kodu DOSYA * fd = fopen ("foo"; "r") setleri fd's typestate to "dosya açıldı" ve "ayrılmamış"açma işlemi başarılı olur ve başarısız olursa.

Her iki tip durum için t1 t2benzersiz tip devlet zorlama operasyonu Tipik bir nesneye uygulandığında, t2, tipini küçültür t1, muhtemelen bazı kaynakları serbest bırakarak. Örneğin, fclose (fd) zorlar fd's typestate from "dosya açıldı"to"başlatıldı, ancak dosya açılmadı".

Bir program çalıştırma denir tipe-doğru Eğer

  • Her temel işlemden önce, tüm parametreler tam olarak işlemin tip durumu geçişinin gerektirdiği tip durumuna sahiptir ve
  • program sonlandırıldığında, tüm değişkenler tip durumundadır ⊥.[not 2]

Bir program metni denir tipe uygun Kontrol akışının izin verdiği herhangi bir yol tip durumu doğru olacak şekilde noktaları statik olarak etiketlenebilen bir programa, uygun tip durum zorlamaları eklenerek dönüştürülebiliyorsa. Strom ve Yemini bir doğrusal zaman Tip durumu tutarlılığı için belirli bir program metnini kontrol eden ve varsa hangi zorlama işleminin nereye ekleneceğini hesaplayan algoritma.

Zorluklar

Kesin ve etkili bir tip durum analizi elde etmek için, aşağıdaki problemi ele almak gerekir: takma ad. Aliasing, bir nesnenin kendisine işaret eden birden fazla başvurusu veya işaretçisi olduğunda oluşur. Analizin doğru olması için, belirli bir nesnedeki durum değişikliklerinin o nesneye işaret eden tüm referanslara yansıtılması gerekir, ancak genel olarak bu tür tüm referansları izlemek zor bir sorundur. Analizin modüler olması, yani programın geri kalanını hesaba katmadan büyük bir programın her bir parçası için ayrı ayrı uygulanabilir olması gerekiyorsa, bu özellikle zor hale gelir.

Başka bir sorun olarak, bazı programlar için, yürütme yollarını birleştirmede en büyük alt sınırı alma ve karşılık gelen aşağı-zorlama işlemlerini ekleme yöntemi yetersiz görünmektedir. dönüş 1 aşağıdaki programda,[not 3] tüm bileşenler x, y, ve z nın-nin koordinatör Döngü gövdesindeki bir yapı bileşeninin her başlatılmasının, ilk döngü girişinin tipini karşılamak için döngü yeniden girişinde aşağıya zorlanması gerektiğinden, Strom ve Yemini'nin yaklaşımı bunu fark edemiyor. ⊥. Bununla ilgili bir sorun, bu örneğin tip durum geçişlerinin aşırı yüklenmesini gerektirmesidir; Örneğin, parse_int_attr ("x", & coord-> x) tip durumunu değiştirir "hiçbir bileşen başlatılmadı"to"x bileşeni başlatıldı", ama aynı zamanda "y bileşeni başlatıldı"to"x ve y bileşeni başlatıldı".

int parse_coord(yapı{int x;int y;int z;} *koordinatör) {    int görüldü = 0;     / * hangi özniteliklerin ayrıştırıldığını hatırla * /    süre (1)        Eğer      (parse_int_attr("x",&koordinatör->x)) görüldü |= 1;        Başka Eğer (parse_int_attr("y",&koordinatör->y)) görüldü |= 2;        Başka Eğer (parse_int_attr("z",&koordinatör->z)) görüldü |= 4;        Başka kırmak;    Eğer (görüldü != 7)    / * bazı öznitelikler eksik, başarısız * /        dönüş 0;    ...               / * tüm öznitelikler mevcut, bazı hesaplamalar yap ve başarılı ol * /    dönüş 1;}

Typestate Çıkarımı

Tipik durumları programlardan (veya hatta sözleşmeler gibi diğer yapıtlardan) çıkarmaya çalışan birkaç yaklaşım vardır. Birçoğu, derleme zamanında tip durumları çıkarabilir [6][7][8][9] ve diğerleri modelleri dinamik olarak araştırır.[10][11][12][13][14][15]

Typestate destekleyen diller

Typestate, henüz ana akım programlama dillerine geçmemiş deneysel bir kavramdır. Bununla birlikte, birçok akademik proje, günlük programlama tekniği olarak nasıl daha kullanışlı hale getirileceğini aktif olarak araştırmaktadır. İki örnek, Jonathan Aldrich'in grup tarafından geliştirilen Plaid ve Obsidian dilleridir. Carnegie Mellon Üniversitesi.[16] [17] Diğer örnekler arasında Clara[18] dil araştırma çerçevesi, önceki sürümleri Pas, paslanma dil ve >> anahtar kelime ATS.[19]

Ayrıca bakınız

Notlar

  1. ^ bunlar dil yapılarını içerir, ör. += C ve standart kütüphane rutinleri, ör.fopen ()
  2. ^ Bu, örneğin, tüm dosyalar kapatıldı ve hepsi Malloced hafıza olmuştur Bedavad. Çoğu programlama dilinde, bir değişkenin ömrü program sonlandırılmadan önce bitebilir; Tipiklik doğruluğu kavramı daha sonra buna göre keskinleştirilmelidir.
  3. ^ varsayarsak int parse_int_attr (const char * name, int * val) başlatır * val ne zaman başarılı olursa

Referanslar

  1. ^ Jorge Luis Guevara D´ıaz (2010). "Tipe yönelik tasarım - Renkli bir petri ağı yaklaşımı" (PDF).
  2. ^ Strom, Robert E. (1983). "Derleme sırasında güvenliğin uygulanmasına yönelik mekanizmalar". 10. ACM SIGACT-SIGPLAN programlama dilleri ilkeleri sempozyum bildirileri - POPL '83. s. 276–284. doi:10.1145/567067.567093. ISBN  0897910907.
  3. ^ Strom, Robert E .; Yemini, Shaula (1986). "Typestate: Yazılım güvenilirliğini artırmak için bir programlama dili kavramı" (PDF). Yazılım Mühendisliğinde IEEE İşlemleri. IEEE. 12: 157–171. doi:10.1109 / tse.1986.6312929.
  4. ^ DeLine, Robert; Fähndrich, Manuel (2004). "Nesneler için Tip Durumları". ECOOP 2004: 18. Avrupa Nesne Tabanlı Programlama Konferansı Bildirileri. Bilgisayar Bilimlerinde Ders Notları. Springer. 3086: 465–490. doi:10.1007/978-3-540-24851-4_21. ISBN  978-3-540-22159-3.
  5. ^ Bierhoff, Kevin; Aldrich Jonathan (2007). "Takma Adlı Nesnelerin Modüler Tip Durumu Kontrolü". OOPSLA '07: 22. ACM SIGPLAN Nesne Tabanlı Programlama Konferansı Bildirileri: Sistemler, Diller ve Uygulamalar. 42 (10): 301–320. doi:10.1145/1297027.1297050. ISBN  9781595937865.
  6. ^ Guido de Caso, Victor Braberman, Diego Garbervetsky ve Sebastian Uchitel. 2013. Davranış doğrulama için etkinliğe dayalı program soyutlamaları. ACM Trans. Yazılım Müh. Methodol. 22, 3, Madde 25 (Temmuz 2013), 46 sayfa.
  7. ^ R. Alur, P. Cerny, P. Madhusudan ve W. Nam. Java sınıfları için arayüz belirtimlerinin sentezi, 32. ACM Programlama Dillerinin İlkeleri Sempozyumu, 2005
  8. ^ Giannakopoulou, D., ve Pasareanu, C.S., "JavaPathfinder'da Arayüz Üretimi ve Bileşimsel Doğrulama", FASE 2009.
  9. ^ Thomas A. Henzinger, Ranjit Jhala ve Rupak Majumdar. Müsaadeli arayüzler. Yazılım Mühendisliğinin Temelleri (FSE) üzerine 13. Yıllık Sempozyum Bildirileri, ACM Press, 2005, s. 31-40.
  10. ^ Valentin Dallmeier, Christian Lindig, Andrzej Wasylkowski ve Andreas Zeller. 2006. ADABU ile nesne davranışı madenciliği. 2006 Uluslararası Dinamik sistem analizi çalıştayı Bildirilerinde (WODA '06). ACM, New York, NY, ABD, 17-24
  11. ^ Carlo Ghezzi, Andrea Mocci ve Mattia Monga. 2009. Grafik dönüşümü ile içsel davranış modellerinin sentezlenmesi. 31. Uluslararası Yazılım Mühendisliği Konferansı Bildirilerinde (ICSE '09). IEEE Bilgisayar Topluluğu, Washington, DC, ABD, 430-440
  12. ^ Mark Gabel ve Zhendong Su. 2008. Zamansal şartnamelerin sembolik madenciliği. Yazılım mühendisliği üzerine 30. uluslararası konferansın bildirilerinde (ICSE '08). ACM, New York, NY, ABD, 51-60.
  13. ^ Davide Lorenzoli, Leonardo Mariani ve Mauro Pezzè. 2008. Yazılım davranış modellerinin otomatik oluşturulması. Yazılım mühendisliği üzerine 30. uluslararası konferansın bildirilerinde (ICSE '08). ACM, New York, NY, ABD, 501-510
  14. ^ Ivan Beschastnikh, Yuriy Brun, Sigurd Schneider, Michael Sloan ve Michael D. Ernst. 2011. Değişmez kısıtlı modelleri otomatik olarak çıkarmak için mevcut enstrümantasyondan yararlanma. 19. ACM SIGSOFT sempozyumunun ve 13. Avrupa Yazılım mühendisliğinin Temelleri Konferansı (ESEC / FSE '11) Bildirilerinde. ACM, New York, NY, ABD, 267-277
  15. ^ Pradel, M .; Gross, T.R., "Büyük Metot İzlerinden Nesne Kullanım Spesifikasyonlarının Otomatik Oluşturulması," Otomatik Yazılım Mühendisliği, 2009. ASE '09. 24. IEEE / ACM Uluslararası Konferansı, cilt, no., S. 371,382, 16-20 Kasım 2009
  16. ^ Aldrich, Jonathan. "Ekose Programlama Dili". Alındı 22 Temmuz 2012.
  17. ^ Coblenz, Michael. "Obsidiyen Programlama Dili". Alındı 16 Şubat 2018.
  18. ^ Bodden, Eric. "Clara". Alındı 23 Temmuz 2012.
  19. ^ Xi, Hongwei. "ATS'de Programlamaya Giriş". Alındı 20 Nisan 2018.