Bir programın asla yanlış gitmeyeceğini garanti edebilir miyiz?


10

Burada bir sistemimiz var. Son zamanlarda, raporda sistem tarafından oluşturulan sayılardan birinde yanlış bir hesaplama var. Deneyimlerimiz sayesinde, birkaç yıldır bu sistemde hiçbir sorun / hatayla karşılaşmadık.

Bu sistemin yazarı zaten gitmiş olduğu için programları zorlukla izleyebiliyoruz. Ancak giriş verilerini, ayarları ve doğru olduklarını doğruladık.

Şimdi sorum şu: Bir bilgisayar programı mantıklı bir neden olmadan aniden yanlış mı gidecek? Sunucu makinesine çarptığımda, bilgisayarın hesapladığı sayıdan biri başka bir sayı olur ve hesaplamayı yanlış yapar mı?

Oldukça çılgın olduğu fikrine katılıyorum, ama sadece bilmek istiyorum, sorunun programdan ve girdiden değil, diğer bazı faktörlerden kaynaklandığını nasıl bilebiliriz?

PS Bu çılgın sistemin günlüğü yok.


8
Bilgisayarımdaki RAM modüllerinden birinde tam olarak bir hata biti vardı, bu nedenle bu biti kullanacak kadar talihsiz bir program yanlış bir sonuç verebilir. Memtest86 cihazını makinenizde çalıştırmak, bu tür bir sorunu ortadan kaldırmanın basit bir yolu olabilir.
user281377

16
evet, silerek
Steven A. Lowe

6
Bazı donanım parçalarının aslında hataları vardır. Günün yonga üreticilerinin çok az olduğu kanıtıdır. Önce yazılımdan şüphelenirim.

Bir programın yanlış gitmesi için her zaman mantıklı bir neden vardır. Slam mantıklı bir nedendir.
mouviciel

2
İstatistiksel bir bomba ya da kötü amaçlı bir derleyici veya kötü bir koç, disk ya da koçunuza yazabilecek ya da işletim sistemini ya da işletim sistemi hatasını ya da bir yerdeki bir kütüphanedeki bir hatayı ya da ünlü birleştirme sıralama hatasını değiştirebilen bir virüs olabilir, or ...
İş

Yanıtlar:


8

Hayır derdim!

Teoride cevap hayır, sadece aşağıdakileri test edebiliriz: -

  • sınırlı sayıda ortam.
  • sınırlı sayıda zaman çizelgesi.
  • sınırlı sayıda test vakası.

Bu, programın kullanım ömrü boyunca karşılaşabileceği toplam ortam, zaman ve vaka sayısından oldukça azdır. Ayrıca,% 10.000 enflasyonla başa çıkmanız gereken, programınız yeni bir süper yeni 31 bit mimariyle başa çıkma konusunda geleceğe dair çok az bilgimiz var.

Teori şahsen karşılaştığım deneyim ile destekleniyor:

  • Programlar farklı bir yerel ayara taşındığında kesiliyor. Ay "MAI" iken "MAYIS" kontrol ediliyor.
  • Programların derleyicinin yeni bir sürümü üzerinde test başarısız olması, önceki sürümde bir hata ile birlikte bir hata programda doğru sonuç üretti.
  • Programlar OS'nin yeni bir sürümünü kırıyor. Solaris varsayılan dizin girişi sayısını artırdığında, ftok () tarafından döndürülen SMALLINT, dizindeki ilk dosya için her zaman sıfır döndürür.
  • programların ilk kez hem geçerli hem de beklenmedik olan ve hiçbir zaman test edilmeyen belirli bir girdi kombinasyonuyla karşılaştıkları için kırıldı - mevduatlardaki negatif faiz oranları, gönderilecek sıfır ağırlık kalemleri, düşük değerli eşyalar KDV vb. Hesaplanamadı.

Evet diyorum, bir hükümle - Çok iş parçacığınız varsa. Hiç "Yarış Koşulu" duydum.
mattnz

6

