Warnung C6101
Gibt den nicht initialisierten Speicher "Parametername" zurück.
Ein erfolgreicher Pfad durch die Funktion legt den _Out_
kommentierten Parameter nicht fest.
Hinweise
Zweck dieser Warnung besteht darin, die Verwendung nicht initialisierter Werte durch Aufrufer der Funktion zu vermeiden. Die Analyse geht davon aus, dass Aufrufer keine Parameter initialisieren, die vor dem Funktionsaufruf kommentiert _Out_
wurden, und überprüft, ob die Funktion sie initialisiert. Die Analyse gibt diese Warnung nicht aus, wenn die Funktion einen Wert zurückgibt, der angibt, dass sie einen Fehler hatte oder nicht erfolgreich war. Um dieses Problem zu beheben, müssen Sie den _Out_
Parameter unter allen erfolgreichen Rückgabepfaden initialisieren. Die Fehlermeldung enthält die Zeilennummern eines Beispielpfads, der den Parameter nicht initialisiert.
Wenn das Initialisierungsverhalten beabsichtigt ist, sind falsche oder fehlende SAL-Anmerkungen wahrscheinlich eine Ursache für die Warnung. In der Regel können Sie diese Fälle auf eine von zwei Arten beheben: Ändern _Out_
Sie entweder in eine geeignetere Anmerkung, oder verwenden Sie die _Success_()
Anmerkung, um die Erfolgs-/Fehlerzustände der Funktion zu definieren. Es ist wichtig, dass die statischen Analysetools bei der Analyse der Aufrufwebsites der Funktion korrekte Anmerkungen für die Funktion haben.
Korrektur durch Änderungen an Parameteranmerkungen
Wenn sich der Parameter bereits in einem initialisierten Zustand befinden und die Funktion sie bedingt ändert, ist die _Inout_
Anmerkung möglicherweise geeigneter. Wenn keine andere Anmerkung auf hoher Ebene zum beabsichtigten Verhalten passt, können Sie Anmerkungen auf niedriger Ebene wie _Pre_null_
, _Pre_satisfies_()
usw. verwenden, die _Post_satisfies_()
zusätzliche Flexibilität und Kontrolle über den erwarteten Zustand des Parameters bieten. Weitere Informationen zu Parameteranmerkungen finden Sie unter Annotieren von Funktionsparametern und Rückgabewerten.
Korrigieren durch Definieren von erfolgreichen Rückgabepfaden
Der Analyzer gibt diese Warnung nur aus, wenn der Code keinen _Out_
Parameter in den Erfolgspfaden der Funktion initialisiert. Wenn keine _Success_
Anmerkung vorhanden ist und keine Funktionsrückgabetypanmerkung vorhanden ist, werden alle Rückgabepfade erfolgreich berücksichtigt. Weitere Informationen und _Success_
ähnliche Anmerkungen finden Sie unter Erfolgs-/Fehleranmerkungen.
Codeanalysename: RETURN_UNINIT_VAR
Beispiel
Der folgende Code generiert diese Warnung. Da die Funktion zurückgibt void
, berücksichtigt die Analyse alle Pfade erfolgreich. In diesem Fall würde der richtige Fix wahrscheinlich darin sein, die Logik der if
Anweisung anzupassen, aber in realen Code ist es in der Regel nicht so einfach und die Lösung hängt vom beabsichtigten Verhalten der Funktion ab.
#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
}
Um die Lösung interessanter zu gestalten, gehen wir davon aus, dass sie nicht gültig ist, wenn dies der Zeitpunkt ist0
.output
input
Ein Ansatz besteht darin, den Rückgabewert der Funktion in einen anderen Typ zu ändern, z bool
. B. . Fügen Sie dann eine _Success_
Anmerkung hinzu, um die erfolgreichen Rückgabepfade zu definieren.
_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;
}
Wenn dieses Muster in Ihrer Codebasis üblich ist, können Sie die Anmerkung zum Rückgabetyp hinzufügen. Fehlercodes wie HRESULT aus dem Windows SDK geben Ihnen das Verhalten der _Success_
Anmerkung, ohne sie jeder Funktion hinzufügen zu müssen. Wenn Sie bereits einen kommentarierten Typ als Rückgabetyp verwenden und das Verhalten außer Kraft setzen möchten, fügen Sie die Anmerkung der Funktion hinzu, wie im vorherigen Beispiel gezeigt.
using SuccessWhenTrue = _Success_(return == true) bool;
SuccessWhenTrue InitNotZero(_Out_ int* output, int input)
{
// ...
}
Siehe auch
Regelsätze für C++-Code
Verwenden von SAL-Anmerkungen zum Reduzieren von C/C++-Codefehlern