Ne kadar kötü ve; " eğer (!bu)&; C üyesi bir işlev"? | Netgez.com
SORU
12 Ocak 2012, PERÅžEMBE


Ne kadar kötü ve; " eğer (!bu)&; C üyesi bir işlev"?

Eğer bir uygulama if (!this) return; yapan eski kod bulursam, ciddi bir risk böyle mi? Uygulama-geniş bir acil arama gerektiren ve çaba yok eden tehlikeli bir saatli bomba mı, yoksa sessizce yapılabilir bir kod koku gibi mi?

Planlama değilimyazmabu kod, elbette. Daha doğrusu, son zamanlarda eski çekirdek bir kütüphane uygulaması birçok parça tarafından kullanılan bir şey keşfettim.

CLookupThingy a sınıfı var düşününsanal olmayanCThingy *CLookupThingy::Lookup( name ) üye işlevi. Görünüşe göre bir programcı arkadaki kovboy gün karşılaşılan birçok çöker NULL CLookupThingy *s edildiklerini geçti işlevleri ve yerine sabitlemek yüzlerce arama siteleri, o sessizce Sabit Arama():

CThingy *CLookupThingy::Lookup( name ) 
{
   if (!this)
   {
      return NULL;
   }
   // else do the lookup code...
}

// now the above can be used like
CLookupThingy *GetLookup() 
{
  if (notReady()) return NULL;
  // else etc...
}

CThingy *pFoo = GetLookup()->Lookup( "foo" ); // will set pFoo to NULL without crashing

Bu gem bu hafta başında keşfettim, ama şimdi bunu düzeltmek gerek olmadığı konusunda çelişkiye düşüyorum. Bu çekirdek bir kütüphane uygulamaları tarafından kullanılır. Bu uygulamalar birkaç zaten milyonlarca müşteriye sevk edilmiş ve iyi çalışıyor gibi görünüyor; bu koddan çöker veya başka bir böcek vardır. Arama fonksiyonu if !this kaldırma olabilecek BOŞ geçmesi çağrısı binlerce site sabitleme anlamına gelecektir; kaçınılmaz olarak bazı rasgele yanındaki açılır yeni hatalar tanıtmak özleyeceğizyılgelişme.

Kesinlikle gerekmedikçe yalnız bırak, yanayım.

Teknik olarak tanımlanmamış bir davranış olduğu göz önüne alındığında, ne kadar tehlikeli uygulamada if (!this)? Emek adam-hafta yetecek kadar tamir etmek, ya da GCC ve MSVC sağ salim dönmek sayabiliriz?

Bizim app MSVC ve GCC üzerinde derler ve Windows, Ubuntu, MacOS üzerinde çalışır. Diğer platformlar için taşınabilirlik ilgisi yoktur. Söz konusu işlevi hiçbir zaman sanal olarak garanti edilmektedir.

Düzenleme:Aradığım objektif cevap gibi bir şey

  • "Güncel sürümleri GCC ve MSVC bir ABÄ° nerede türünden üyeleri gerçekten statiÄŸi ile örtülü bir 'bu' parametresi; bu nedenle onlar güvenli bir ÅŸekilde ÅŸube) adında bile 'bu " BOÅž" ya
  • "GCC önümüzdeki bir sürüm bile pratik fonksiyonlar sınıf iÅŸaretçisi, ÅŸube hedef yüklenmesini gerektirir ki ABÄ° deÄŸiÅŸecek" dedi ya
  • örtülü bir parametre ile doÄŸrudan dalları gibi türünden üyeleri derler bazen "geçerli GCC 4.5 tutarsız bir ABÄ° var, ve sınıf-ofset iÅŸaretçiler fonksiyonu olarak bazen."

Kodu; ikinci kırmak için kokmuş düşüktür eski anlamı, derleyici bir yükseltmeden sonra test için bir şey; ikincisi Acil Eylem bile yüksek maliyet gerektirir.

Açıkça bu gizli bir hata olmasını bekliyor, ama şu anda sadece özel Derleyiciler riskin azaltılması için endişeleniyorum.

CEVAP
12 Ocak 2012, PERÅžEMBE


Onu yalnız bırakmam. Bu SafeNavigationOperator eski kafalı bir versiyonu olarak bilinçli bir tercih olabilir. Dediğiniz gibi, yeni bir kod, bunu tavsiye etmem, ama varolan kodu için yalnız bırakacağım. Eğer bu değiştirme sonunda yaparsanız, tüm aramalar için iyi kaplı testi ile emin olmak istiyorum.

Düzenlemek için:olabilirkod): hata ayıklama sürümleri sadece bunu kaldırmak için seçin

CThingy *CLookupThingy::Lookup( name ) 
{
#if !defined(DEBUG)
   if (!this)
   {
      return NULL;
   }
#endif
   // else do the lookup code...
}

Bu nedenle, hata ayıklama modunda test etmek için bir şans verirken üretim kodu bir şey kırmak olmaz.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • Hak5

    Hak5

    7 EYLÃœL 2005
  • tinycammonitor

    tinycammonit

    14 Aralık 2010