Onaylamaları
Onaylama işlemi deyimi programınızda bir noktada doğru olmasını beklediğiniz bir koşulu belirtir.Bu koşul doğru ise, onaylama işlemi başarısız, programınızın kesildiği ve onaylama işlemi başarısız iletişim kutusu görünür.
Visual c++ üzerinde aşağıdaki yapıları bağlı onaylama işlemi ifadeleri destekler:
mfc onaylamaları için mfc programlar.
atlassert ATL kullanan programlar için
crt onaylamaları için c çalışma zamanı kitaplığı kullanan programlar.
ANSI işlevi onaylama işlemi c/C++ diğer programlar için.
Onayları, mantık hataları yakalamak, bir işlemin sonuçları denetleyin ve işlenmiş hata durumları sınamak için kullanabilirsiniz.
Bu konuda
Onayları nasıl çalışır?
Hata ayıklama ve yayın yapıları içinde onayları
Onayları kullanımının yan etkileri
crt onayları
mfc onayları
mfc ASSERT_VALID ve CObject::AssertValid
AssertValid sınırlamaları
Onayları kullanma
Mantık hataları yakalamak
Sonuçları denetleme
Bulma işlenemeyen hatalar
Onayları nasıl çalışır?
Hata ayıklayıcı duraklatan bir mfc ya da c çalışma zamanı kitaplığı onaylaması zaman kaynağı kullanılabiliyorsa, sonra hata ayıklayıcı kaynak dosyasında onaylama işlemi oluştuğu noktayı gider.Her ikisinde de onay iletisi görüntülenir Output penceresi ve Onaylama işlemi başarısız oldu iletişim kutusu.Onay iletisinden kopyalayıp Çıkış ileride başvurmak üzere kaydetmek istiyorsanız, metin penceresi için pencere.Çıkış pencere başka hata iletileri de içerebilir.Bu iletileri onaylama işlemi hatasına neden için ipuçları sağladıkları için dikkatlice inceleyin.
Geliştirme sırasında hata algılamaya onayları kullanın.Bir kural olarak, bir onaylama işlemi her varsayımı için kullanın.Örneğin, bağımsız değişken null olmadığını varsayalım, bir onaylama işlemi bu varsayım test etmek için kullanın.
Bu konuda
Hata ayıklama ve yayın yapıları içinde onayları
Onaylama işlemi deyimleri yalnızca derleme _DEBUG tanımlanır.Aksi durumda, derleyici onayları null deyimlerini değerlendirir.Bu nedenle, onaylama işlemi ifadeleri dayatır ek bir yük getirmez veya performans maliyeti son sürümü programınızda ve kullanmaktan kaçının izin #ifdef yönergeleri.
Onayları kullanımının yan etkileri
Kodunuzda onayları eklediğinizde, onayları yan etkileri olmayan emin olun.Örneğin, aşağıdaki onay değiştiren düşünün nM değeri:
ASSERT(nM++ > 0); // Don't do this!
Çünkü ASSERT , programınızın yayın sürümünde ifade değerlendirilecek değil nM hata ayıklama ve yayım sürümlerinde farklı değerlere sahip olacaktır.MFC'deki bu sorunu önlemek için kullanabileceğiniz doğrulama yerine makro ASSERT.VERIFYtüm sürümlerinde ifade olarak değerlendirilir ancak sonuç yayın sürümünde denetlemez.
İşlev değerlendirme olabileceği için işlev çağrıları belirtilme deyimlerinde kullanırken özellikle dikkatli olması beklenmeyen yan etkileri.
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe
VERIFYÇağrı myFnctn hata ayıklama ve yayım sürümlerinde, bu nedenle onu kullanmak için kabul edilebilir.Ancak, kullanarak VERIFY bir yayım sürümünü gereksiz işlev çağrısında yükü getirir.
Bu konuda
crt onayları
crtdbg.H üstbilgi dosyası tanımlar _assert ve _asserte makroları onaylama işlemi denetleme.
Makro |
Sonuç |
---|---|
_ASSERT |
Belirtilen ifade yanlış olarak değerlendirilirse dosya adı ve satır sayısı _ASSERT. |
_ASSERTE |
Aynı _ASSERT, artı hattının ifade bir dize gösterimini. |
_ASSERTEYANLIŞ dönüştü asserted ifade rapor ettiğinden daha güçlüdür.Bu sorunu olan kaynak koduna başvuruda bulunmadan tanımlamak için yeterli olabilir.Ancak uygulama hata ayıklama sürümünü kullanarak hattının her ifade için bir dize sabiti içerir _ASSERTE.Pek çok kullanırsanız, _ASSERTE makrolar, bu string ifadelerin önemli miktarda bellek alın.Kullanmak, bir sorun olduğu durumlarda, _ASSERT Bellek kazanmak için.
Zaman _DEBUG tanımlanan, _ASSERTE makrosu aşağıdaki gibi tanımlanır:
#define _ASSERTE(expr) \
do { \
if (!(expr) && (1 == _CrtDbgReport( \
_CRT_ASSERT, __FILE__, __LINE__, #expr))) \
_CrtDbgBreak(); \
} while (0)
Asserted ifade yanlış olarak değerlendirilirse _CrtDbgReport (varsayılan olarak ileti iletişim kutusunu kullanarak) onaylama işlemi hatası rapor için çağrılır.Seçerseniz yeniden ileti iletişim kutusunda, _CrtDbgReport 1 değerini döndürür ve _CrtDbgBreak üzerinden hata ayıklayıcısını kullanacaksınız DebugBreak.
Yığın Bozulması için denetleme
Aşağıdaki örnek _CrtCheckMemory öbek bozulma olup olmadığını denetleyin:
_ASSERTE(_CrtCheckMemory());
İşaretçi geçerlilik denetimi
Aşağıdaki örnek _CrtIsValidPointer verilen bellek aralığı okuma veya yazma için geçerli olduğunu doğrulamak için.
_ASSERTE(_CrtIsValidPointer( address, size, TRUE );
Aşağıdaki örnek _CrtIsValidHeapPointer gösteren bir işaretçi için yerel yığın bellekte doğrulamak için (yığın oluşturulur ve c Çalışma Zamanı Kitaplığı'nın bu örneği tarafından yönetilen — bir dll kitaplığı ve bu nedenle Uygulama yığın dışında kendi yığın kendi örneği olabilir).Bu onaylama işlemi yalnızca null yakalar değil veya out-of-bounds, ancak statik değişkenler, yığın değişkenlerini ve diğer yerel olmayan bellek de işaretçiler giderir.
_ASSERTE(_CrtIsValidPointer( myData );
Bir bellek bloğu denetleme
Aşağıdaki örnek _CrtIsMemoryBlock bir bellek bloğu yerel yığın içinde olduğundan ve geçerli blok türü olduğunu doğrulamak için.
_ASSERTE(_CrtIsMemoryBlock (myData, size, &requestNumber, &filename, &linenumber));
Bu konuda
mfc onayları
mfc tanımlar izin onaylama işlemi denetimi için makro.Ayrıca tanımlar MFC ASSERT_VALID ve CObject::AssertValid iç durumunu denetleme yöntemleri bir CObject-türetilmiş nesnesinin.
mfc baðýmsýz ASSERT makro değerlendirir sıfıra veya yanlış makro program yürütme durdurur ve uyarılar kullanıcı; Aksi halde, yürütme devam eder.
Ne zaman bir ileti iletişim kutusunda kaynak dosyasının adını ve onaylama işlemi satır numarasını gösterir bir bir onaylama işlemi başarısız.İletişim kutusunda Yeniden Dene'yi seçerseniz, kutu, çağrı AfxDebugBreak hata ayıklayıcıya gönder yürütülmesine neden olur.Bu noktada, çağrı yığını incelemek ve diğer hata ayıklayıcı tesis onaylama işlemi neden başarısız olduğunu belirlemek için kullanın.Etkinleştirdiyseniz, Just-ın-time hata ayıklamayıve hata ayıklayıcı değil zaten çalışıyordu, hata ayıklayıcı iletişim kutusunu başlatabilir.
Aşağıdaki örnek, nasıl kullanacağınızı gösterir ASSERT bir işlevin dönüş değerini denetlemek için:
int x = SomeFunc(y);
ASSERT(x >= 0); // Assertion fails if x is negative
assert ile kullanabileceğiniz IsKindOf işlevi tür işlev bağımsız değişkenleri denetlemesini sağlamak için:
ASSERT( pObject1->IsKindOf( RUNTIME_CLASS( CPerson ) ) );
ASSERT Kod yayın sürümünde makro oluşturur.Yayın sürümünde ifade değerlendirmek gereksinim duyarsanız, kullanmak doğrulama makro assert yerine.
mfc ASSERT_VALID ve CObject::AssertValid
CObject::AssertValid yöntemi sağlar çalışma zamanı nesne iç durumunu denetler.Geçersiz kılmak zorunda değilsiniz, ancak AssertValid kendi sınıfınızı türetirsiniz ne zaman CObject, bunu yaparak, sınıfınızın daha güvenilir yapabilirsiniz.AssertValidTüm geçerli değerler içerdiğini doğrulamak için nesnenin üye değişkenleri onayları gerçekleştirmelisiniz.Örneğin, işaretçiyi üye değişkenleri null olmayan denetlemelisiniz.
Aşağıdaki örnek nasıl bildirileceğini gösteren bir AssertValid işlevi:
class CPerson : public CObject
{
protected:
CString m_strName;
float m_salary;
public:
#ifdef _DEBUG
// Override
virtual void AssertValid() const;
#endif
// ...
};
Geçersiz kılma ne zaman AssertValid, temel sınıf sürümünü çağırır AssertValid önce kendi denetimleri gerçekleştirmek.Sonra aşağıda gösterildiği gibi türetilmiş sınıfınız için benzersiz üyeleri denetlemek için assert makroyu kullanın:
#ifdef _DEBUG
void CPerson::AssertValid() const
{
// Call inherited AssertValid first.
CObject::AssertValid();
// Check CPerson members...
// Must have a name.
ASSERT( !m_strName.IsEmpty());
// Must have an income.
ASSERT( m_salary > 0 );
}
#endif
Herhangi bir üye değişkenleri nesneleri depolamak, kullanın ASSERT_VALID bunların iç geçerliliğini sınamak için makro (kendi sınıfları geçersiz kılarsanız AssertValid).
Örneğin, bir sınıf göz önünde CMyData, hangi mağazanın bir CObList bir üye değişkenlerini.CObList Değişkeni, m_DataList, koleksiyonunu saklayan CPerson nesneler.Kısaltılmış bir bildirimi CMyData bunun gibi görünür:
class CMyData : public CObject
{
// Constructor and other members ...
protected:
CObList* m_pDataList;
// Other declarations ...
public:
#ifdef _DEBUG
// Override:
virtual void AssertValid( ) const;
#endif
// And so on ...
};
AssertValid İçinde geçersiz kılma CMyData bunun gibi görünür:
#ifdef _DEBUG
void CMyData::AssertValid( ) const
{
// Call inherited AssertValid.
CObject::AssertValid( );
// Check validity of CMyData members.
ASSERT_VALID( m_pDataList );
// ...
}
#endif
CMyDatakullanan AssertValid kendi veri üyesinde saklanan nesneler geçerliliğini sınamak için bir mekanizma.Geçersiz kılma AssertValid , CMyData çağırır ASSERT_VALID , kendi m_pDataList üye değişkeni için makro.
Geçerlilik sınama durmaz Bu düzeyde çünkü sınıf CObList de geçersiz kılar AssertValid.Bu şekilde geçersiz kılınması, ek geçerlilik listesinin iç durumu üzerinde sınama gerçekleştirir.Bu nedenle, bir geçerlilik testi üzerinde bir CMyData nesnesi ek geçerlilik sınamalarından saklı iç durumları için müşteri adayları CObList listesi nesnesi.
Bazı daha fazla çalışmak için geçerlilik sınamalarından ekleyebilirsiniz CPerson listesinde de saklanan nesneler.Bir sınıf türetin CPersonList dan CObList ve geçersiz kılma AssertValid.Geçersiz kılmada çağıracak CObject::AssertValid ve sonra liste boyunca yineleme yapmak arama AssertValid her CPerson nesne listesinde depolanır.CPerson Bu konunun başında zaten gösterilen sınıfı geçersiz kılar AssertValid.
Hata ayıklama için oluşturma sırasında güçlü bir mekanizmadır.Sonradan yayımlanan için yapılandırdığınızda, mekanizması otomatik olarak kapatılır.
AssertValid sınırlamaları
Kesinlikle hatalı nesnedir ve yürütme durduracak tetiklenen bir onaylama işlemi gösterir.Ancak, onaylama işlemi eksikliği yalnızca hiçbir sorun bulunamadı, ancak nesne iyi olduğu garanti edilmez gösterir.
Bu konuda
Onayları kullanma
Mantık hataları yakalamak
Bir onaylama işlemi, programın mantığına göre doğru olması gereken bir koşul ayarlayabilirsiniz.Onaylama işlemi bir mantık hatası olmadığı sürece hiçbir etkisi yoktur.
Örneğin, bir kapsayıcı ve değişken gaz molecules taklit varsayalım numMols molecules toplam sayısını gösterir.Bu edemiyor olması sayısından küçük sıfır bir mfc belirtilme ifadesini aþaðýdaki içerebilir:
ASSERT(numMols >= 0);
Veya böyle bir crt belirtilme içerebilir:
_ASSERT(numMols >= 0);
Bu ifadeler, programınızın doğru çalıştığından, hiçbir şey yapma.Bir mantık hatası neden olur, numMols küçük olması için sıfır, ancak onay programın yürütülmesini durdurur ve görüntüler İletişim kutusu onaylama işlemi başarısız oldu.
Bu konuda
Sonuçları denetleme
Onayları, test sonuçları hızlı bir görsel denetleme belirgin olmayan işlemler için değerlidir.
Örneğin, aşağıdaki kod değişkeni güncelleştirdiği düşünün iMols tarafından işaret bağlantılı liste içeriğini temel mols:
/* This code assumes that type has overloaded the != operator
with const char *
It also assumes that H2O is somewhere in that linked list.
Otherwise we'll get an access violation... */
while (mols->type != "H2O")
{
iMols += mols->num;
mols = mols->next;
}
ASSERT(iMols<=numMols); // MFC version
_ASSERT(iMols<=numMols); // CRT version
Sayılan molecules sayısı tarafından iMols her zaman molecules, toplam sayısı küçük veya eşit olması numMols.Görsel denetleme döngünün bir onaylama işlemi deyimi döngüden sonra bu durumu sınamak için kullanılmak üzere bu mutlaka böyle olacağını göstermez.
Bu konuda
Bulma işlenemeyen hatalar
Burada herhangi bir hata işlenmiş olan bir noktada hata koşulları için kodunuzu test etmek için onayları kullanabilirsiniz.Aşağıdaki örnekte, bir grafik yordam başarı için sıfır veya bir hata kodu döndürür.
myErr = myGraphRoutine(a, b);
/* Code to handle errors and
reset myErr if successful */
ASSERT(!myErr); -- MFC version
_ASSERT(!myErr); -- CRT version
Hata işleme kodu düzgün çalışıyorsa, hata ele alınacağını ve myErr sıfırlama onay ulaşılmadan önce sıfır.myErr Sahip başka bir değer, onaylama işlemi başarısız olursa, program durur ve İletişim kutusu onaylama işlemi başarısız oldu görünür.
Onaylama işlemi deyimleri hata işleme kodu yerine ancak değildir.Aşağıdaki örnek, son sürümde kod içinde sorunlara yol açabilecek bir onaylama işlemi deyimi gösterir:
myErr = myGraphRoutine(a, b);
/* No Code to handle errors */
ASSERT(!myErr); // Don't do this!
_ASSERT(!myErr); // Don't do this, either!
Bu kod hata durumunu işlemek için onaylama işlemi deyimi kullanır.Sonuç olarak, herhangi bir hata kodu döndürdü tarafından myGraphRoutine son sürümde kodda işlenmemiş.
Bu konuda