Soru Ada 'güvenlik açısından kritik' bir dildir?


Google çalışanlarını denedim ve çevrimiçi olarak birkaç parçacığı okudum. Ada neden "güvenlik açısından kritik" bir dildir? Fark ettiğim bazı şeyler

  • İşaretçi yok
  • Bir aralık belirtin (bu tür bir tamsayıdır ancak yalnızca 1-12 olabilir)
  • Bir işlev parametresinin dışarıda mı yoksa dışarıda mı olduğunu açıkça belirtin
  • Aralık tabanlı döngüler (Sınırlı hataları veya sınır denetimini önlemek için)

Sözdizimin geri kalan kısmı anlamadım ya da 'güvenlik açısından kritik' olmanın nasıl yardımcı olduğunu görmedim. Bunlar bazı noktalardır ama büyük resmi göremiyorum. Görmediğim tasarım sözleşmesi var mı? Kodun derlenmesini zorlaştıran kurallar var mı (ve eğer öyleyse bazıları nelerdir?) Neden bu 'güvenlik açısından kritik' bir dildir?


21
2017-10-18 23:13


Menşei


Bence bu soruyu cevaplamak için karşılaştırmalı olarak bakılması gerekiyor. Örneğin, C ile (daha az kısıtlayıcı olanı) ve daha sonra Haskell'e (bazı durumlarda daha kısıtlayıcı, daha az karmaşık [-)], yani örneğin.
Ada'nın işaretçisi var; onlara "erişim türleri" diyor. - Keith Thompson
Daha fazla güvenlik için kritik sistemler için, SPARK kullanın. Ek kontroller için ek açıklamalarla birlikte Ada'nın bir alt kümesidir: en.wikipedia.org/wiki/SPARK - oenone
Ayrıca güvenlik tipine bakınız: en.wikipedia.org/wiki/Type_safety - NWS
Ada'daki erişim türleri gerçek işaretçilerdir ve başka bir şey değildir; C. adres / tam sayı melezleri değil. - WGroleau


Cevaplar:


Tüm bunlar güvenlik açısından kritik uygulama için iyidir; ama aynı zamanda bir düzen (bitlere kadar) ve [isteğe bağlı olarak] böyle bir kaydın SADECE belirli bir konumda olabileceğini belirtme yeteneğini de göz önünde bulundurun (video-bellek eşleştirmeleri gibi şeyler için yararlıdır).

Birçok kritik güvenlik uygulamasının da standart olmadığı (hem "geniş" hem de ileri karşılaştırılabilirlik) arayüzlerin duyularında olduğunu düşünün; örnek: nükleer reaktörler, roket motorları (mühendisliğin kendisi jenerasyondan nesile farklılık gösterir), uçak modelleri.

Yaklaşan Ada 2012 standardı DOES, şartlar ve koşullar şeklinde fiili sözleşmelere sahiptir; örnek (alınan http://www2.adacore.com/wp-content/uploads/2006/03/Ada2012_Rational_Introducion.pdf):

generic
   type Item is private;
package Stacks is

type Stack is private;

function Is_Empty(S: Stack) return Boolean;
function Is_Full(S: Stack) return Boolean;

procedure Push(S: in out Stack; X: in Item)
with
    Pre => not Is_Full(S),
    Post => not Is_Empty(S);

procedure Pop(S: in out Stack; X: out Item)
with
    Pre => not Is_Empty(S),
    Post => not Is_Full(S);

Stack_Error: exception;

private
 -- Private portion.
end Stacks;

Ayrıca, üzerinde durulan başka bir şey, dışlama kabiliyetidir. Null senden Access/ işaretçi türleri; Bu, a) alt program parametrelerinizde hariç tutmayı ve b) algoritmanızı düzene koymak için [her kullanım noktasında null olup olmadığını kontrol etmek zorunda olmadığınızdan] ve c) istisnanızın gerçekleşmesini sağlayabileceğiniz için yararlıdır. işleyici, (varsayalım) olağanüstü durumunun üstesinden gelir Null.

* The Arianne 5 disaster occurred precisely because the management disregarded this fact and had the programmers use the incorrect specifications: that of the Arianne 4.


12
2017-10-19 00:44



Re Arianne 5 - Program, bir arianne 4 için doğru şekilde çalıştı ve yörünge, bir arianne 4 için sınırların dışında olduğunda, kendini yok etmeyi doğru bir şekilde tetikledi. - NWS
Tam olarak nokta; Eğer Arinne 5 ve 4 mühendislik açısından uyumluyduysa, bir kargo uçağı olarak kullanmak için tüm yolcu kısımlarını söküp atacak olursanız, bir 747'deki yazılımla ilgili bir problem olurdu. Mobilyalarınız için. - Shark8
"kendini imhayı doğru şekilde tetikledi"aerodinamik kuvvetler fırlatıcıyı gerçekten kırdı. - curiousguy
Ayrıca, Ada'nın bazı kişilerin yanlış bir şekilde "gerçek programcılar" iddiasında bulunmalarının çok akıllıca olduğu birçok hataları imkansız kılar. - WGroleau