Teorik olarak, aynı durumla başlarsanız, sonuç aynı olacaktır. Gerçekte, "sunucu boyutlu" ekipmanlarda aynı başlangıç ​​durumunu sağlamak neredeyse imkansızdır.

Başlatılmamış değişkenleri alın. Şu koda bakın:

  short i;

  if(i==-1)
  {
        //do something special
  }
  else
  {
        i=0;
        //do something else
  }

Bu, 65536 koşuda bir kez beklenmedik sonuçlar üretecektir. Ve hafızanın her çalışmadan önce aynı durumda olduğundan emin değilseniz, itamamen rastgele olacaktır.

Birinin geçersiz kılmayı unuttuğu ilk durumun öngörülemeyen öğelerini veya nadiren meydana gelen sınır durumlarını takiben hataların ortaya çıkması için yüzlerce benzer yol vardır - çok iş parçacıklı ortamdaki yarış koşulları, sınır dışı dizi erişimi, bozuk dosya sisteminde disk G / Ç ve yakında.

Programın hatasız olduğunu ispatlayabilirseniz, sadece onu kırabilecek kozmik ışınlar vardır. Ancak iki iç içe döngüden daha karmaşık bir şeyin doğruluğunun matematiksel kanıtı, en büyük sistemlerin kapsamının hemen hemen ötesindedir (ve küçük bir servete mal olur) ve geri kalanı için sadece umut edebilirsiniz.


6

Şimdi sorum şu: Bir bilgisayar programı mantıklı bir neden olmadan aniden yanlış mı gidecek?

Tam olarak aynı bilgi işlem ortamına sahipseniz, bir programa X girişi verildiğinde her zaman aynı sonuç R olur. Uygulamada, nadiren tek bir programın tek başına yürütülmesi nadirdir. Bugün en basit uygulama bir işletim sisteminde çalışır ve belleği aynı anda belleğe 'yüklenebilecek' diğer programlarla paylaşır. Bu programlar, belleği belirli bir program arızasına neden olacak şekilde değiştirebilir. Bu, örneğin 'pointer' tipi değişkenlerle ünlü bir sorundur. Genellikle bu tür hatalar anormal sistem davranışlarına neden olur ve yanlış hesaplama sonuçlarına neden olmaz.

Sizin durumunuzda, sorunun yukarıda tarif ettiğim gibi olmadığını (ve genellikle) olmadığını varsayarım. Sorun şu olabilir:

  • program sonucu hesaplamak için yanlış veri tip (ler) i kullandı, bu hata sadece özel değerler kullanıldığında kendini gösterir.
  • program hesaplamada bir hatayla karşılaştı (mantıksal bir durum nedeniyle), ancak hatayı işlemedi ve yine de sonuç üretti. (örn. şamandıra ve tamsayı aritmetiğinin karıştırılması)
  • bir iş kuralı veya mantıksal bir koşul doğru bir şekilde kodlanmamış, girilen veriler bu koşulu temsil eder, ancak yanlış hesaplama kullanılmıştır. (örneğin, önce hesaptaki tutarı kontrol etmeden önce tutarı hesap tutarından çıkarın).
  • yalnızca belirli sayı aralıkları için geçerli olan ancak veriler farklı aralık içeren formüller kullanarak. (örneğin, bir değer aralığına göre bir faiz oranının hesaplanması)

Yukarıdaki ve diğer birçok nedenden dolayı yazılım insanları doğru yazılım oluşturmak için çok fazla kaynak harcıyorlar, ancak yazılım hataları hala oluşuyor, ancak hatalar 'mantıklı' ve bir nedeni var, sadece sebebi açık değil iyi araştırma yapmadan bazılarına. Bu nedenle, genel olarak test edilen yazılım tahmin edilebilir ve rastgele sonuçlar üretmez. Bazı programların karmaşıklığı ve diğer faktörler nedeniyle, test edilen programlar bile yanlış gidebilir, ancak bu olduğunda hatalar mantıklı bir nedendir.

Sunucu makinesine çarptığımda, bilgisayarın hesapladığı sayıdan biri başka bir sayı olur ve hesaplamayı yanlış yapar mı?

