Anotace parametrů funkce a návratových hodnot
Tento článek popisuje typická použití poznámek pro jednoduché parametry funkce – skaláry a ukazatele na struktury a třídy – a většinu druhů vyrovnávacích pamětí. Tento článek také ukazuje běžné vzory použití poznámek. Další poznámky týkající se funkcí najdete v tématu Popis chování funkce.
Parametry ukazatele
Pokud je u poznámek v následující tabulce anotován parametr ukazatele, analyzátor hlásí chybu, pokud má ukazatel hodnotu null. Tato poznámka se vztahuje na ukazatele a na libovolnou datovou položku, na kterou odkazuje.
Poznámky a popisy
_In_Anotuje vstupní parametry, které jsou skaláry, struktury, ukazatele na struktury a podobně. Explicitně je možné použít u jednoduchých skalárů. Parametr musí být platný v předběžném stavu a nebude změněn.
_Out_Anotuje výstupní parametry, které jsou skaláry, struktury, ukazatele na struktury a podobně. Tuto poznámku nepoužijte na objekt, který nemůže vrátit hodnotu – například skalár, který je předán hodnotou. Parametr nemusí být platný v předběžném stavu, ale musí být platný v post-state.
_Inout_Anotuje parametr, který funkce změní. Musí být platný v předběžném i po stavu, ale předpokládá se, že před voláním a po volání bude mít jiné hodnoty. Musí platit pro upravitelnou hodnotu.
_In_z_Ukazatel na řetězec zakončený hodnotou null, který se používá jako vstup. Řetězec musí být platný v předběžném stavu. Upřednostňovány jsou varianty , které již mají
PSTRsprávné poznámky._Inout_z_Ukazatel na pole znaků ukončené hodnotou null, které se změní. Musí být platný před a po volání, ale předpokládá se, že hodnota se změnila. Je možné přesunout ukončovací znak null, ale k prvkům až do původního ukončovacího znaku null lze přistupovat.
_In_reads_(s)_In_reads_bytes_(s)Ukazatel na pole, které funkce čte. Pole má prvky
svelikosti, z nichž všechny musí být platné.Varianta
_bytes_dává místo prvků velikost v bajtech. Tuto variantu použijte pouze v případě, že velikost nelze vyjádřit jako prvky. Řetězce například používají variantu pouze v případě, že by byla podobnáchar_bytes_funkce, kteráwchar_tpoužívá ._In_reads_z_(s)Ukazatel na pole, které je ukončeno hodnotou null a má známou velikost. Prvky až po ukončovací znak null (nebo pokud neexistuje ukončovací znak null) musí být platné
sv předběžném stavu. Pokud je velikost známa v bajtech,szmenšete velikost podle velikosti prvku._In_reads_or_z_(s)Ukazatel na pole, které je ukončeno hodnotou null nebo má známou velikost nebo obojí. Prvky až po ukončovací znak null (nebo pokud neexistuje ukončovací znak null) musí být platné
sv předběžném stavu. Pokud je velikost známa v bajtech,szmenšete velikost podle velikosti prvku. (Používá se prostrnrodinu.)_Out_writes_(s)_Out_writes_bytes_(s)Ukazatel na pole prvků
s(resp. bajtů), které funkce zapisuje. Prvky pole nemusí být platné v předběžném stavu a počet prvků, které jsou platné po stavu, není zadán. Pokud existují poznámky k typu parametru, použijí se v post-state. Představte si například následující kód.typedef _Null_terminated_ wchar_t *PWSTR; void MyStringCopy(_Out_writes_(size) PWSTR p1, _In_ size_t size, _In_ PWSTR p2);V tomto příkladu volající poskytuje vyrovnávací paměť
sizeprvků prop1.MyStringCopyněkteré z těchto prvků jsou platné. Ještě důležitější je, že poznámka u znamená, že je ukončena hodnotou_Null_terminated_PWSTRnull vp1post-state. Tímto způsobem je počet platných prvků stále dobře definovaný, ale konkrétní počet prvků není vyžadován.Varianta
_bytes_dává místo prvků velikost v bajtech. Tuto variantu použijte pouze v případě, že velikost nelze vyjádřit jako prvky. Řetězce například používají variantu pouze v případě, že by byla podobnáchar_bytes_funkce, kteráwchar_tpoužívá ._Out_writes_z_(s)Ukazatel na pole
sprvků. Prvky nemusí být platné v předběžném stavu. V post-state musí být prvky nahoru přes ukončovací znak null, který musí být přítomný, platné. Pokud je velikost známa v bajtech,szmenšete velikost podle velikosti prvku._Inout_updates_(s)_Inout_updates_bytes_(s)Ukazatel na pole, které je ve funkci čtené i zapsané na . Má velikost prvků
sa je platná v předsoudku a po stavu.Varianta
_bytes_dává místo prvků velikost v bajtech. Tuto variantu použijte pouze v případě, že velikost nelze vyjádřit jako prvky. Řetězce například používají variantu pouze v případě, že by byla podobnáchar_bytes_funkce, kteráwchar_tpoužívá ._Inout_updates_z_(s)Ukazatel na pole, které je ukončeno hodnotou null a má známou velikost. Prvky, které musí být přítomné, až přes ukončovací znak null, musí být platné před stavem i po stavu. Předpokládá se, že hodnota v posouvce se liší od hodnoty v předběžném stavu. , která zahrnuje umístění ukončovací funkce null. Pokud je velikost známa v bajtech,
szmenšete velikost podle velikosti prvku._Out_writes_to_(s,c)_Out_writes_bytes_to_(s,c)_Out_writes_all_(s)_Out_writes_bytes_all_(s)Ukazatel na pole
sprvků. Prvky nemusí být platné v předběžném stavu. V post-state musí být prvkycaž do -th platné. Variantu_bytes_lze použít, pokud je velikost známa v bajtech, nikoli v počtu prvků.Například:
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)Ukazatel na pole, které funkce čte i zapisuje. Je velikosti prvků, z nichž všechny musí být platné v předběžném stavu a prvky musí
scbýt platné v post-state.Varianta
_bytes_dává místo prvků velikost v bajtech. Tuto variantu použijte pouze v případě, že velikost nelze vyjádřit jako prvky. Řetězce například používají variantu pouze v případě, že by byla podobnáchar_bytes_funkce, kteráwchar_tpoužívá ._Inout_updates_all_(s)_Inout_updates_bytes_all_(s)Ukazatel na pole, které je čtena i zapsána funkcí prvků
svelikosti. Definováno jako ekvivalent pro:_Inout_updates_to_(_Old_(s), _Old_(s)) _Inout_updates_bytes_to_(_Old_(s), _Old_(s))Jinými slovy, každý prvek, který existuje ve vyrovnávací paměti až do v předběžném stavu, je platný v předběžném i
spo stavu.Varianta
_bytes_dává místo prvků velikost v bajtech. Tuto variantu použijte pouze v případě, že velikost nelze vyjádřit jako prvky. Řetězce například používají variantu pouze v případě, že by byla podobnáchar_bytes_funkce, kteráwchar_tpoužívá ._In_reads_to_ptr_(p)Ukazatel na pole, pro které
p - _Curr_je (topznamená minus )_Curr_platný výraz. Prvky předpmusí být platné v předběžném stavu.Například:
int ReadAllElements(_In_reads_to_ptr_(EndOfArray) const int *Array, const int *EndOfArray);_In_reads_to_ptr_z_(p)Ukazatel na pole ukončené hodnotou null, pro které je výraz (to znamená
p - _Curr_pminus )_Curr_platným výrazem. Prvky předpmusí být platné v předběžném stavu._Out_writes_to_ptr_(p)Ukazatel na pole, pro které
p - _Curr_je (topznamená minus )_Curr_platný výraz. Prvky před nemusí být platné v předběžném stavu apmusí být platné v post-state._Out_writes_to_ptr_z_(p)Ukazatel na pole ukončené hodnotou null, pro které je (to znamená
p - _Curr_minus ) platnýp_Curr_výraz. Prvky před nemusí být platné v předběžném stavu apmusí být platné v post-state.
Volitelné parametry ukazatele
Pokud anotace parametru ukazatele zahrnuje _opt_ , znamená to, že parametr může mít hodnotu null. Jinak se poznámka chová stejně jako verze, která neobsahuje _opt_ . Tady je seznam _opt_ variant poznámek k parametrům ukazatele:
_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_
Parametry výstupního ukazatele
Parametry výstupního ukazatele vyžadují speciální notaci k jednoznačnosti hodnoty null u parametru a umístění, na které odkazuje.
Poznámky a popisy
_Outptr_Parametr nemůže mít hodnotu null a v poschodce nemůže být odkaz na umístění null a musí být platný.
_Outptr_opt_Parametr může mít hodnotu null, ale v poschodce nemůže být odkaz na umístění null a musí být platný.
_Outptr_result_maybenull_Parametr nemůže mít hodnotu null a v poschodce může být odkaz na umístění null.
_Outptr_opt_result_maybenull_Parametr může mít hodnotu null a v poschodce může být odkaz na umístění null.
V následující tabulce jsou do názvu poznámky vloženy další podřetězce, aby se dále kvalifikoval význam poznámky. Různé podřetězce jsou
_z, , , a_COM__buffer__bytebuffer__to_.
Důležité
Pokud je rozhraní, které přidáváte, k disznámce COM, použijte ve formuláři modelu COM tyto poznámky. Nepoužívejte anotace COM s žádným jiným typem rozhraní.
_Outptr_result_z__Outptr_opt_result_z__Outptr_result_maybenull_z__Outptr_opt_result_maybenull_z_Vrácený ukazatel má
_Null_terminated_anotaci._COM_Outptr__COM_Outptr_opt__COM_Outptr_result_maybenull__COM_Outptr_opt_result_maybenull_Vrácený ukazatel má sémantiku modelu COM, což znamená,
_On_failure_že má za předpokladu, že vrácený ukazatel je null._Outptr_result_buffer_(s)_Outptr_result_bytebuffer_(s)_Outptr_opt_result_buffer_(s)_Outptr_opt_result_bytebuffer_(s)Vrácený ukazatel ukazuje na platnou vyrovnávací paměť
sprvků velikosti nebo bajtů._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)Vrácený ukazatel ukazuje na vyrovnávací paměť
sprvků velikosti nebo bajtů, z nichž prvnícje platná.
Některé konvence rozhraní předpokládají, že výstupní parametry jsou nullified při selhání. S výjimkou explicitního kódu COM jsou upřednostňovány formuláře v následující tabulce. Pro kód COM použijte odpovídající formuláře modelu COM, které jsou uvedeny v předchozí části.
_Result_nullonfailure_Upraví jiné poznámky. Výsledek je nastaven na hodnotu null, pokud se funkce nezdařila.
_Result_zeroonfailure_Upraví jiné poznámky. Výsledek je nastaven na hodnotu nula, pokud se funkce nezdařila.
_Outptr_result_nullonfailure_Vrácený ukazatel ukazuje na platnou vyrovnávací paměť, pokud je funkce úspěšná, nebo null, pokud funkce selže. Tato anotace je určena pro nevolitelný parametr.
_Outptr_opt_result_nullonfailure_Vrácený ukazatel ukazuje na platnou vyrovnávací paměť, pokud je funkce úspěšná, nebo null, pokud funkce selže. Tato poznámka je pro volitelný parametr.
_Outref_result_nullonfailure_Vrácený ukazatel ukazuje na platnou vyrovnávací paměť, pokud je funkce úspěšná, nebo null, pokud funkce selže. Tato poznámka je určena pro parametr odkazu.
Výstupní parametry odkazu
Běžné použití referenčního parametru je pro výstupní parametry. Pro jednoduché výstupní parametry odkazu, jako int& je, _Out_ poskytuje správnou sémantiku. Pokud je však výstupní hodnota ukazatel, jako je například int *& , ekvivalentní poznámky k ukazateli, jako _Outptr_ int ** neposkytují správnou sémantiku. Pro stručné vyjádření sémantiky výstupních referenčních parametrů pro typy ukazatelů použijte tyto složené poznámky:
Poznámky a popisy
_Outref_Výsledek musí být platný v post-State a nemůže mít hodnotu null.
_Outref_result_maybenull_Výsledek musí být platný v post-State, ale může mít hodnotu null v post-State.
_Outref_result_buffer_(s)Výsledek musí být platný v post-State a nemůže mít hodnotu null. Odkazuje na platnou vyrovnávací paměť
sprvků Size._Outref_result_bytebuffer_(s)Výsledek musí být platný v post-State a nemůže mít hodnotu null. Odkazuje na platnou vyrovnávací paměť velikostí
sbajtů._Outref_result_buffer_to_(s, c)Výsledek musí být platný v post-State a nemůže mít hodnotu null. Odkazuje na vyrovnávací paměť
sprvků, z nichž prvnícje platná._Outref_result_bytebuffer_to_(s, c)Výsledek musí být platný v post-State a nemůže mít hodnotu null. Odkazuje na vyrovnávací paměť
sbajtů, jejichž prvnícje platná._Outref_result_buffer_all_(s)Výsledek musí být platný v post-State a nemůže mít hodnotu null. Odkazuje na platnou velikost vyrovnávací paměti
splatných prvků._Outref_result_bytebuffer_all_(s)Výsledek musí být platný v post-State a nemůže mít hodnotu null. Odkazuje na platnou vyrovnávací paměť
sbajtů platných prvků._Outref_result_buffer_maybenull_(s)Výsledek musí být platný v post-State, ale může mít hodnotu null v post-State. Odkazuje na platnou vyrovnávací paměť
sprvků Size._Outref_result_bytebuffer_maybenull_(s)Výsledek musí být platný v post-State, ale může mít hodnotu null v post-State. Odkazuje na platnou vyrovnávací paměť velikostí
sbajtů._Outref_result_buffer_to_maybenull_(s, c)Výsledek musí být platný v post-State, ale může mít hodnotu null v post-State. Odkazuje na vyrovnávací paměť
sprvků, z nichž prvnícje platná._Outref_result_bytebuffer_to_maybenull_(s,c)Výsledek musí být platný v post-State, ale ve stavu post může mít hodnotu null. Odkazuje na vyrovnávací paměť
sbajtů, jejichž prvnícje platná._Outref_result_buffer_all_maybenull_(s)Výsledek musí být platný v post-State, ale ve stavu post může mít hodnotu null. Odkazuje na platnou velikost vyrovnávací paměti
splatných prvků._Outref_result_bytebuffer_all_maybenull_(s)Výsledek musí být platný v post-State, ale ve stavu post může mít hodnotu null. Odkazuje na platnou vyrovnávací paměť
sbajtů platných prvků.
Vrácené hodnoty
Návratová hodnota funkce se podobá _Out_ parametru, ale je na jiné úrovni de reference a nemusíte považovat koncept ukazatele na výsledek. Pro následující poznámky je vrácená hodnota objekt s poznámkou – skalární, ukazatel na strukturu nebo ukazatel na vyrovnávací paměť. Tyto poznámky mají stejnou sémantiku jako odpovídající _Out_ Poznámka.
_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_
Parametry formátovacího řetězce
_Printf_format_string_Označuje, že parametr je formátovací řetězec pro použití veprintfvýrazu.Příklad
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_Označuje, že parametr je formátovací řetězec pro použití vescanfvýrazu.Příklad
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_Označuje, že parametr je formátovací řetězec pro použití vescanf_svýrazu.Příklad
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; }
Další běžné poznámky
Poznámky a popisy
_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)Parametr, pole nebo výsledek jsou v rozsahu (včetně) z
lownahi. Ekvivalent k_Satisfies_(_Curr_ >= low && _Curr_ <= hi)tomuto objektu s poznámkou se aplikuje spolu s příslušnými podmínkami předběžného nebo po stavu.Důležité
I když názvy obsahují "in" a "out", sémantika
_In_a_Out_neplatí pro_In_tyto poznámky._Pre_equal_to_(expr)_Post_equal_to_(expr)Hodnota v poznámce je přesně
expr. Ekvivalent k_Satisfies_(_Curr_ == expr)tomuto objektu s poznámkou se aplikuje spolu s příslušnými podmínkami předběžného nebo po stavu._Struct_size_bytes_(size)Platí pro strukturu nebo deklaraci třídy. Označuje, že platný objekt tohoto typu může být větší než deklarovaný typ, přičemž počet bajtů předávaných
size. Například:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };Velikost vyrovnávací paměti v bajtech parametru
pMtypu je pak považována zaMyStruct *:min(pM->nSize, sizeof(MyStruct))