2011-06-16 15 views
9

MWEgcov ve küresel yıkıcılar

#include <iostream> 

struct Foo { 
    Foo() { 
    std::cout << "Constructing Foo " << this << std::endl; 
    } 

    ~Foo() { 
    std::cout << "Destructing Foo " << this << std::endl; 
    } 
}; 

Foo global_foo; 

int main() { 
    std::cout << "Entering and exiting main()" << std::endl; 
    return 0; 

}

sorun

opsiyon -fprofile-arcs -ftest-coverage yukarıda derlemek programı runn ve sonra gcov çalıştırın. Program çıkışı, bu sırayla Foo :: Foo(), main() ve Foo :: ~ Foo() öğelerinin çağrıldığını açıkça gösterir. Gcov çıkışı Foo :: Foo() ve main() 'ın çağrıldığını, ancak Foo :: ~ Foo() olmadığını gösterir.

Temel neden

küresel nesneler bir GNU iç çıkış işleyici tarafından yok edilir (at_exit kayıtlı fonksiyonu()). Son gcov istatistikleri başka bir çıkış işleyicisi tarafından üretilir. Gcov çıkış işleyicisi, genel olarak imha çıkış işleyicisinden önce çağrılır, bu nedenle gcov, yıkıcıların çağrıldığını görmez.

Hata durumu

Bu gcov eski, eski hatasıdır. İşte Bugzilla linki: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970. Hata hala dokuz yıl sonra, en azından i686-apple-darwin10-g ++ - 4.2.1 arasındadır.

soru

bu, ben yaşamak zorunda şey gcov bir çözümlenemeyen hata mi, yoksa (dokuz yaşında ve tamamen unutulmuş) sızabiliyor olması sadece bir şeydir? İkincisi ise, nasıl düzeltilir?

+0

Bazı yükseltmeler, bir downvote (yorum yok?), Ancak şu ana kadar hiçbir yanıt veya yorum yok. Yığın taşma üyelerinden herhangi birinin gcc geliştirme ekibi ile iletişim kurmanın bir yolu var mı? –

cevap

2

İlk kapalı, bu hata raporunun 2005'ten beri yeniden doğrulanmadığını unutmayın; Muhtemelen kötü davranışı hala g ++ - olarak gördüğünüzü söyleyen bir not eklemelisiniz - 4.2.1. İletiniz üzerinde kimse hareket etmese bile, o bilgiyi oraya taşımak yararlı olur.

Kısa vadede gcov kullanmaya devam etmek istiyorsanız onunla yaşamak zorundasınız. Bunun yerine, lcov'u düşünebilirsiniz, bu da size belirtilen satırları kapsama analizinden çıkartabilme olanağını verir. Adil uyarı: Bunun güzel olduğunu duydum ama hiç kullanmadım.

Orta vadeli, bu hata izleyiciye yanıtı ekleyin! Garantiler yok, ama belki de bu bir çeşit ruhun size bir yama yazması için yeterli ilgiyi yaratacaktır.

Uzun süre, eğer kimse sizin için yamaya hazır değilse, bunu kendiniz yayabilirsiniz. gcc, dünyanın en eğlenceli kod tabanı değildir ve değişikliklerin kabul edilmesi bir macera olabilir, ancak buna gerçekten ihtiyacınız varsa, bunu gerçekleştirebilirsiniz.

Şansın en iyisi.

+2

Yanıt için teşekkürler. Bugzilla raporuna ekledim. Kısa vadeli cevap açıkça "onunla yaşamak". Ürünümüz, birincil kullanım amacı otomatik kodlanmış bir simülasyon ortamında bulunan bir C++ kütüphanesidir. Bu bizim hedeflediğimiz hedef olduğu için, testlerimizin çoğu bu ortamda yapılır. Bu ortamın en yeni enkarnasyonu, global statik veri oluşturur. Ayrıca bu çevreyi atlayan bir birim test kabiliyetimiz var.Bu nedenle, bariz bir çözüm geliştiricilerin ctor_dtor ünite testleri geliştirmesini şart koşmaktadır. (Ben bunu yaptım ve zaten eziyetleri duyuyorum.) –