Cevap genel olarak hayır, yazılım bu anlamda kırılgan değil.

Yapabileceğiniz şey, hatanın oluştuğu durumları izole etmek, hataya neden olan bu veri kümeleri arasındaki benzerliği bulmak ve bu kümeler ile doğru sonucu üreten diğer kümeler arasındaki farkı bulmaktır. Soruna neden olan belirli değerler kümesini tanımlayabilirsiniz. Örneğin, bir değişkenin her negatif değeri olduğunda, sonucun yanlış olduğunu görebilirsiniz.

Bellek bozulması hataları hakkında güncellenmiş bilgiler: Lütfen Bellek Bozulması'na bakın


bileşik yuvarlama hatalarını bu tür sorunların kaynağı olarak düşünüyordum. Tam olarak doğru (veya yanlış) giriş kombinasyonu, hepsinin olması gerektiği gibi olmayan bir sonuçla birleşmesine neden olana kadar uzun bir süre görünmeyebilirler.
jwenting

3
Modern işletim sistemleri, programların diğer programlara ait belleği değiştirmesine (hatta okumasına) izin vermez.
Péter Török

Evet, modern işletim sistemleri bu türden hiçbir şeye izin vermez.
DeadMG

"Eğer tam olarak aynı bilgi işlem ortamına sahipseniz, daha sonra bir programa X girişi verildiğinde daima aynı sonucu verecektir R" Bunun doğru olduğundan emin değilim. Bellek bileşenlerindeki SR mandallarından biri daha önceki bazı bozulmalar nedeniyle iki 1 alırsa ne olur? en.wikipedia.org/wiki/…
Yam Marcovic

@DeadMG ve Péter Török geri bildiriminiz için teşekkürler, mesajı düzenledim ve sorunun hala meydana gelebileceğini açıklayan bir sayfaya bir referans ekledim (metinde belirtildiği gibi, son derece olanaksız olduğunu biliyorum).
NoChance

5

Bir programda hata olmadığını ve asla yanlış gitmeyeceğini garanti edebilir misiniz? Hayır, maalesef değil.

Bir programın bunları bulma ve düzeltme maliyetinin bu eylemden elde edilen faydayı aştığını yeterince az sayıda hataya sahip olduğunu gösterebilir misiniz? Bana zaten sahipmişsin gibi geliyor.

Eski bir istatistik maksimumu yorumlamak için tüm programlar yanlıştır, ancak bazı programlar faydalıdır.


1
"Tüm programlar yanlış, ancak bazı programlar yararlı" için +1
CVn

Bu cevabın gerçekten alakalı olduğunu düşünmüyorum. Bazı çevresel kusurlar nedeniyle bazen doğru bir programın beklenmedik şekilde çalışıp çalışmayacağını soruyor gibi görünüyor .
Yam Marcovic

Bütün mesele, hiçbir programın "doğru" olmadığıdır. Her şey her zaman devam eden bir çalışmadır ve yanlış olana kadar her zaman haklıdır. Sonuçta bilgisayar bilimi bir bilimdir . Ne dediğini görüyorum ve bu onun sorununun odaklandığı yer olabilir. Ancak, bunun cevabımı daha az değil, daha alakalı hale getirdiğini düşünüyorum.
John N

@Hallainzil: Doğru "Merhaba, Dünya!" programları ve benzerleri. Doğru yararlı programlar bile yazdım (büyük programlar olmasa da).
David Thornley

2

Söyleyecek eğimli ediyorum hayır , bir programın olacağını ispat edemez asla mükemmel girişini varsayabiliriz bile yanlış veya hatalı bir sonuç sağlamaktadır.

Raku resmi doğruluk kanıtından bahsetti. Bu göz önünde bulundurulması gereken bir şey, ancak tamamen yanılmıyorsam, yine de mükemmel bir yürütme ortamı varsaymak zorunda kalacak. Bu nedenle, bir miktar zaman ve çaba ile, programın doğru olduğunu kanıtlayabilirsiniz , ancak bu, mükemmel girdi olsa bile , her zaman doğru sonuçları üreteceğini kanıtlamaz . Yürütme ortamı önemlidir. Ayrıca, girdinin her zaman mükemmel olduğunu varsaymak konusunda dikkatli olurum.

