C ++ 26'daki sözleşmeler: Değerlendirme Anlambilim | Haberler Online

C ++ 26'da sözleşmeli son makalemdeki sözleşmelerin ayrıntılarını kısaca tanıttıktan sonra, sözleşmelerin derin bir görünümü, şimdi çok ilginç değerlendirmenin anlambilimine daha yakından bakmak istiyorum.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.

Bir sözleşme bir açıklama ise, değerlendirmenin dört semantiğinden biri kullanılır: ignore,, observe,, enforce VE quick-enforce. Tablo, dört anlambilime genel bir bakış sunuyor:

(Resim: Rainer Grimm)

Ne yazık ki, şu anda bu değerlendirmenin anlambilimini tam olarak görmek mümkün değildir.

Kontrol semantiği sadece sözleşme sistemini değerlendirirken, terminal semantiği de programı sona erdirir.

Bahsedilen dört değerlendirme semantiğinin tümü standart bir uyumluluk uygulaması uygulamamalıdır. Semantiğini de sunabilir.

Adından da anlaşılacağı gibi, onu görmezden gelir ignore-Bar yüklem değerlendirmesi. Ancak, yüklem sözdizimsel olarak doğru olmalıdır.

. observe-Ayantantik bir kontrol semantiğidir. Genel olarak, üç koşul sözleşmenin ihlaline yol açabilir:

  • Yüklemin değerlendirilmesi false Geriye doğru.
  • Yüklemin değerlendirilmesi bir istisnaya neden olur.
  • Yükleme, derleme sırasında değerlendirilir, ancak yüklem sabit bir ifade değildir.

Derleme döneminde sözleşmenin ihlali meydana gelirse, bir teşhis ve sürekli derleme yapılır.

Sonunda sözleşmenin ihlali meydana gelirse, sözleşme ihlalinin yöneticisi bir nesne tarafından veri türüne göre geri çağrılır const std::contracts::contract_violation Sözleşmenin ihlali hakkında bilgi içerdiğini ifade eder. Sözleşme ihlali normal olarak geri dönerse, programın yürütülmesi devam eder.

. enforce-Mantic, sonunda sözleşme ihlali yöneticisini çağırıyor. Program, sözleşme yöneticisi normal geri döndüğünde sona erer. . enforce-Ayantic, sözde terminal semantiğidir. Bu, sözleşmenin ihlali durumunda programın yürütülmesinin sona erdiği anlamına gelir. Dolayısıyla aşağıdaki eylemlerden biri gerçekleştirilebilir:

  • Araştırmak std::terminate,,
  • Araştırmak std::abort VEYA
  • İnfazın hemen sona ermesi.

Derleme derleme döneminde iptal edilir.

. quick-enforce-Ayantic, sonunda sözleşme ihlali yöneticisini çağırmaz. Program bir terminal semantiği olarak sona erer. Bu durumda, örneğin __builtin_trap() kullanılmış.

Derleme derleme döneminde iptal edilir.

Sözleşme İhlal Yöneticisi aşağıdaki imzaya sahiptir:

void handle_contract_violation( std::contracts::contract_violation );

Uygulama, sözleşmenin standart ihlalini sağlar. Bununla birlikte, standart sözleşmenin bu ihlalinin bir gelenekten değiştirilmesine de izin verebilir.

Mükemmel sunumunda, VIG 2025 Timur Dougler üzerindeki C ++ sözleşmeleri, sözleşmeli ihlal operatörlerinin kişiselleştirilmiş gerçekleri bazı heyecan verici örneklerini tanıttı:


// Protokollierung
  
void handle_contract_violation( std::contracts::contract_violation violation ) {
    LOG(std::format("Contract violated at: {}n", violation.location()));   
}

// Setze einen Haltepunkt
  
void handle_contract_violation( std::contracts::contract_violation violation ) {
    std::breakpoint();
}

// Warte, bis ein Debugger angeschlossen ist
  
void handle_contract_violation( std::contracts::contract_violation violation ) {
    
while (!std::is_debugger_present())
     /* spin */

    std::breakpoint();
}

// Stacktrace ausgeben
  
void handle_contract_violation( std::contracts::contract_violation violation ) {
    std::cout << std::stacktrace::current(1);
}

// An den Standard-Handler für Vertragsverletzungen übergeben
  
void handle_contract_violation( std::contracts::contract_violation violation ) {
    std::cout << std::stacktrace::current(1);
    std::contracts::invoke_default_contract_violation_handler(violation);
}

Son olarak, nesnenin arayüzünü istiyorum std::contracts::contract_violation Sözleşme suçlusunun aldığını belirtin:

  • kind Sözleşmenin ihlali türünü iade eder.
  • semantic Sözleşmenin ihlali meydana geldiğinde bir değerlendirme anlambilimini döndürür.
  • is_terminating Değerlendirme anlambilim sona ererse geri döner.
  • detection_mode Sözleşmenin ihlal edilmesinin nedenini verir.
  • evaluation_exception Bir tane verir Std :: istisna_ptrzur İLE Yüklem değerlendirmesi sırasında tetiklenen istisna.
  • comment Sözleşmenin ihlali için açıklayıcı bir dize döndürür.
  • location Bir tane verir std::source_location Sözleşmenin ihlali yerini gösteren geri.

Hakkında daha fazla bilgi std::contracts::contract_violation-Perferans sayfayı bulabilirsiniz.

Bir sonraki makalemde, C ++ 26'nın en küçük özelliklerine odaklanacağım. Ana dildeki küçük güvenlik özellikleriyle başlıyorum.


(RME)


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir