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
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.
Tekiz bu kadar kötü olan ne?...
Neden&; dizi yineleme için... "* o kad...
Bir Flash tabanlı web sitesi hakkında ...
'in o kadar da kötü Tembel ne g/Ç...
Ne kadar kötü Android kolaylaştırılmış...