Bu nedenle, bazı yüksek kullanılabilirlikli durumlarda, birden fazla, tamamen bağımsız uygulamalar ve yürütme ortamları kullanılır ve sonuçlar, birbirlerinden kabul edilebilir bir hata payı içinde olduklarından emin olmak için karşılaştırılır. Bazı durumlarda, bu marj çok iyi olabilir. 1960'larda bile, bu, uzay aracına ayrı bilgi işlem donanımı setlerini içerecek kadar önemli görülüyordu. Hatalı bir statik deşarj, kozmik ışın veya her iki bilgisayarı aynı anda etkileyecek olsa bile, her ikisinin de aynı şekilde etkilenme olasılığı (özellikle de hem çalışıyor hem de geçerli görünümlü sonuçlar üretiyorsa) miniktir. Aynı hatanın iki tamamen ayrı uygulamaya bölünmesi ihtimali de oldukça düşüktür. Ve bunun gibi.


1

Çoğu (standart) bilgi işlemin deterministik olduğunu düşünüyorum.

Mümkünse, aynı giriş verileriyle 1000 veya 10000 vb.'lik bir toplu işlem yapacak şekilde ayarlayın ve sonuçların aynı olduğunu doğrulayın.

Hesaplamaya giren mevcut değerlerin herhangi bir yerde aşırı veya düşük akışa neden olacağından emin olun (daha eski bir sistemse, bu kadar uzun süre kullanılması amaçlanmamış olabilir).

Kimse var mı?


N yinelemeleri yapmak ve sonuçların doğruluğunu kanıtlamak için. En iyi ihtimalle, örnek kümesinde hata olmadığını kanıtlar ve hatta test durumunuzun (ve bunun uygulanmasının yanı sıra yürütülmesinin) kesinlikle doğru olduğunu varsayar. Testler çok faydalı olsa da, OP'nin endişesini gidermez.
CVn

@Michael Belki de açıklığa kavuşturmalıyım, bu yaklaşımla herhangi bir şeyi "kanıtlamaya" çalışmayı önermiyorum, ancak hatayı bir daha göstermeden on beş daha fazla yineleme giderse, güneş lekeleri ve tamsayı taşması değil düşünürdüm. Hala sana göre daha fazla fikir veriyor, IMHO.
jonsca

1

Makinedeki her bir biti ve devreden akan her elektriksel darbeyi kontrol edemezseniz, o zaman programınızla ilgili bir şeyin yanlış gitmeyeceğini kesin olarak garanti edemezsiniz. Bellek modülleri arızalanır, CPU'lar aşırı ısınabilir ve hatalar verebilir, sabit sürücüler verileri karıştırabilir ve güç kaynakları sisteme gürültü getirebilir. Donanım ne kadar pahalı ve donanım ne kadar fazla yedekli olursa, bu şeylerin ortaya çıkma olasılığı o kadar düşük olur, ancak bir noktada donanım başarısız olabilir.

Sonra işletim sistemi var, en gizemli tarafından gıdıklanabilir hataları ile akla gelebilir anlamına gelir. Derleyiciler, bozulmamış kodunuzu izlenmesi zor hatalara ustaca dönüştürmeyi bekleyen belirsiz hatalara da sahip olabilir. Dışarıda bir orman var ve kötü yazılımınız tüm bunlara karşı savunmasız. BAK!

Deneyimlerime göre, daha sık olmamakla birlikte, bir hesaplamada bir hata olduğunda, suçluyu bulmak için neredeyse o kadar çok kazmak zorunda değiliz. Genel olarak, kurumsal dünyada gördüğüm hemen hemen tüm hatalar, doğru hata ayıklama araçları ve bazı dirsek gresi ile kolayca bulunur.

