Kesin atama analizi - Definite assignment analysis

İçinde bilgisayar Bilimi, kesin atama analizi bir veri akışı analizi tarafından kullanılan derleyiciler bir değişkenin veya konumun her zaman kullanılmadan önce atandığından emin olmak için.

Motivasyon

İçinde C ve C ++ programları, özellikle teşhis edilmesi zor hataların kaynağı, okumadan kaynaklanan belirleyici olmayan davranışlardır. başlatılmamış değişkenler; bu davranış platformlar, yapılar ve hatta çalıştırma arasında değişebilir.

Bu sorunu çözmenin iki yaygın yolu vardır. Birincisi, tüm konumların okunmadan önce yazıldığından emin olmaktır. Rice teoremi bu sorunun genel olarak tüm programlar için çözülemeyeceğini tespit eder; ancak, bazı doğru programları reddederken yalnızca bu kısıtlamayı karşılayan programları kabul edecek ihtiyatlı (kesin olmayan) bir analiz oluşturmak mümkündür ve kesin atama analizi böyle bir analizdir. Java[1] ve C #[2] programlama dili spesifikasyonları, analiz başarısız olursa derleyicinin bir derleme zamanı hatası rapor etmesini gerektirir. Her iki dil de, titiz ayrıntılarla yazılmış belirli bir analiz biçimi gerektirir. Java'da, bu analiz Stärk ve diğerleri tarafından resmileştirildi.[3] ve bazı doğru programlar reddedilir ve açık ve gereksiz atamalar yapmak için değiştirilmeleri gerekir. C # 'da, bu analiz Fruja tarafından resmileştirilmiştir ve tüm kontrol akış yolları boyunca atanan tüm değişkenlerin kesinlikle atanmış olarak kabul edileceği anlamında kesin ve sağlamdır.[4] Siklon dil ayrıca programların belirli bir atama analizini geçmesini gerektirir, ancak C programlarının taşınmasını kolaylaştırmak için yalnızca işaretçi türlerine sahip değişkenler üzerinde.[5]

Sorunu çözmenin ikinci yolu, tüm konumları tanımlandıkları noktada bazı sabit, öngörülebilir bir değere otomatik olarak başlatmaktır, ancak bu, performansı engelleyebilecek yeni atamaları ortaya çıkarır. Bu durumda, kesin atama analizi bir derleyici optimizasyonu Gereksiz atamalar - atamaların ardından yalnızca diğer atamalar ve olası ara okumalar olmadan - ortadan kaldırılabilir. Bu durumda, hiçbir program reddedilmez, ancak analizin kesin atamayı tanımadığı programlar fazladan başlatma içerebilir. Ortak Dil Altyapısı bu yaklaşıma güveniyor.[6]

Terminoloji

Programın herhangi bir noktasında bir değişken veya konumun üç durumdan birinde olduğu söylenebilir:

  • Kesinlikle atandı: Değişken atanacağı kesin olarak bilinir.
  • Kesinlikle atanmamış: Değişkenin atanmamış olduğu kesin olarak bilinir.
  • Bilinmeyen: Değişken atanabilir veya atanmamış olabilir; Analiz hangisini belirleyecek kadar kesin değil.

Analiz

Aşağıdakiler, Fruja'nın tüm yerel değişkenlerin kullanılmadan önce atanmasını sağlamaktan sorumlu olan C # intraprokedural (tek yöntem) belirli atama analizini resmileştirmesine dayanmaktadır.[4] Aynı anda belirli atama analizi yapar ve sürekli yayılma Boole değerleri. Beş statik fonksiyon tanımlıyoruz:

İsimAlan adıAçıklama
önceTüm ifadeler ve ifadelerVerilen ifade veya ifadenin değerlendirilmesinden önce değişkenler kesinlikle atanır.
sonraTüm ifadeler ve ifadelerDeğişkenler, normal olarak tamamlandığı varsayılarak, verilen ifade veya ifadenin değerlendirilmesinden sonra kesinlikle atanır.
varsTüm ifadeler ve ifadelerVerilen ifade veya ifadenin kapsamında bulunan tüm değişkenler.
doğruTüm mantıksal ifadelerVerilen ifadenin değerlendirilmesinden sonra, ifadenin değerlendirildiği varsayılarak kesinlikle atanan değişkenler doğru.
yanlışTüm mantıksal ifadelerVerilen ifadenin değerlendirilmesinden sonra, ifadenin değerlendirildiği varsayılarak kesinlikle atanan değişkenler yanlış.

