Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Başlatılmamış 'parameter-name' belleği döndürülerek.
Açıklamalar
İşlev aracılığıyla başarılı bir yol, açıklamalı parametreyi _Out_ ayarlamaz.
Bu uyarının amacı, işlevi çağıranların başlatılmamış değerleri kullanmasını önlemektir. Çözümleyici, çağıranların işlev çağrısından önce ek _Out_ açıklama ekli parametre başlatmadığını varsayar ve işlevin bunları başlatıp başlatmadığını denetler. İşlev bir hata olduğunu veya başarılı olmadığını belirten bir değer döndürürse çözümleyici bu uyarıyı yaymaz. Bu sorunu çözmek için, tüm başarılı dönüş yolları altında parametresini başlatmayı _Out_ unutmayın. Hata iletisi, parametreyi başlatmayan bir örnek yolun satır numaralarını içerir.
Başlatma davranışı tasarım gereğiyse, yanlış veya eksik SAL ek açıklamaları uyarının olası bir nedenidir. Bu durumları genellikle iki yoldan biriyle çözebilirsiniz: Daha uygun bir ek açıklamaya geçin _Out_ veya işlevin _Success_() başarı/hata durumlarını tanımlamaya yardımcı olması için ek açıklamayı kullanın. Statik çözümleme araçlarının işlevin çağrı sitelerini analiz ederken işlevde doğru ek açıklamalara sahip olması önemlidir.
Parametre ek açıklamalarında yapılan değişikliklerle düzeltme
Parametre zaten başlatılmış durumda olmalıdır ve işlev bunu koşullu olarak değiştirirse _Inout_ , ek açıklama daha uygun olabilir. Hedeflenen davranışa uyan başka bir üst düzey ek açıklama yoksa, parametresinin beklenen durumu üzerinde ek esneklik ve denetim sağlayan , _Pre_null__Pre_satisfies_() ve gibi _Post_satisfies_()düşük düzeyli ek açıklamaları kullanabilirsiniz. Parametre ek açıklamaları hakkında daha fazla bilgi için bkz . İşlev parametrelerine ve dönüş değerlerine açıklama ekleme.
Başarılı dönüş yolları tanımlayarak düzeltme
Çözümleyici bu uyarıyı yalnızca kod işlevin başarı yollarında bir _Out_ parametre başlatmadığında gösterir. Ek açıklama yoksa _Success_ ve işlev dönüş türü ek açıklaması yoksa, tüm dönüş yollarının başarılı olduğunu kabul eder. Ve benzer ek açıklamalar hakkında _Success_ daha fazla bilgi için bkz . Başarı/Başarısızlık ek açıklamaları.
Kod analizi adı: RETURN_UNINIT_VAR
Örnek
Aşağıdaki kod bu uyarıyı oluşturur. işlevi döndürdüğünden voidçözümleyici tüm yolları başarılı olarak değerlendirir. Bu durumda, doğru düzeltme büyük olasılıkla deyiminin if mantığını ayarlamak olacaktır, ancak gerçek dünya kodunda genellikle bu kadar basit değildir ve çözüm işlevin amaçlanan davranışına bağlıdır.
#include <sal.h>
void AlwaysInit(_Out_ int* output, int input) // : warning C6101: Returning uninitialized memory '*p'.: Lines: 2, 4, 9, 14, 2
{
if( input > 0 )
{
*output = input;
return;
}
else if( input < 0 )
{
*output = 0;
return;
}
return; // Oops, input was 0
}
Çözümü daha ilginç hale getirmek için, olduğunda outputinputbaşlatmanın 0 geçerli olmadığını varsayarız. Yaklaşımlardan biri işlev dönüş değerini gibi boolfarklı bir türe değiştirmektir. Ardından, başarılı dönüş yollarını tanımlamak için bir _Success_ ek açıklama ekleyin.
_Success_(return == true)
bool InitNotZero(_Out_ int* output, int input)
{
if( input > 0 )
{
*output = input;
return true;
}
else if( input < 0 )
{
*output = 0;
return true;
}
return false;
}
Bu desen kod tabanınızda yaygınsa, dönüş türüne ek açıklama ekleyebilirsiniz. Windows SDK'sından HRESULT gibi hata kodları, her işleve eklemenize gerek kalmadan ek açıklamanın _Success_ davranışını sağlar. Dönüş türü olarak zaten açıklamalı bir tür kullanıyorsanız ve davranışı geçersiz kılmak istiyorsanız, önceki örnekte gösterildiği gibi ek açıklamayı işleve ekleyin.
using SuccessWhenTrue = _Success_(return == true) bool;
SuccessWhenTrue InitNotZero(_Out_ int* output, int input)
{
// ...
}
Ayrıca bkz.
C++ kodu için kural kümeleri
C/C++ Kod Hatalarını Azaltmak için SAL Ek Açıklamalarını Kullanma