2015-04-23 13 views
9

Bir açık kaynak kitaplığından bir işlev kullanmaya çalışıyorum. Bu işlev, varsayılan olarak dışarıda gösterilmiyor (bu nedenle, doğrudan kaynak kitaplığı tarafından sağlanan yardımcı işlev olmadığına inanıyorum), ancak kodumdaki bazı sorunları çözmek için bu işleve ihtiyacım var, bu yüzden bir şekilde makefile'de bazı değişiklikler yaptım. kütüphaneden işlevBir işlevin reentrant olup olmadığını nasıl bulurum?

Şimdi, bu işlevin yeniden girişe dahil olduğundan emin olun.

Çıplak gözle bulamıyorum, çünkü dahili olarak bir dizi işlevi çağırıyor.

Kesin olması için, fonksiyonumun sadece yerel değişkenleri kullanıp kullanmadığını ve global değişkenleri değiştirmediğini kontrol etmek için herhangi bir araç olup olmadığını veya GDB'de herhangi bir seçenek olup olmadığını bilmek istiyorum.

+6

Eğer emin değilseniz ve değiştirebiliyorsanız (öyle görünüyor), bazı statik mutekslerle yeniden giriş yapmaya çalışın. –

+1

disasembled kodunu kontrol edebilirsiniz. Muhtemelen bu çabaya değmez ... –

+0

Sadece işlevi çağırıp, arayarak arayarak arayarak işlevi tekrar arayabilir ve ne olduğunu görebilirsiniz. Kötü davranıyorsa. –

cevap

1

Bir işlevin uyumlu olup olmadığını belirleme yolu, ne olduğunu analiz etmektir. 1) Bu globals üzerindeki işlemler atomik olmadıkça (örn., Bir globalin aynı anda okunup değiştirilmesinin bir yolu olmadığı sürece) globals'a erişim yoktur. Bu genellikle globals kullanmaktan kaçınmak veya bunlara senkronize erişim sağlamak anlamına gelir - örn. Bir global değiştiren ve okuyan tüm kodlar bitinceye kadar bir mutex tutar, böylece işlemler serileştirilir. Veya kod, kendi kendini değiştiren bir kod değildir (neyse ki, kendi kendini değiştiren kod standart C veya C++'da nispeten nadirdir). 3) Tekrarlayan fonksiyonlar olmayan (standart kütüphanede çok sayıda fonksiyon içeren) veya programlarda (ör. Çoklu işlem genellikle tekrarlama sağlamak için gerekli kontrolü zorlaştırır) diğer işlevleri çağırmaz.

Yeniden girmeyi belirleyen bir işlevi çözümlemek için herhangi bir aracın farkında değilim. Genellikle bir işlev, reentran (veya değil) olacak şekilde tasarlanmıştır. Pratikte, bir fonksiyonun reentrant olarak tasarlandığını söyleyen bir dokümantasyon yoksa, bu durum adil bir bahistir ve reentrant değildir.