Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver typiska annoteringar för enkla funktionsparametrar – skalärer och pekare till strukturer och klasser – och de flesta typer av buffertar. Den här artikeln visar också vanliga användningsmönster för anteckningar. Ytterligare anteckningar som är relaterade till funktioner finns i Kommentera funktionsbeteende.
Pekarparametrar
När en pekarparameter kommenteras för anteckningarna i följande tabell rapporterar analysverktyget ett fel om pekaren är null. Den här kommentaren gäller pekare och alla dataobjekt som pekas på.
Anteckningar och beskrivningar
_In_Kommenterar indataparametrar som är skalärer, strukturer, pekare till strukturer och liknande. Explicit kan användas på enkla skalärer. Parametern måste vara giltig i förtillstånd och ändras inte.
_Out_Kommenterar utdataparametrar som är skalärer, strukturer, pekare till strukturer och liknande. Använd inte den här annoteringen på ett objekt som inte kan returnera ett värde, till exempel en skalär som skickas som värde. Parametern behöver inte vara giltig i initialtillståndet, men måste vara giltig i det slutgiltiga tillståndet.
_Inout_Kommenterar en parameter som kommer att ändras av funktionen. Det måste vara giltigt i både tillstånd före och tillstånd efter, men antas ha olika värden före och efter anropet. Måste gälla för ett ändringsbart värde.
_In_z_En pekare till en null-avslutad sträng som används som indata. Strängen måste vara giltig i förtillstånd. Varianter av
PSTR, som redan har rätt anteckningar, föredras._Inout_z_En pekare till en null-terminerad teckensträng som kommer att ändras. Det måste vara giltigt före och efter anropet, men det antas att värdet har ändrats. Null-avslutaren kan flyttas, men endast elementen upp till den ursprungliga null-avslutaren kan nås.
_In_reads_(s)_In_reads_bytes_(s)En pekare till en matris som läss av funktionen. Matrisen är av storlekselement
s, som alla måste vara giltiga.Varianten
_bytes_ger storleken i byte i stället för element. Använd endast den här varianten när storleken inte kan uttryckas som element. Strängar skulle till exempelcharbara använda varianten_bytes_om en liknande funktion som använderwchar_tskulle göra det._In_reads_z_(s)En pekare till en matris som är null-avslutad och har en känd storlek. Elementen upp till null-avslutaren – eller
som det inte finns någon null-terminator – måste vara giltiga i förtillstånd. Om storleken är känd i byte skalar du efterselementstorleken._In_reads_or_z_(s)En pekare till en matris som är null-avslutad eller har en känd storlek, eller både och. Elementen upp till null-avslutaren – eller
som det inte finns någon null-terminator – måste vara giltiga i förtillstånd. Om storleken är känd i byte skalar du efterselementstorleken. (Används för familjenstrn.)_Out_writes_(s)_Out_writes_bytes_(s)En pekare till en matris med
selement (resp. byte) som skrivs av funktionen. Matriselementen behöver inte vara giltiga i förtillstånd och antalet element som är giltiga efter tillstånd är ospecificerat. Om det finns anteckningar för parametertypen tillämpas de därefter. Tänk till exempel på följande kod.typedef _Null_terminated_ wchar_t *PWSTR; void MyStringCopy(_Out_writes_(size) PWSTR p1, _In_ size_t size, _In_ PWSTR p2);I det här exemplet tillhandahåller anroparen en buffert med
sizeelement förp1.MyStringCopygör vissa av dessa element giltiga. Ännu viktigare är att annoteringen_Null_terminated_påPWSTRinnebär attp1är null-avslutad i efterläge. På så sätt är antalet giltiga element fortfarande väldefinierat, men ett visst elementantal krävs inte.Varianten
_bytes_ger storleken i byte i stället för element. Använd endast den här varianten när storleken inte kan uttryckas som element. Strängar skulle till exempelcharbara använda varianten_bytes_om en liknande funktion som använderwchar_tskulle göra det._Out_writes_z_(s)En pekare till en matris med
selement. Elementen behöver inte vara giltiga i ett tidigare tillstånd. I posttillstånd måste elementen fram till null-terminering – som måste finnas – vara giltiga. Om storleken är känd i byte skalar du efterselementstorleken._Inout_updates_(s)_Inout_updates_bytes_(s)En pekare till en matris som både läss och skrivs till i funktionen. Den har storleken
selement och är giltig i förtillståndet och eftertillståndet.Varianten
_bytes_ger storleken i byte i stället för element. Använd endast den här varianten när storleken inte kan uttryckas som element. Strängar skulle till exempelcharbara använda varianten_bytes_om en liknande funktion som använderwchar_tskulle göra det._Inout_updates_z_(s)En pekare till en matris som är null-avslutad och har en känd storlek. Elementen fram till och med nollterminatorn – som måste finnas – måste vara giltiga både i det tidigare och senare tillståndet. Värdet i posttillståndet antas skilja sig från värdet i förtillståndet, det inkluderar platsen för nul-terminatorn. Om storleken är känd i byte skalar du efter
selementstorleken._Out_writes_to_(s,c)_Out_writes_bytes_to_(s,c)_Out_writes_all_(s)_Out_writes_bytes_all_(s)En pekare till en matris med
selement. Elementen behöver inte vara giltiga i ett tidigare tillstånd. I efter tillståndet måste elementen upp tillc-elementet vara giltiga. Varianten_bytes_kan användas om storleken är känd i byte i stället för antalet element.Till exempel:
void *memcpy(_Out_writes_bytes_all_(s) char *p1, _In_reads_bytes_(s) char *p2, _In_ int s); void *wordcpy(_Out_writes_all_(s) DWORD *p1, _In_reads_(s) DWORD *p2, _In_ int s);_Inout_updates_to_(s,c)_Inout_updates_bytes_to_(s,c)En pekare till en matris som både läss och skrivs av funktionen. Det är av storlekselement
s, som alla måste vara giltiga i förtillstånd ochcelement måste vara giltiga i eftertillstånd.Varianten
_bytes_ger storleken i byte i stället för element. Använd endast den här varianten när storleken inte kan uttryckas som element. Strängar skulle till exempelcharbara använda varianten_bytes_om en liknande funktion som använderwchar_tskulle göra det._Inout_updates_all_(s)_Inout_updates_bytes_all_(s)En pekare till en matris som både läss och skrivs av funktionen för storlekselement
s. Definieras som ekvivalent till:_Inout_updates_to_(_Old_(s), _Old_(s)) _Inout_updates_bytes_to_(_Old_(s), _Old_(s))Med andra ord är varje element som finns i bufferten upp till
si förtillståndet giltigt både i förtillståndet och eftertillståndet.Varianten
_bytes_ger storleken i byte i stället för element. Använd endast den här varianten när storleken inte kan uttryckas som element. Strängar skulle till exempelcharbara använda varianten_bytes_om en liknande funktion som använderwchar_tskulle göra det._In_reads_to_ptr_(p)En pekare till en matris för vilken
p - _Curr_(det vill sägapminus_Curr_) är ett giltigt uttryck. Elementen innanpmåste vara giltiga i förtillstånd.Till exempel:
int ReadAllElements(_In_reads_to_ptr_(EndOfArray) const int *Array, const int *EndOfArray);_In_reads_to_ptr_z_(p)En pekare till en null-avslutad matris för vilket uttryck
p - _Curr_(det vill sägapminus_Curr_) är ett giltigt uttryck. Elementen innanpmåste vara giltiga i förtillstånd._Out_writes_to_ptr_(p)En pekare till en matris för vilken
p - _Curr_(det vill sägapminus_Curr_) är ett giltigt uttryck. Elementen innanpbehöver inte vara giltiga i företillstånd och måste vara giltiga i eftertillstånd._Out_writes_to_ptr_z_(p)En pekare till en null-avslutad matris för vilken
p - _Curr_(det vill sägapminus_Curr_) är ett giltigt uttryck. Elementen innanpbehöver inte vara giltiga i företillstånd och måste vara giltiga i eftertillstånd.
Valfria pekarparametrar
När en pekarparameteranteckning innehåller _opt_anger den att parametern kan vara null. Annars fungerar anteckningen på samma sätt som den version som inte innehåller _opt_. Här är en lista över varianterna _opt_ av pekarparameteranteckningarna:
_In_opt_
_Out_opt_
_Inout_opt_
_In_opt_z_
_Inout_opt_z_
_In_reads_opt_
_In_reads_bytes_opt_
_In_reads_opt_z_
_Out_writes_opt_
_Out_writes_opt_z_
_Inout_updates_opt_
_Inout_updates_bytes_opt_
_Inout_updates_opt_z_
_Out_writes_to_opt_
_Out_writes_bytes_to_opt_
_Out_writes_all_opt_
_Out_writes_bytes_all_opt_
_Inout_updates_to_opt_
_Inout_updates_bytes_to_opt_
_Inout_updates_all_opt_
_Inout_updates_bytes_all_opt_
_In_reads_to_ptr_opt_
_In_reads_to_ptr_opt_z_
_Out_writes_to_ptr_opt_
_Out_writes_to_ptr_opt_z_
Parametrar för utdatapekare
Utpekare parametrar kräver särskild notation för att skilja mellan nullbarhet hos parametern och den angivna platsen.
Anteckningar och beskrivningar
_Outptr_Parametern kan inte vara null, och i eftertillståndet kan den angivna platsen inte vara null och måste vara giltig.
_Outptr_opt_Parametern kan vara null, men efter tillståndet kan inte den utpekade platsen vara null och måste vara giltig.
_Outptr_result_maybenull_Parametern kan inte vara null, och i eftertillståndet kan den refererade platsen vara null.
_Outptr_opt_result_maybenull_Parametern kan vara null, och i eftertillståndet kan det hänvisade läget vara null.
I följande tabell infogas ytterligare delsträngar i anteckningsnamnet för att ytterligare kvalificera innebörden av anteckningen. De olika delsträngarna är
_z,_COM_,_buffer_,_bytebuffer_och_to_.
Viktigt!
Om gränssnittet som du kommenterar är COM använder du COM-formen för dessa anteckningar. Använd inte COM-anteckningarna med något annat typgränssnitt.
_Outptr_result_z__Outptr_opt_result_z__Outptr_result_maybenull_z__Outptr_opt_result_maybenull_z_Den returnerade pekaren har kommentaren
_Null_terminated_._COM_Outptr__COM_Outptr_opt__COM_Outptr_result_maybenull__COM_Outptr_opt_result_maybenull_Den returnerade pekaren har COM-semantik, vilket är anledningen till att den har ett
_On_failure_eftervillkor att den returnerade pekaren är null._Outptr_result_buffer_(s)_Outptr_result_bytebuffer_(s)_Outptr_opt_result_buffer_(s)_Outptr_opt_result_bytebuffer_(s)Den returnerade pekaren pekar på en giltig buffert med storlek
selement eller byte._Outptr_result_buffer_to_(s, c)_Outptr_result_bytebuffer_to_(s, c)_Outptr_opt_result_buffer_to_(s,c)_Outptr_opt_result_bytebuffer_to_(s,c)Den returnerade pekaren pekar på en buffert av storleken
selement eller byte, av vilka de förstacär giltiga.
Vissa gränssnittskonventioner förutsätter att utdataparametrarna är nullifierade vid fel. Förutom explicit COM-kod föredras formulären i följande tabell. För COM-kod använder du motsvarande COM-formulär som visas i föregående avsnitt.
_Result_nullonfailure_Ändrar andra anteckningar. Resultatet är inställt på null om funktionen misslyckas.
_Result_zeroonfailure_Ändrar andra anteckningar. Resultatet är inställt på noll om funktionen misslyckas.
_Outptr_result_nullonfailure_Den returnerade pekaren pekar på en giltig buffert om funktionen lyckas eller null om funktionen misslyckas. Den här kommentaren gäller för en icke-valfri parameter.
_Outptr_opt_result_nullonfailure_Den returnerade pekaren pekar på en giltig buffert om funktionen lyckas eller null om funktionen misslyckas. Den här kommentaren är för en valfri parameter.
_Outref_result_nullonfailure_Den returnerade pekaren pekar på en giltig buffert om funktionen lyckas eller null om funktionen misslyckas. Den här kommentaren är avsedd för en referensparameter.
Referensparametrar för utdata
En vanlig användning av referensparametern är för utdataparametrar. För enkla referensparametrar för utdata, såsom int&, tillhandahåller _Out_ den korrekta semantiken. Men när utdatavärdet är en pekare, till exempel int *&, ger motsvarande pekaranteckningar som _Outptr_ int ** inte rätt semantik. Använd följande sammansatta anteckningar för att kortfattat uttrycka semantiken för referensparametrar för utdata för pekartyper:
Anteckningar och beskrivningar
_Outref_Resultatet måste vara giltigt efter operationen och får inte vara nullvärde.
_Outref_result_maybenull_Resultatet måste vara giltigt i efterläge, men kan vara null i efterläge.
_Outref_result_buffer_(s)Resultatet måste vara giltigt efter operationen och får inte vara nullvärde. Pekar på en giltig buffert med storlek
selement._Outref_result_bytebuffer_(s)Resultatet måste vara giltigt efter operationen och får inte vara nullvärde. Pekar på en giltig buffert av storlek
sbyte._Outref_result_buffer_to_(s, c)Resultatet måste vara giltigt efter operationen och får inte vara nullvärde. Pekar på en buffert med
selement, varav de förstacär giltiga._Outref_result_bytebuffer_to_(s, c)Resultatet måste vara giltigt efter operationen och får inte vara nullvärde. Pekar på en buffert med
sbyte, varav de förstacär giltiga._Outref_result_buffer_all_(s)Resultatet måste vara giltigt efter operationen och får inte vara nullvärde. Pekar på en giltig buffert av storleken
sgiltiga element._Outref_result_bytebuffer_all_(s)Resultatet måste vara giltigt efter operationen och får inte vara nullvärde. Pekar på en giltig buffert av
sbytes med giltiga element._Outref_result_buffer_maybenull_(s)Resultatet måste vara giltigt i efterläge, men kan vara null i efterläge. Pekar på en giltig buffert med storlek
selement._Outref_result_bytebuffer_maybenull_(s)Resultatet måste vara giltigt i efterläge, men kan vara null i efterläge. Pekar på en giltig buffert av storlek
sbyte._Outref_result_buffer_to_maybenull_(s, c)Resultatet måste vara giltigt i efterläge, men kan vara null i efterläge. Pekar på en buffert med
selement, varav de förstacär giltiga._Outref_result_bytebuffer_to_maybenull_(s,c)Resultatet måste vara giltigt i efterstadiet, men kan vara null i post-tillstånd. Pekar på en buffert med
sbyte, varav de förstacär giltiga._Outref_result_buffer_all_maybenull_(s)Resultatet måste vara giltigt i efterstadiet, men kan vara null i post-tillstånd. Pekar på en giltig buffert av storleken
sgiltiga element._Outref_result_bytebuffer_all_maybenull_(s)Resultatet måste vara giltigt i efterstadiet, men kan vara null i post-tillstånd. Pekar på en giltig buffert av
sbytes med giltiga element.
Returnera värden
Returvärdet för en funktion liknar en _Out_ parameter men ligger på en annan nivå av referens och du behöver inte tänka på begreppet pekare till resultatet. För följande anvisningar är returvärdet det kommenterade objektet – en skalär, en pekare till en struktur eller en pekare till en buffert. Dessa anteckningar har samma semantik som motsvarande _Out_ anteckning.
_Ret_z_
_Ret_writes_(s)
_Ret_writes_bytes_(s)
_Ret_writes_z_(s)
_Ret_writes_to_(s,c)
_Ret_writes_maybenull_(s)
_Ret_writes_to_maybenull_(s)
_Ret_writes_maybenull_z_(s)
_Ret_maybenull_
_Ret_maybenull_z_
_Ret_null_
_Ret_notnull_
_Ret_writes_bytes_to_
_Ret_writes_bytes_maybenull_
_Ret_writes_bytes_to_maybenull_
Formatera strängparametrar
_Printf_format_string_Anger att parametern är en formatsträng som ska användas i ettprintfuttryck.Exempel
int MyPrintF(_Printf_format_string_ const wchar_t* format, ...) { va_list args; va_start(args, format); int ret = vwprintf(format, args); va_end(args); return ret; }_Scanf_format_string_Anger att parametern är en formatsträng som ska användas i ettscanfuttryck.Exempel
int MyScanF(_Scanf_format_string_ const wchar_t* format, ...) { va_list args; va_start(args, format); int ret = vwscanf(format, args); va_end(args); return ret; }_Scanf_s_format_string_Anger att parametern är en formatsträng som ska användas i ettscanf_suttryck.Exempel
int MyScanF_s(_Scanf_s_format_string_ const wchar_t* format, ...) { va_list args; va_start(args, format); int ret = vwscanf_s(format, args); va_end(args); return ret; }
Andra vanliga anteckningar
Anteckningar och beskrivningar
_In_range_(low, hi)_Out_range_(low, hi)_Ret_range_(low, hi)_Deref_in_range_(low, hi)_Deref_out_range_(low, hi)_Deref_inout_range_(low, hi)_Field_range_(low, hi)Parametern, fältet eller resultatet ligger i intervallet (inklusive) från
lowtillhi. Motsvarar_Satisfies_(_Curr_ >= low && _Curr_ <= hi)som tillämpas på det kommenterade objektet tillsammans med lämpliga villkor för förtillstånd och eftertillstånd.Viktigt!
Även om namnen innehåller "in" och "out", gäller semantiken för
_In_och_Out_inte dessa anmärkningar._Pre_equal_to_(expr)_Post_equal_to_(expr)Det kommenterade värdet är exakt
expr. Motsvarar_Satisfies_(_Curr_ == expr)som tillämpas på det kommenterade objektet tillsammans med lämpliga villkor för förtillstånd och eftertillstånd._Struct_size_bytes_(size)Gäller för en struct- eller klassdeklaration. Anger att ett giltigt objekt av den typen kan vara större än den deklarerade typen, med antalet byte som anges av
size. Till exempel:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };Buffertstorleken i byte av en parameter
pMav typenMyStruct *anses sedan vara:min(pM->nSize, sizeof(MyStruct))