Başka bir deyişle, donanım ve işletim sistemi mükemmel olmayabilir, ancak muhtemelen bu ayrıntı düzeyi hakkında endişelenmenize gerek kalmayacaktır. Sadece dili bilen ve bir hata ayıklayıcı ile kullanışlı birini bulun ve kazın.

“daha ​​basit açıklamalar, diğer şeyler eşit, genellikle daha karmaşık olanlardan daha iyidir.” - Occam'ın Jiletinin Özeti.


0

Evet, bir sisteme çarpmak, parçaları geçici bir açık devreye (veya muhtemelen kısa devre olmasına rağmen, muhtemelen daha az olası) neden olacak kadar bükebilir ve / veya taşıyabilir.


0

Sahip olduğum ilk bilgisayar 256 bayt belleğe sahip bir Altair 8080 idi. Giriş konsol anahtarlarından ve çıkış birkaç yanıp sönen ışıktan geliyordu. Kozmik ışınlara ve donanım arızalarına izin vermezseniz, üzerinde çalıştığım bazı programların her zaman aynı sonuçları üreteceğini kanıtlayabileceğime inanıyorum .

O zamandan beri hayır.


0

Test hataların varlığını değil varlığını gösterir (Edsger W. Dijkstra)

Programınızın test ederek doğru çalıştığını kanıtlamaya çalışıyorsanız, çalışmaz.

Bununla birlikte, teorik bilgisayar bilimlerinde yazdığınız yazılımın resmi bir kanıtını geliştirdiğiniz bazı yaklaşımlar vardır. Sisteminizin karmaşıklığına bağlı olarak, bu sıkıcı bir süreç olabilir. Bununla birlikte, sisteminiz bir dizi kısıtlı komut üzerinde çalışıyorsa, bu yaklaşımla başarılı olabilirsiniz.


Soruyu okudun mu?
Winston Ewert

Yaptım ve bir programın asla yanlış gitmeyeceğini garanti etmek için testleri kullanamayacağını söylüyorum. Sorusunun başlığı böyle diyor, değil mi?
Raku

Evet, başlık bunu söylüyor. Vücut açıkça yapmaz.
Winston Ewert

0

Donanım ve yazılım ortamları sabit bir akış halindedir. Hareketli parçalar, elektrik, sıcaklık, toz ve OS kodu değişiklikleri bunlara örnektir.

Bu nedenle, ortamın sürekli değiştiği için bir bilgisayar yazılım programının her zaman aynı şekilde davranmasının muhtemel veya beklenen bir şey olduğunu düşünmüyorum.

Yazılım beklendiği gibi uzun süre çalışabilir, ancak sonuçta ana işletim sistemi yazılımında küçük bir değişiklik değişecek ve bu da söz konusu programı etkileyecek veya donanımın değer katacaktır.

Bugünkü bilgisayarlardan bahsediyorum.


0

Şimdi sorum şu: Bir bilgisayar programı mantıklı bir neden olmadan aniden yanlış mı gidecek? Sunucu makinesine çarptığımda, bilgisayarın hesapladığı sayıdan biri başka bir sayı olur ve hesaplamayı yanlış yapar mı?

Bu sorunun cevabı bilinemez. Yaşadığımız evren için her zaman her şeyin doğru olduğunu kanıtlamak imkansızdır. Bunun yerine varsayımlar yaparız ve varsayımlar geçerliyse bazı karmaşık mülklerin de tutacağını kanıtlarız. Resmi olarak doğrulanmış programlar bunu garanti eder. Çoğu program resmi olarak doğrulanmamıştır, bunun yerine testler sağlayarak güven oluşturmaya çalışırlar. Bu testler, testlerin yapmak için tasarlandıkları şeyi yapmaları ve kullandığınız varsayımların, kullandığınız programın en azından bir süre çalışacağından emin olmanızı sağlar.


-1

Sorunun RAM'in başarısız olmasından kaynaklanması neredeyse imkansızdır, ancak bu nispeten (çok) olası değildir. Bir bellek testi yapın, ancak koda bakmaya hazır olun.


Downvoter'a - Bunun olduğunu gördüm. Bir Zamanlar.
James McLeod
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.