Eh, bu oldukça basit. Bunun nedeni, bir çok Ada sytaxının, "güvenlik açısından kritik" (dil için ne anlama geliyorsa olsun) dilini yapmakla ilgisi yok gibi görünmesi, bunun Ada'nın tasarım hedefi olmamasıdır. Genel amaçlı derlenmiş bir sistemin programlama dili olması için tasarlandı ve ABD Savunma Bakanlığı'nın tüm küçük destekli dilleri kullanabildiğini ve her yere destek vermek zorunda kalmasını sağladı.

Son sonucun, güvenlik açısından kritik uygulamalar için oldukça yararlı bir dil olduğu gerçeğinin, aslında dil çok iyi tasarlanmıştı askeri uygulamalarla (nerede hayatları akılda sık sık yazılımın güvenilirliği üzerinde durulur.

Şaşırtıcı derecede az sayıda başka modern dil inşasına destek oldu. dürüst Bir tasarım hedefi olarak yazılım. Çoğu, tek başına bir "genius" bilgisayar korsanı tarafından pişiriliyor gibi görünmektedir; baştaki hedef, hacker'ın tercih ettiği yeni bir şekilde, çok fazla kodu hızlı bir şekilde kullanabilmeyi kolaylaştırma yeteneğidir.


11
2017-10-19 13:19



"Şaşırtıcı bir şekilde, bazı modern diller, tasarım hedefi olarak güvenilir yazılımlar oluşturmak için destek sağlamıştır."hangi modern" derlenmiş "dil" değil Bu hedefe sahip misiniz? - curiousguy
@curiousguy - Geçmiş zamana dikkat edin. 70'lerin sonlarında 80'lerin başında konuşuyorum. C tasarımcıları aslında C'yi göz önünde bulundurmaya davet ettiler ve tam olarak bunu söyleyerek reddettiler. - T.E.D.


AdaCore, Ada 2005'in çeşitli güvenlik özelliklerinin güzel bir sunumunu burada sunuyor:

http://www.adacore.com/knowledge/technical-papers/safe-secure/

ABD Hükümeti ve endüstrisi, aynı zamanda, dilleri kıyaslayan uzun bir süre önce program güvenirliği üzerine çalışmalar yürüttü. Sitelerin hepsi eski olduğundan çok hızlı bir şekilde bulamadım (!) Ama DDCI'nin web sitesinden bir alıntı şöyle: "80'lerde yapılan çalışmalarda Ada, Pascal, Fortran ve C gibi yerleşik programlama dillerini sürekli olarak geride bıraktı. Ada, yetenek, verimlilik, bakım, risk ve yaşam döngüsü maliyetlerini ölçen performans değerlendirmelerinde C ++ 'yı geçmeye devam ediyor. "

Aşağıdaki bağlantıda Commanche projesinde kullandıkları nedenleri listeler. Platform uygulamalarının UZUN süredir etrafta olduğunu ve kararlı kaldığını ekleyeceğim. Makaledeki bir kaynak gibi, masrafların çoğunun geldiği bakım da var. .NET ve Java gibi modern yarışmacıları çıldırmış gibi gördük. Ada'nın uzun süreli istikrarı, uzun süreler (bazen onlarca yıl) için sıklıkla uygulanan güvenlik açısından kritik uygulamalar için daha iyidir.

http://www.ddci.com/displayNews.php?fn=programs_rah66.php

Bir başka avantaj Ada'nın dil gelişimi için tasarlanmış olmasıdır. Haberlerde, .NET ve JVM'nin yenilikçi b / c nasıl "iş için doğru araçları" tek bir sistemde karıştırmanıza izin verdiği hakkında konuşmaya devam ediyorum. Ada'nın bu yetenekleri vardı. uzun zaman. Uygulamaların Ada, C, C ++, assembler vb. Bir karışımı olması yaygındır. (MULTOS CA akla gelir.) Ve hala iyi çalışırlar.

Ya da statik değildi. En son 2012'de dili güncellemeye devam ediyorlar. Taşınabilirliği, kütüphaneleri isteyen veya bu konuda bolca mevcut kodu olan insanlar için hem JVM hem de .NET üzerinde çalışmasına izin verdi. IBM, Aonix, AdaCore ve Green Hills gibi birçok işletim sistemi ve RTOS için Ada geliştirme araçları ve güçlü çalışma süreleri de var.

Son yarar: eğer derleyecekse işe yarayacaktır. Genellikle.


6
2017-10-03 00:20



Sizin için bu referansı arıyordum ama bunun yerine bu gemiyi buldum: güvenlik açısından kritik yazılım geliştirmenin birçok yönüyle bir NASA rehberi. Page 207 iş için dili seçmeye odaklanır. Aradığınızı listeler, büyük dilleri değerlendirir ve bir kazanan seçer. (Kullanılan archive.org cuz govt kapatma gerçek bağlantıyı öldürdü) - Nick P
web.archive.org/web/20130510145632/http://www.hq.nasa.gov/... - Nick P
Bu makalede çok kısa bir noktaya değinilmiştir: hataların erken tespiti. Çalışma zamanına kadar bir hata devam ederse bile, başarısızlıktan çok sonra, başka bir şey olarak tezahür eden sessiz bir yolsuzluk yerine, spookily hataya yakın bir şekilde işaret eden bir mesajla bir istisna kazanacaksınız. IMO bu tek başına Kocaman avantaj - Brian Drummond
Çok iyi bir nokta. - Nick P


Ada gerçek zamanlı olarak üstün destek http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-1-3-4.html . Bu, programlama dilinin programlama dilinin teknik detayları hakkında endişelenmekten ziyade daha büyük bir determinizm uygulaması sağlar. Ada'nın desteklediği çalışma zamanı özelliklerinin birçoğunda bazı şeylerin derinlemesine anlaşılmasıyla C'ye ulaşılabilse de, Ada standartlaştırıldığından bu yana en çok gerçek zamanlı özelliklere çok iyi ulaşır. Ada'nın Ravenscar profili bile var http://en.wikipedia.org/wiki/Ravenscar_profile ve SPARK, "son derece güvenilir işlemin gerekli olduğu" bir bilgisayar dili olup, Ada 83 ve 95'in bir alt kümesini temel alır. http://en.wikipedia.org/wiki/SPARK_%28programming_language%29. Tahminimce SPARK'ın daha yeni Ada versiyonları için bir sürümü yok b / c, daha yeni sürümlerin ne kadar güvenli olduğunu söylemek için çok erken. İkinci makalede, Ada'nın hızla değişen olaylar sırasında hassas kontrollere dayanan gerçek zamanlı uygulamalar için önemli olacak olan C'ye rakip hızlar için optimize edilebileceği de belirtilmiştir. 'Güvenlik açısından kritik' bir dil için açıkça önemli olan, gerçek zamanlı kontrol için birçok standart özellik bulunmaktadır.


0
2017-12-09 18:49



Aslında Spark-2014, resmi olarak yayınlanabilir kodu daha kolay yazabilmek için Ada-2012 sözleşmelerine dayanıyor. spark-2014.org - Brian Drummond


Geç olduğunu biliyorum ama yakın zamanda karşılaştığım bir örnek. Ben iyi çalıştı aşağıdaki C ++ işlevini yazdım -O0:

size_t get_index(const Monomial & t, const Monomial & u) {
    get_index(t, u.log()); // forgot to type "return" first...
}

Bu aslında derler ve iyi bir derleyiciye sahip olduğunuza dair bir uyarıda bulunduğunuzda bir uyarıda bulunabilse de, bir çok programın derlendiği zaman bunu görmeniz mümkün değildir. Mucizevi bir şekilde, onu derlediğimde iyi çalıştı. -O0. Ama onu derlediğimde -O3 her seferinde çöktü ve benim için hayatımı neden bilemedim, çünkü uyarıyı görmedim (eğer göründüyse bile). Hayal kurduğunuzu düşündüğünüzde hata ayıklayın. return orada sadece niyetini biliyorsun çünkü.

Aynı şekilde, tekrar öğrenirken, bu hatayı sık sık yaptım:

int a;
scanf("%d", a); /* left out & before the a */

kullanma intİşaretçiler için ve tersi C de normal programlama pratiği olarak kabul edilir, öyle ki 25 yıl önce derleyiciler bir uyarı yaymaya bile zahmet etmemiştir. Heck, o bir özellik C değil, bir böcek. (Örneğin, bkz. Brian Kernaghan'ın "Neden Pascal benim favori Dilim değil.") Ve tabiki o zamanlar evdeki bilgisayar işletim sisteminin bellek koruması yoktu; Şansınız varsa bilgisayar sıfırlandığında sabit diske yazmıyordu.

Bu tür hatalar bile olmaz derlemek Ada'da. Fonksiyonlar var bir değer döndürmek yapamam yanlışlıkla kullanmak Integer yerine access Integer (yani, tamsayıya işaretçi).

Ve bu sadece başlangıç!


0
2018-05-02 06:12