Aracılığıyla paylaş


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.

ww5t02fa.collapse_all(tr-tr,VS.110).gifYığın Bozulması için denetleme

Aşağıdaki örnek _CrtCheckMemory öbek bozulma olup olmadığını denetleyin:

_ASSERTE(_CrtCheckMemory());

ww5t02fa.collapse_all(tr-tr,VS.110).gifİş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 );

ww5t02fa.collapse_all(tr-tr,VS.110).gifBir 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.

ww5t02fa.collapse_all(tr-tr,VS.110).gifmfc 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.

ww5t02fa.collapse_all(tr-tr,VS.110).gifAssertValid 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

ww5t02fa.collapse_all(tr-tr,VS.110).gifMantı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

ww5t02fa.collapse_all(tr-tr,VS.110).gifSonuç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

ww5t02fa.collapse_all(tr-tr,VS.110).gifBulma 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

Ayrıca bkz.

Başvuru

Yönetilen kod onaylamaları

Kavramlar

Hata ayıklayıcı güvenlik

Diğer Kaynaklar

Yerel kod hata ayıklama