Bu fonksiyonların değerlerini çeşitli ifadeler ve ifadeler üzerinde, fonksiyonların sözdizimsel alt ifadelerindeki değerleri açısından tanımlayan veri akışı denklemleri sağlıyoruz. Şu an için hiçbir şeyin olmadığını varsayın git, kırmak, devam et, dönüşveya istisna işleme ifadeler. Aşağıda bu denklemlere birkaç örnek verilmiştir:

  • Herhangi bir ifade veya ifade e kesinlikle atanan değişkenler kümesini etkilemez: sonra(e) = önce(e)
  • İzin Vermek e ödev ifadesi ol loc = v. Sonra önce(v) = önce(e), ve sonra(e) = sonra(v) U {loc}.
  • İzin Vermek e ifade ol doğru. Sonra doğru(e) = önce(e) ve yanlış(e) = vars(e). Başka bir deyişle, eğer e değerlendirir yanlış, tüm değişkenler (anlamsızca ) kesinlikle atandı, çünkü e yanlış olarak değerlendirilmez.
  • Yöntem argümanları soldan sağa değerlendirildiğinden, (argben + 1) = sonra (argben). Bir yöntem tamamlandıktan sonra, dışarı parametreler kesinlikle atanmıştır.
  • İzin Vermek s koşullu ifade olmak Eğer (e) s1 Başka s2. Sonra önce(e) = önce(s), önce(s1) = doğru(e), önce(s2) = yanlış(e), ve sonra(s) = sonra (s1) sonra kesişir (s2).
  • İzin Vermek s while döngü ifadesi ol süre (e) s1. Sonra önce (e) = önce (s), önce(s1) = true (e), ve sonra(s) = yanlış (e).
  • Ve benzeri.

Yöntemin başlangıcında kesinlikle hiçbir yerel değişken atanmamıştır. Doğrulayıcı, tekrar tekrar soyut sözdizimi ağacı ve veri akışı denklemlerini kullanarak kümeler arasında bilgileri bir sabit nokta ulaşılabilir. Ardından, doğrulayıcı, önce bu değişkeni içerdiğinden emin olmak için yerel bir değişkeni kullanan her ifadenin kümesi.

Algoritma, kontrol akışı sıçramalarının ortaya çıkmasıyla karmaşıklaşır. git, kırmak, devam et, dönüşve istisna işleme. Bu sıçramalardan birinin hedefi olabilecek herhangi bir ifade, kendi önce atlama kaynağında kesinlikle atanmış değişkenler kümesiyle ayarlayın. Bunlar tanıtıldığında, elde edilen veri akışının bu örnekte olduğu gibi birden çok sabit noktası olabilir:

1  int ben = 1;2  L:3  git L;

L etiketine iki konumdan ulaşılabildiğinden, goto için kontrol akış denklemi şunu belirtir: önce(2) = sonra(1) kesişmek önce(3). Fakat önce(3) = önce(2), yani önce(2) = sonra(1) kesişmek önce(2). Bunun için iki sabit noktası vardır önce(2), {i} ve boş küme. Bununla birlikte, veri akışı denklemlerinin monoton formundan dolayı, kesinlikle atanan değişkenler hakkında en olası bilgiyi sağlayan benzersiz bir maksimum sabit nokta (en büyük boyutta sabit nokta) olduğu gösterilebilir. Böyle bir maksimum (veya maksimum) sabit nokta, standart tekniklerle hesaplanabilir; görmek veri akışı analizi.

Ek bir sorun, bir kontrol akışı sıçramasının belirli kontrol akışlarını olanaksız hale getirmesidir; örneğin, bu kod parçasında değişken ben kesinlikle kullanılmadan önce atanır:

1  int ben;2  Eğer (j < 0) dönüş; Başka ben = j;3  Yazdır(ben);

Veri akışı denklemi Eğer diyor ki sonra(2) = sonra (dönüş) sonra kesişir (ben = j). Bunun doğru bir şekilde çalışmasını sağlamak için, sonra(e) = vars(e) tüm kontrol akışı sıçramaları için; bu, denklemin aynı anlamda boş bir şekilde geçerlidir. yanlış(doğru) = vars(e) geçerlidir, çünkü kontrolün bir kontrol akışı sıçramasından hemen sonra bir noktaya ulaşması mümkün değildir.

Referanslar

  1. ^ J. Gosling; B. Joy; G. Steele; G. Bracha. "Java Dil Belirtimi, 3. Sürüm". s. Bölüm 16 (s.527–552). Alındı 2 Aralık 2008.
  2. ^ "Standart ECMA-334, C # Dil Belirtimi". ECMA Uluslararası. s. Bölüm 12.3 (sayfa 122–133). Alındı 2 Aralık 2008.
  3. ^ Stärk, Robert F .; E. Borger; Joachim Schmid (2001). Java ve Java Sanal Makinesi: Tanım, Doğrulama, Doğrulama. Secaucus, NJ, ABD: Springer-Verlag New York, Inc. s. Bölüm 8.3. ISBN  3-540-42088-6.
  4. ^ a b Fruja, Nicu G. (Ekim 2004). "C # 'da Kesin Atama Analizinin Doğruluğu". Journal of Object Technology. 3 (9): 29–52. CiteSeerX  10.1.1.165.6696. doi:10.5381 / jot.2004.3.9.a2. Alındı 2008-12-02. Aslında doğruluktan daha fazlasını kanıtlıyoruz: Analizin çözümünün mükemmel bir çözüm olduğunu gösteriyoruz (sadece güvenli bir yaklaşım değil).
  5. ^ "Siklon: Kesin Atama". Cyclone Kullanım Kılavuzu. Alındı 16 Aralık 2008.
  6. ^ "Standart ECMA-335, Ortak Dil Altyapısı (CLI)". ECMA Uluslararası. s. Bölüm 1.8.1.1 (Bölüm III, s. 19). Alındı 2 Aralık 2008.