2010-08-12 22 views
5

Bir C++ kitaplığındaki/özel bir durumdaki istisnalar atmanın özellikle DLL'lerde ve özellikle de arama kodu ve kitaplığın farklı derleyicilerle derlenmesi durumunda potansiyel olarak tehlikeli olabileceğini duydum. Bunun için bir gerçek var mı? Statik kütüphanelere sadık kaldığım sürece güvenli mi? Ben sadece kütüphanede istisnaların iç kullanımı hakkında konuşmuyorum unutmayın, ben de çağrı kodu içine derin onları atmak istiyorum :)Statik olarak bağlantılı C++ kütüphanelerinden istisnalar atmak güvenli değil mi?

Sadece açıklamak için: Ben gibi sınıf Foo tanımlayan derlenmiş bir statik kütüphanesi var mı Bu:

class Foo 
{ 
public: 
    // Constructor 
    Foo() 
    { 
     /* ... Do stuff ... */   
     if (stuffwentwrong) 
      throw(123); // We throw an integer error code (to make it simple) 
    } 
}; 

Ve biraz adam şöyle kullanır:

try 
{ 
    Foo foo_object; 
} 
catch (int i) 
{ 
    std::cout << "Oh bum. Code: " << i; 
} 

bu güvenli olur mu?

+0

(dinamik tek başınıza DLL boşaltma/yükleme gibi korkak şeyler yapıyorsun sürece) (yaklaşık 15 yıl önce) bu çözüldüğünü sorunlar vardı. Sadece bir DLL kullanarak düz iseniz o zaman iyi olmalısınız. –

cevap

3

ve özellikle arama kodu ve kütüphane uyumlu ABI yok farklı C++ derleyiciler karştramazsnz genellikle değişik derleyiciler

You

ile derlenmiş olup olmadığını. Yani, örneğin, MSVC ile derlenmiş kütüphaneden istisna alamazsınız ve GCC ile 'u yakalamaya çalışabilirsiniz.

Aksi takdirde genelde sorun yok demektir.

Küçük bir not:

MSVC onları karışmaz birkaç uyumsuz istisna modelleri vardır.

+0

genel olarak tehlikeli olmasına sebep olan birçok incelik var. Örneğin, DLL, CRT'nin farklı bir sürümü ile derlenmişse, vidalanırsınız (örneğin, hata ayıklama sürümüne karşı veya çoklu iş parçacıklı ve tek iş parçacıklı).Ayrıca CRT, modül düzeyindeki belli bir seviyeyi (örneğin hModule veya bellek izleme bilgileri) değil, modül seviyesinde depolar; böylece, CRT bağımlı nesnelerini DLL sınırları boyunca ilettiğinizde, bunların tümü senkronizasyondan kurtulabilir. Ve hatalar çalışma zamanında ve çok ince/kafa çiziciler olabilir. Genel olarak bundan kaçının. – tenfour

0

Sizin verdiğiniz örnek, DLL'lerle birlikte, ayrılan bir özel durum ayırırsanız, DLL ile çalışırken ayrılan yığın istisnasını serbest bırakmaya çalışırsa çökecektir.

3

GCC ile ilgili olarak, GCC gelen alıcı istisnalar kütüphaneler sorunlu olabilir paylaşılan oluşturulan en az bir olayda var yani sembol görünürlük varsayılan olarak "hidden" olduğunda paylaşılan kitaplıktan throw edebilmek türü ihracat unutmadan zaman. GCC Visibility Wiki sayfası, sorun hakkında ve nasıl önleneceği konusunda iyi bir ayrıntıya giriyor.

Windows DLL'lerinin benzer sorunları olup olmadığından emin değilim, ancak olası görünüyor.

1

o DLL ve istisnalar söz konusu genel yakaladım:

başlığındaki istisnalar sınıf inline uygulamak vermeyin. Yinelenen vtables ve RTTI bilgileri ile sonuçlanacaksınız, kullanım kodunda yakalanmayan istisnalarla sonuçlanacaksınız (çoğaltma nedeniyle istisna başka bir tür olarak kabul edilir).

ayrıntıları:

http://marcmutz.wordpress.com/2010/08/04/fun-with-exceptions/

İlgili konular