Freigeben über


Warnung C28213

Die _Use_decl_annotations_ Anmerkung muss verwendet werden, um ohne Änderung auf eine vorherige Deklaration zu verweisen.

Hinweise

_Use_decl_annotations_ weist den Compiler an, die Anmerkungen aus einer früheren Deklaration der Funktion zu verwenden. Wenn eine frühere Deklaration nicht gefunden werden kann oder wenn die aktuelle Deklaration Änderungen an den Anmerkungen vorgibt, wird diese Warnung ausgegeben. _Use_decl_annotations_ Außerdem können Sie alle anderen Anmerkungen aus der Definition entfernen und die Deklarationsanmerkungen für die Analyse der Funktion verwenden.

Diese Diagnose ist häufig ein Nebeneffekt der Umgestaltung oder Behebung anderer Warnungen, indem die Anmerkungen für eine Funktion angepasst werden. Um das Problem zu beheben, verwenden Sie dieselben Anmerkungen an den anderen Speicherorten. Um den richtigen Satz von Anmerkungen zu ermitteln, sehen Sie sich das Verhalten in der Funktionsdefinition an. In den meisten Fällen ist dieses Verhalten beabsichtigt, und die Anmerkungen für die Funktion sollten sie widerspiegeln. Weitere Informationen zu SAL-Anmerkungen finden Sie unter Verwendung von SAL-Anmerkungen zur Reduzierung von Codefehlern.

Es ist wichtig, dass die Anmerkungen zwischen den Deklarationen und der Definition einer Funktion übereinstimmen. Wenn die Analysetools die Aufrufwebsite der Funktion analysieren, verwenden sie die Deklarationsanmerkungen. Wenn die Deklaration und Definition nicht übereinstimmen, können die statischen Analysetools falsche Ergebnisse erzielen. Wenn Sie diese Warnung beheben, ist es üblich, dass Ihre Änderungen kaskadierende Effekte haben, da das Tool die Quelle mit aktualisierten Informationen neu ananalysiert.

Wenn diese Diagnose auftritt, da die Analyse eine vorherige Deklaration in der Übersetzungseinheit nicht finden konnte, ist die wahrscheinlichste Ursache eine fehlende #include Direktive. Um dieses Problem zu beheben, wenn Sie die Headerdatei absichtlich nicht einschließen, überprüfen Sie, ob die Anmerkungen in der Deklaration und Definition übereinstimmen, und entfernen Sie die _Use_decl_annotations_ Anmerkung. Achten Sie darauf, wenn Sie keine Headerdatei einschließen, da die beiden Anmerkungen in Zukunft möglicherweise nicht mehr synchronisiert werden.

Codeanalysename: BAD_USEHEADER

Beispiele

Der folgende Code generiert C28160. Die buffer Parameteranmerkung stimmt nicht zwischen den beiden Dateien überein.

Von example.h:

void addNullTerminate(_Out_writes_(n) char* buffer, int n);

Von example.cpp:

_Use_decl_annotations_
void addNullTerminate(_Out_writes_z_(n) char* buffer, int n)
{
    buffer[n] = '\0';
}

Überprüfen Sie die Funktionsdefinition, um zu bestimmen, was die richtigen Anmerkungen sein sollen. In diesem Fall _Out_writes_z_(n) scheint dies korrekt zu sein, daher verschieben wir diese Anmerkung in die Funktionsdeklaration in der Headerdatei. Diese Änderung behebt das Problem, da die Anmerkungen in der Deklaration und Definition jetzt übereinstimmen.

Von example.h:

void addNullTerminate(_Out_writes_z_(n) char* buffer, int n);

Jetzt können wir die Pufferanmerkung für die Definition entfernen, um zukünftige Standard Zuszenanz zu vereinfachen (obwohl dieser Schritt optional ist).

Von example.cpp:

_Use_decl_annotations_
void addNullTerminate(char* buffer, int n)
{
    buffer[n] = '\0';
}

Im realen Code ist es in der Regel nicht so klar, welche Anmerkung korrekt ist. Weitere Informationen und Anleitungen finden Sie unter Verwendung von SAL-Anmerkungen zur Reduzierung von Codefehlern.

Siehe auch

Regelsätze für C++-Code
Verwenden von SAL-Anmerkungen zur Reduzierung von Codefehlern
C28252
C28253
C28301