"IB" ve "UB" tam olarak ne anlama geliyor?


110

"IB" ve "UB" terimlerinin özellikle C ++ bağlamında birkaç kez kullanıldığını gördüm. Onları Google'da araştırmayı denedim, ancak görünüşe göre bu iki harfli kombinasyonlar çok kullanım görüyor. : P

Öyleyse, sana soruyorum ... kötü bir şeymiş gibi söylendiklerinde ne demek istiyorlar?


5
Başkasının düzenlemelerini geri almaya karar verirseniz, lütfen yazım, noktalama işaretleri ve dilbilginizin mükemmel olduğundan emin olun. Orijinal metne göre önemli bir gelişme olan düzenlemeleri geri almak anlamsızdır.
Robert Harvey

Yanıtlar:


139

IB: Uygulama Tanımlı Davranış. Standart, kesin davranışı tanımlamayı belirli bir derleyiciye / platforma bırakır, ancak bunun tanımlanmasını gerektirir.

Uygulama tanımlı davranışı kullanmak yararlı olabilir, ancak kodunuzu daha az taşınabilir hale getirir.

UB: Tanımsız Davranış. Standart, tanımsız davranışı çağıran bir programın nasıl davranması gerektiğini belirtmez. Teorik olarak iblisleri burnunuzdan uçurabildiği için "nazal iblisler" olarak da bilinir.

Tanımlanmamış davranış kullanmak neredeyse her zaman kötü bir fikirdir. Bazen işe yarıyor gibi görünse bile, ortam, derleyici veya platformdaki herhangi bir değişiklik kodunuzu rastgele kırabilir.


11
Hala C ++ 'da tanımsız davranışlar kullandığı için birinin burnundan uçan bir iblis bekliyorum. İlk derleyiciler yeni C ++ standardına tam olarak uyduğunda olacağını tahmin ediyorum.
OregonGhost

4
@OregonGhost: Sanırım haklısın. Bunun tek boynuzlu atlarda birkaç kez olduğunu gördüm, ama asla iblisler olmadı.
Thomas

33
@OregonGhost - standart bir iblisin kaç boynuza sahip olması gerektiğini belirtmez.
DVK

5
@Michael Burr: "Ateş yakmayı" tercih ederim. Belli ki felakettir ve en azından belirsiz bir inandırıcılık havasına sahiptir (kuşkusuz, bu konuyu okuduğunuz herhangi bir sistemde yazılım arızası yerine donanım nedeniyle bilgisayar donanımı bazen alev alır).
Steve Jessop

1
Bu soruyu cevaplamayan hiç kimsenin 30 binden daha az itibarı olmaması komik.

19

Uygulama tanımlı davranış ve Tanımlanmamış davranış

C ++ standardı, çeşitli yapıların etkileri konusunda çok spesifiktir ve özellikle bu sorun kategorilerinin her zaman farkında olmalısınız :

  • Tanımlanmamış davranış, kesinlikle hiçbir garantinin verilmediği anlamına gelir. Kod işe yarayabilir veya sabit sürücünüzü ateşe verebilir veya iblislerin burnunuzdan uçmasına neden olabilir . C ++ dili söz konusu olduğunda, kesinlikle her şey olabilir. Pratik anlamda, bu genellikle kurtarılamaz bir hatanız olduğu anlamına gelir. Bu olursa, uygulamanızla ilgili hiçbir şeye gerçekten güvenemezsiniz (çünkü bu tanımlanmamış davranışın etkilerinden biri, uygulamanızın geri kalanı tarafından kullanılan belleği bozmak olabilir). Tutarlı olması gerekli değildir, bu nedenle programı iki kez çalıştırmak farklı sonuçlar verebilir. Ayın evrelerine, giydiğiniz gömleğin rengine veya kesinlikle başka herhangi bir şeye bağlı olabilir.

  • Belirtilmemiş davranış, programın mantıklı ve tutarlı bir şey yapması gerektiği anlamına gelir, ancak bunu belgelemesine gerek yoktur .

  • Uygulama tanımlı davranış, belirtilmemiş davranışa benzer, ancak derleyici yazarlar tarafından da belgelenmelidir. Buna bir örnek, bir reinterpret_cast. Genellikle , sadece adresi değiştirmeden, bir kalem türünü değiştirir, ancak bir derleyici böylece haritalama, aslında uygulama tanımlı olduğu verebilir sürece bu seçimi belgelendiği gibi, tamamen farklı bir adrese map. Başka bir örnek de int boyutudur. C ++ standardı 2, 4 veya 8 bayt olması umurunda değil, ancak derleyici tarafından belgelenmesi gerekiyor

Ancak bunların hepsinde ortak olan, en iyi şekilde kaçınılmalarıdır. Mümkün olduğunda, C ++ standardının kendisi tarafından% 100 belirtilen davranışa bağlı kalın. Bu şekilde taşınabilirlik garanti edilir.

