Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel worden typische toepassingen van aantekeningen voor eenvoudige functieparameters, scalaire waarden en aanwijzers naar structuren en klassen, en de meeste soorten buffers beschreven. Dit artikel bevat ook algemene gebruikspatronen voor aantekeningen. Zie Annotating function behavior (Aantekeningen toevoegen aan functiegedrag) voor aanvullende aantekeningen die betrekking hebben op functies.
Aanwijzerparameters
Voor de aantekeningen in de volgende tabel, wanneer een aanwijzerparameter wordt geannoteerd, rapporteert de analyse een fout als de aanwijzer null is. Deze aantekening is van toepassing op aanwijzers en op gegevensitems waarnaar wordt verwezen.
Aantekeningen en beschrijvingen
_In_Aantekeningen maken bij invoerparameters die scalaire, structuren, aanwijzers naar structuren en dergelijke zijn. Kan expliciet worden gebruikt voor eenvoudige scalaire waarden. De parameter moet geldig zijn in de oorspronkelijke staat en zal niet worden gewijzigd.
_Out_Aantekeningen maken bij uitvoerparameters die scalaire, structuren, aanwijzers naar structuren en dergelijke zijn. Pas deze aantekening niet toe op een object dat geen waarde kan retourneren, bijvoorbeeld een scalaire waarde die wordt doorgegeven door een waarde. De parameter hoeft niet geldig te zijn in de beginstatus, maar moet geldig zijn in de eindstatus.
_Inout_Hiermee maakt u aantekeningen voor een parameter die door de functie wordt gewijzigd. Deze moet geldig zijn in zowel de status vooraf als na de aanroep, maar wordt ervan uitgegaan dat deze verschillende waarden vóór en na de aanroep heeft. Moet van toepassing zijn op een wijzigbare waarde.
_In_z_Een aanwijzer naar een door null beëindigde tekenreeks die wordt gebruikt als invoer. De tekenreeks moet geldig zijn in de voorafgaande toestand. Varianten van
PSTR, die al de juiste aantekeningen hebben, hebben de voorkeur._Inout_z_Een aanwijzer naar een door null beëindigde tekenmatrix die wordt gewijzigd. Deze moet geldig zijn voor en na de aanroep, maar wordt ervan uitgegaan dat de waarde is gewijzigd. Het null-eindteken kan worden verplaatst, maar alleen de elementen tot de oorspronkelijke null-eindteken kunnen worden benaderd.
_In_reads_(s)_In_reads_bytes_(s)Een aanwijzer naar een matrix, die wordt gelezen door de functie. De array heeft een grootte van
selementen, die allemaal geldig moeten zijn.De
_bytes_variant geeft de grootte in bytes in plaats van elementen. Gebruik deze variant alleen als de grootte niet als elementen kan worden uitgedrukt. Tekenreeksen gebruiken decharvariant alleen als een vergelijkbare functie, die_bytes_gebruikt, dat ook zou doen._In_reads_z_(s)Een aanwijzer naar een matrix die null-beëindigd is en een bekende grootte heeft. De elementen tot aan het nul-eindteken (of
sals er geen nul-eindteken is) moeten geldig zijn in de voorafgaande status. Als de grootte in bytes bekend is, schaalsnaar de grootte van het element._In_reads_or_z_(s)Een aanwijzer naar een matrix die null-beëindigd is of een bekende grootte heeft, of beide. De elementen tot aan het nul-eindteken (of
sals er geen nul-eindteken is) moeten geldig zijn in de voorafgaande status. Als de grootte in bytes bekend is, schaalsnaar de grootte van het element. (Wordt gebruikt voor destrnfamilie.)_Out_writes_(s)_Out_writes_bytes_(s)Een aanwijzer naar een matrix met
selementen (resp. bytes) die door de functie worden geschreven. De array-elementen hoeven niet geldig te zijn in de prestatus en het aantal elementen dat geldig is in de poststatus is niet opgegeven. Als er aantekeningen zijn voor het parametertype, worden deze toegepast in de naverwerking. Denk bijvoorbeeld aan de volgende code.typedef _Null_terminated_ wchar_t *PWSTR; void MyStringCopy(_Out_writes_(size) PWSTR p1, _In_ size_t size, _In_ PWSTR p2);In dit voorbeeld biedt de aanroeper een buffer van
sizeelementen voorp1.MyStringCopymaakt sommige van deze elementen geldig. Belangrijker is dat de_Null_terminated_aantekening opPWSTRbetekent datp1nul-beëindigd is in de poststatus. Op deze manier is het aantal geldige elementen nog steeds goed gedefinieerd, maar is er geen specifiek aantal elementen vereist.De
_bytes_variant geeft de grootte in bytes in plaats van elementen. Gebruik deze variant alleen als de grootte niet als elementen kan worden uitgedrukt. Tekenreeksen gebruiken decharvariant alleen als een vergelijkbare functie, die_bytes_gebruikt, dat ook zou doen._Out_writes_z_(s)Een aanwijzer naar een matrix met
selementen. De elementen hoeven niet geldig te zijn in de voorgaande staat. Na de post-toestand moeten de elementen tot en met de null-terminator, die aanwezig moet zijn, geldig zijn. Als de grootte in bytes bekend is, schaalsnaar de grootte van het element._Inout_updates_(s)_Inout_updates_bytes_(s)Een aanwijzer naar een matrix, waarnaar zowel wordt gelezen als geschreven in de functie. Het heeft een grootte van
selementen, en is geldig in de voor- en nastatus.De
_bytes_variant geeft de grootte in bytes in plaats van elementen. Gebruik deze variant alleen als de grootte niet als elementen kan worden uitgedrukt. Tekenreeksen gebruiken decharvariant alleen als een vergelijkbare functie, die_bytes_gebruikt, dat ook zou doen._Inout_updates_z_(s)Een aanwijzer naar een matrix die null-beëindigd is en een bekende grootte heeft. De elementen tot en met de nulpunt, die aanwezig moet zijn, moeten geldig zijn in zowel de toestand vóór als na. De waarde in de posttoestand wordt verondersteld anders te zijn dan de waarde in de pretoestand; inclusief de locatie van de nulterminatie. Als de grootte in bytes bekend is, schaal
snaar de grootte van het element._Out_writes_to_(s,c)_Out_writes_bytes_to_(s,c)_Out_writes_all_(s)_Out_writes_bytes_all_(s)Een aanwijzer naar een matrix met
selementen. De elementen hoeven niet geldig te zijn in de voorgaande staat. Na de post-status moeten de elementen tot en met hetcde element geldig zijn. De_bytes_variant kan worden gebruikt als de grootte bekend is in bytes in plaats van het aantal elementen.Voorbeeld:
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)Een aanwijzer naar een matrix, die zowel wordt gelezen als geschreven door de functie. Het bestaat uit
selementen van grootte, die allemaal geldig moeten zijn in de voorstatus encelementen moeten geldig zijn in de poststatus.De
_bytes_variant geeft de grootte in bytes in plaats van elementen. Gebruik deze variant alleen als de grootte niet als elementen kan worden uitgedrukt. Tekenreeksen gebruiken decharvariant alleen als een vergelijkbare functie, die_bytes_gebruikt, dat ook zou doen._Inout_updates_all_(s)_Inout_updates_bytes_all_(s)Een aanwijzer naar een matrix, die zowel wordt gelezen als geschreven door de functie van grootte-elementen
s. Gedefinieerd als gelijkwaardig aan:_Inout_updates_to_(_Old_(s), _Old_(s)) _Inout_updates_bytes_to_(_Old_(s), _Old_(s))Met andere woorden, elk element dat in de buffer tot
sin de pre-toestand bestaat, is geldig in zowel de pre-toestand als de post-toestand.De
_bytes_variant geeft de grootte in bytes in plaats van elementen. Gebruik deze variant alleen als de grootte niet als elementen kan worden uitgedrukt. Tekenreeksen gebruiken decharvariant alleen als een vergelijkbare functie, die_bytes_gebruikt, dat ook zou doen._In_reads_to_ptr_(p)Een aanwijzer naar een array waarvoor
p - _Curr_(dat wil zeggen,pmin_Curr_) een geldige expressie is. De elementen vóórpmoeten geldig zijn in de voorafgaande toestand.Voorbeeld:
int ReadAllElements(_In_reads_to_ptr_(EndOfArray) const int *Array, const int *EndOfArray);_In_reads_to_ptr_z_(p)Een aanwijzer naar een door null beëindigde matrix waarvoor een expressie
p - _Curr_(dat wilpzeggen min_Curr_) een geldige expressie is. De elementen vóórpmoeten geldig zijn in de voorafgaande toestand._Out_writes_to_ptr_(p)Een aanwijzer naar een array waarvoor
p - _Curr_(dat wil zeggen,pmin_Curr_) een geldige expressie is. De elementen hoeven vóórpniet geldig te zijn in de prestatus en moeten geldig zijn in de poststatus._Out_writes_to_ptr_z_(p)Een aanwijzer naar een null-beëindigde matrix waarvoor
p - _Curr_(dat wilpzeggen min_Curr_) een geldige expressie is. De elementen hoeven vóórpniet geldig te zijn in de prestatus en moeten geldig zijn in de poststatus.
Optionele aanwijzerparameters
Wanneer een aanwijzerparameteraantekening bevat _opt_, geeft deze aan dat de parameter null kan zijn. Anders gedraagt de aantekening zich hetzelfde als de versie zonder _opt_. Hier volgt een lijst met de _opt_ varianten van de aanwijzerparameteraantekeningen:
_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_
Parameters voor uitvoerpointer
Voor de parameters van de uitvoerwijzer is een speciale notatie vereist om de nullness voor de parameter en de locatie waarop wordt gewezen te verduidelijken.
Aantekeningen en beschrijvingen
_Outptr_De parameter kan niet null zijn, en in de toestand daarna kan de aangewezen locatie niet null zijn en moet geldig zijn.
_Outptr_opt_De parameter kan null zijn, maar in de posttoestand kan de doellocatie niet null zijn en moet geldig zijn.
_Outptr_result_maybenull_De parameter kan niet null zijn en in de posttoestand kan de doellocatie null zijn.
_Outptr_opt_result_maybenull_Een parameter kan null zijn, en in de nablijvende toestand kan de verwezen locatie null zijn.
In de volgende tabel worden extra subtekenreeksen ingevoegd in de naam van de aantekening om de betekenis van de aantekening verder te kwalificeren. De verschillende subtekenreeksen zijn
_z,_COM_,_buffer_, en_bytebuffer__to_.
Belangrijk
Als de interface die u aantekeningen maakt COM is, gebruikt u de COM-vorm van deze aantekeningen. Gebruik de COM-aantekeningen niet met een andere typeinterface.
_Outptr_result_z__Outptr_opt_result_z__Outptr_result_maybenull_z__Outptr_opt_result_maybenull_z_De geretourneerde aanwijzer heeft de
_Null_terminated_aantekening._COM_Outptr__COM_Outptr_opt__COM_Outptr_result_maybenull__COM_Outptr_opt_result_maybenull_De geretourneerde aanwijzer heeft COM-semantiek, daarom heeft deze een
_On_failure_postvoorwaarde dat de geretourneerde aanwijzer null is._Outptr_result_buffer_(s)_Outptr_result_bytebuffer_(s)_Outptr_opt_result_buffer_(s)_Outptr_opt_result_bytebuffer_(s)De geretourneerde aanwijzer wijst naar een geldige buffer met een grootte van
selementen of bytes._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)De geretourneerde aanwijzer verwijst naar een buffer van grootte-elementen
sof bytes waarvan de eerstecgeldig is.
Bij bepaalde interfaceconventies wordt ervan uitgegaan dat uitvoerparameters op nul worden gezet bij een fout. Behalve voor expliciet COM-code hebben de formulieren in de volgende tabel de voorkeur. Gebruik voor COM-code de bijbehorende COM-formulieren die in de vorige sectie worden vermeld.
_Result_nullonfailure_Hiermee wijzigt u andere aantekeningen. Het resultaat wordt ingesteld op null als de functie mislukt.
_Result_zeroonfailure_Hiermee wijzigt u andere aantekeningen. Het resultaat wordt ingesteld op nul als de functie mislukt.
_Outptr_result_nullonfailure_De geretourneerde aanwijzer verwijst naar een geldige buffer als de functie slaagt of null als de functie mislukt. Deze aantekening is bedoeld voor een niet-optionele parameter.
_Outptr_opt_result_nullonfailure_De geretourneerde aanwijzer verwijst naar een geldige buffer als de functie slaagt of null als de functie mislukt. Deze aantekening is bedoeld voor een optionele parameter.
_Outref_result_nullonfailure_De geretourneerde aanwijzer verwijst naar een geldige buffer als de functie slaagt of null als de functie mislukt. Deze aantekening is bedoeld voor een referentieparameter.
Uitvoerreferentieparameters
Een veelvoorkomend gebruik van de referentieparameter is voor uitvoerparameters. Voor eenvoudige uitvoerreferentieparameters, zoals int&, _Out_ biedt de juiste semantiek. Als de uitvoerwaarde echter een aanwijzer is zoals int *&, geven de equivalente aanwijzeraantekeningen, zoals _Outptr_ int ** niet de juiste semantiek. Als u beknopt de semantiek van uitvoerreferentieparameters voor aanwijzertypen wilt uitdrukken, gebruikt u deze samengestelde aantekeningen:
Aantekeningen en beschrijvingen
_Outref_Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn.
_Outref_result_maybenull_Het resultaat moet geldig zijn in de eindtoestand, maar kan nul zijn in de eindtoestand.
_Outref_result_buffer_(s)Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn. Verwijst naar een geldige buffer van grootte
selementen._Outref_result_bytebuffer_(s)Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn. Verwijst naar een geldige buffer van grootte
sbytes._Outref_result_buffer_to_(s, c)Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn. Verwijst naar buffer van
selementen waarvan de eerstecgeldig zijn._Outref_result_bytebuffer_to_(s, c)Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn. Verwijst naar buffer van
sbytes waarvan de eerstecgeldig zijn._Outref_result_buffer_all_(s)Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn. Verwijst naar een geldige buffer met een grootte van
sgeldige elementen._Outref_result_bytebuffer_all_(s)Het resultaat moet geldig zijn na de uitvoering en mag niet nul zijn. Verwijst naar een geldige buffer van
sbytes aan geldige elementen._Outref_result_buffer_maybenull_(s)Het resultaat moet geldig zijn in de eindtoestand, maar kan nul zijn in de eindtoestand. Verwijst naar een geldige buffer van grootte
selementen._Outref_result_bytebuffer_maybenull_(s)Het resultaat moet geldig zijn in de eindtoestand, maar kan nul zijn in de eindtoestand. Verwijst naar een geldige buffer van grootte
sbytes._Outref_result_buffer_to_maybenull_(s, c)Het resultaat moet geldig zijn in de eindtoestand, maar kan nul zijn in de eindtoestand. Verwijst naar buffer van
selementen waarvan de eerstecgeldig zijn._Outref_result_bytebuffer_to_maybenull_(s,c)Het resultaat moet geldig zijn in de poststatus, maar kan null zijn in de poststatus. Verwijst naar buffer van
sbytes waarvan de eerstecgeldig zijn._Outref_result_buffer_all_maybenull_(s)Het resultaat moet geldig zijn in de poststatus, maar kan null zijn in de poststatus. Verwijst naar een geldige buffer met een grootte van
sgeldige elementen._Outref_result_bytebuffer_all_maybenull_(s)Het resultaat moet geldig zijn in de poststatus, maar kan null zijn in de poststatus. Verwijst naar een geldige buffer van
sbytes aan geldige elementen.
Retourwaarden
De retourwaarde van een functie lijkt op een _Out_ parameter, maar bevindt zich op een ander niveau van dereferentie, en u hoeft zich geen zorgen te maken over het concept van een pointer naar het resultaat. Voor de volgende aantekeningen is de retourwaarde het geannoteerde object: een scalaire waarde, een aanwijzer naar een struct of een aanwijzer naar een buffer. Deze aantekeningen hebben dezelfde semantiek als de bijbehorende _Out_ aantekening.
_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_
Tekenreeksparameters opmaken
_Printf_format_string_Geeft aan dat de parameter een notatietekenreeks is voor gebruik in eenprintfexpressie.Voorbeeld
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_Geeft aan dat de parameter een notatietekenreeks is voor gebruik in eenscanfexpressie.Voorbeeld
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_Geeft aan dat de parameter een notatietekenreeks is voor gebruik in eenscanf_sexpressie.Voorbeeld
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; }
Andere algemene aantekeningen
Aantekeningen en beschrijvingen
_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)De parameter, het veld of het resultaat bevindt zich in het bereik (inclusief) van
lowtothi. Gelijk aan_Satisfies_(_Curr_ >= low && _Curr_ <= hi), dat wordt toegepast op het geannoteerde object, samen met de juiste voorafgaande of volgende toestandsvoorwaarden.Belangrijk
Hoewel de namen 'in' en 'uit' bevatten, zijn de semantiek van
_In_en_Out_niet van toepassing op deze aantekeningen._Pre_equal_to_(expr)_Post_equal_to_(expr)De geannoteerde waarde is precies
expr. Gelijk aan_Satisfies_(_Curr_ == expr), dat wordt toegepast op het geannoteerde object, samen met de juiste voorafgaande of volgende toestandsvoorwaarden._Struct_size_bytes_(size)Van toepassing op een struct- of klassedeclaratie. Hiermee wordt aangegeven dat een geldig object van dat type groter kan zijn dan het opgegeven type, waarbij het aantal bytes wordt bepaald door
size. Voorbeeld:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };De buffergrootte in bytes van een parameter
pMvan het typeMyStruct *wordt vervolgens als volgt beschouwd:min(pM->nSize, sizeof(MyStruct))
Zie ook
- SAL-aantekeningen gebruiken om C/C++ codefouten te verminderen
- Informatie over SAL
- Aantekeningen toevoegen aan functiegedrag
- Aantekeningen toevoegen aan Structs en klassen
- Het annoteren van vergrendelingsgedrag
- opgeven wanneer en waar een aantekening van toepassing is
- Intrinsieke functies
- Aanbevolen procedures en voorbeelden