Sıklıkla bazı uygulama tanımlı davranışlara da güvenmeniz gerekir. Bu kaçınılmaz olabilir, ancak yine de buna dikkat etmeli ve farklı derleyiciler arasında değişebilecek bir şeye güvendiğinizi bilmelisiniz.

Öte yandan, tanımlanmamış davranışlardan her zaman kaçınılmalıdır. Genel olarak, programınızın bir şekilde patlamasına neden olduğunu varsaymalısınız.


1
Taşınabilirliği önemsiyorsanız UB'den kaçınılmalıdır . Belirli bir uygulama, belirli tanımlanmamış davranışlar için ne olacağını tanımlayabilir ve bazı durumlarda (özellikle aygıt sürücüleri ve daha küçük gömülü sistemler) bunları kullanmanız gerekir.
Jerry Coffin

3
@ Jerry: Hayır, tamamen tanımlanmamışsa UB'den kaçınılmalıdır . Platform / uygulama / çalışma zamanı / derleyici daha fazla garanti veriyorsa, davranışa güvenebilir ve taşınabilirliği kaybedebilirsiniz. Ama o zaman artık tam olarak tanımlanmamış değil ... Yine de çoğu zaman böyle bir garantiniz yoktur ve tanımsız sadece tanımsızdır ve her ne pahasına olursa olsun kaçınılmalıdır.
jalf

"tutarlı", belirlenmemiş davranışın yanıltıcı bir açıklaması olabilir. Bir ekspresyon "belirtilmemiş değeri" sonra sonuç olmalıdır varsa, örneğin, işlem genel bağlamında tutarlı olmak zorunda olduğu kadar ilgili daha sonra depolanmış değeri, daha sonra tek başına eşit karşılaştırmak gerekir depolamak ve eğer bir değer. Ancak belirtilmemiş sonuçların zaman içinde tutarlı olması (tekrar çalıştırırsanız aynı girdi için aynı çıktı) veya hatta deterministik olması gerekmez.
Steve Jessop

"artık tam olarak tanımsız değil" - tam olarak standart tarafından tanımsızdır ve UB, standart tarafından tanımlanmamış bir kısa el anlamına gelir. Örneğinizde uygulama tarafından tanımlanmıştır. Bu nedenle , nesne kodunu kontrol ettiyseniz ve bir daha asla yeniden derlemeyi planlamıyorsanız , standart veya uygulama tarafından tanımlanmayan davranışa güvenebilirsiniz ;-)
Steve Jessop,

"daha sonra kendisine eşit karşılaştırmalı". Hmm, bir NaN değilse. Her neyse, türünün gerektirdiği davranışa sahip olmalıdır.
Steve Jessop

8
  • IB: uygulama tanımlı davranıştır - derleyici ne yaptığını belgelemelidir. Bir gerçekleştirme >>negatif değer işlemi bir örnektir.

  • UB: tanımsız davranış - derleyici, sadece çökme veya öngörülemeyen sonuçlar verme dahil olmak üzere her şeyi yapabilir. Bir boş göstericinin başvurusunu kaldırmak bu kategoriye girer, ancak aynı zamanda bir dizi nesnesinin sınırlarının dışında kalan işaretçi aritmetiği gibi daha ince şeyler de vardır.

Bir diğer ilgili terim ise 'belirtilmemiş davranış' tır. Bu, uygulama tanımlı ve tanımsız davranışlar arasındadır. belirtilmemiş davranış için, derleyici standarda göre bir şeyler yapmalıdır, ancak standardın verdiği tam olarak hangi seçenekleri derleyiciye verir ve tanımlanması (hatta tutarlı olması) gerekmez. Alt ifadelerin değerlendirme sırası gibi şeyler bu kategoriye girer. Derleyici, bunları istediği sırada gerçekleştirebilir ve farklı yapılarda veya hatta aynı yapının farklı çalıştırmalarında farklı şekilde yapabilir (olası değildir, ancak izin verilir).


4

Kısa versiyon:

Uygulama tanımlı davranış (IB): Doğru programlanmış ancak belirsiz *

Tanımsız davranış (UB): Yanlış programlanmış (yani bir hata !)

*) Dil standardı söz konusu olduğunda "belirsiz", elbette herhangi bir sabit platformda belirlenecektir.


Standart, bir eylemin Uygulama Tanımlı Davranışı çağırdığını belirtirse, uygulamaların bu eylemden kaynaklanan tutarlı bir davranışı belirtmesi gerekir . Ne yazık ki, olası sonuçları belirtmek için bir uygulamanın gerekli olacağı, ancak belirli bir sonucun tutarlı bir şekilde meydana gelmesi gerekmeyeceği bir davranış kategorisi yoktur.
supercat

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.