Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í pro poznámky. Další poznámky související s funkcemi najdete v tématu Přidávání poznámek k chování funkce.
Parametry ukazatele
Pro poznámky v následující tabulce, pokud je parametr ukazatele anotován, analyzátor hlásí chybu, pokud ukazatel má 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ě lze 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žívejte u objektu, který nemůže vrátit hodnotu – například skalár předaný hodnotou. Parametr nemusí být platný v předběžném stavu, ale musí být platný v post-state.
_Inout_Anotuje parametr, který bude změněn funkcí. Musí být platný v představovém i po stavu, ale předpokládá se, že má před voláním a po něm různé hodnoty. Musí se použít na upravitelnou hodnotu.
_In_z_Ukazatel na řetězec ukončený hodnotou null, který se používá jako vstup. Řetězec musí být platný v předběžném stavu. Preferují se varianty
PSTR, které již mají správné poznámky._Inout_z_Ukazatel na pole znaků s ukončenou hodnotou null, které bude změněno. Musí být platný před a po volání, ale předpokládá se, že se hodnota změnila. Ukončovací znak null může být přesunut, ale přístup k původnímu ukončovacímu znaku null může být pouze elementy.
_In_reads_(s)_In_reads_bytes_(s)Ukazatel na matici, která je přečtená funkcí. Pole má prvky velikosti
s, z nichž všechny musí být platné.Varianta
_bytes_dává velikost v bajtech místo prvků. Tuto variantu použijte pouze v případě, že velikost nemůže být vyjádřena jako prvky. Například řetězce by používaly variantucharpouze v případě,_bytes_že by podobná funkce, která by používalawchar_t._In_reads_z_(s)Ukazatel na pole, které je ukončeno null a má známou velikost. Prvky až do ukončovací funkce null (nebo
spokud neexistuje ukončovací modul s hodnotou null), musí být platné v představci. Pokud je velikost známá v bajtech, škálujtesvelikost prvku._In_reads_or_z_(s)Ukazatel na pole, které je ukončeno null nebo má známou velikost nebo obojí. Prvky až do ukončovací funkce null (nebo
spokud neexistuje ukončovací modul s hodnotou null), musí být platné v představci. Pokud je velikost známá v bajtech, škálujtesvelikost prvku. (Používá se prostrnrodinu.)_Out_writes_(s)_Out_writes_bytes_(s)Ukazatel na pole
sprvků (resp. bajtů), které bude funkce zapisovat. Prvky pole nemusí být platné v předběžném stavu a počet prvků, které jsou platné v post-state, není zadán. Pokud typ parametru obsahuje poznámky, 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é. Důležitější je, že poznámka znamená_Null_terminated_,PWSTRžep1je ukončena hodnotou null v post-state. Tímto způsobem je počet platných prvků stále dobře definovaný, ale konkrétní počet prvků není povinný.Varianta
_bytes_dává velikost v bajtech místo prvků. Tuto variantu použijte pouze v případě, že velikost nemůže být vyjádřena jako prvky. Například řetězce by používaly variantucharpouze v případě,_bytes_že by podobná funkce, která by používalawchar_t._Out_writes_z_(s)Ukazatel na pole
sprvků. Prvky nemusí být platné v předběžném stavu. V závěrečném stavu musí být elementy až přes ukončovací znak null , který musí existovat, platné. Pokud je velikost známá v bajtech, škálujtesvelikost prvku._Inout_updates_(s)_Inout_updates_bytes_(s)Ukazatel na pole, které je čteno i zapsáno do funkce. Jedná se o prvky velikosti
sa platné v představovém stavu a po stavu.Varianta
_bytes_dává velikost v bajtech místo prvků. Tuto variantu použijte pouze v případě, že velikost nemůže být vyjádřena jako prvky. Například řetězce by používaly variantucharpouze v případě,_bytes_že by podobná funkce, která by používalawchar_t._Inout_updates_z_(s)Ukazatel na pole, které je ukončeno hodnotou null a má známou velikost. Prvky až do ukončovací funkce null , které musí být přítomny, musí být platné v představovém i po stavu. Hodnota v post-state se předpokládá, že se liší od hodnoty v představu; obsahující umístění ukončovací funkce null. Pokud je velikost známá v bajtech, škálujte
svelikost 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 prvky až doc-th elementu platné. Variantu_bytes_lze použít, pokud je velikost známa v bajtech, nikoli v počtu prvků.Pří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. Jedná se o prvky velikosti
s, z nichž všechny musí být platné v předběžném stavu acprvky musí být platné v post-state.Varianta
_bytes_dává velikost v bajtech místo prvků. Tuto variantu použijte pouze v případě, že velikost nemůže být vyjádřena jako prvky. Například řetězce by používaly variantucharpouze v případě,_bytes_že by podobná funkce, která by používalawchar_t._Inout_updates_all_(s)_Inout_updates_bytes_all_(s)Ukazatel na pole, který je čtený i zapsaný funkcí prvků velikosti
s. Definováno jako ekvivalentní:_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ž
sdo stavu před stavem, je platný v představu a po stavu.Varianta
_bytes_dává velikost v bajtech místo prvků. Tuto variantu použijte pouze v případě, že velikost nemůže být vyjádřena jako prvky. Například řetězce by používaly variantucharpouze v případě,_bytes_že by podobná funkce, která by používalawchar_t._In_reads_to_ptr_(p)Ukazatel na matici,
p - _Curr_pro kteroup(tedy minus_Curr_) je platný výraz. Prvky musípbýt před stavem platné.Příklad:
int ReadAllElements(_In_reads_to_ptr_(EndOfArray) const int *Array, const int *EndOfArray);_In_reads_to_ptr_z_(p)Ukazatel na pole s ukončenou hodnotou null, pro který je výraz
p - _Curr_(tjp. minus_Curr_) platným výrazem. Prvky musípbýt před stavem platné._Out_writes_to_ptr_(p)Ukazatel na matici,
p - _Curr_pro kteroup(tedy minus_Curr_) je platný výraz. Prvky před tím, nežpmusí být platné v předběžném stavu a musí být platné v post-state._Out_writes_to_ptr_z_(p)Ukazatel na pole s ukončenou hodnotou null,
p - _Curr_pro kterép(tj. minus_Curr_) je platný výraz. Prvky před tím, nežpmusí být platné v předběžném stavu a musí být platné v post-state.
Volitelné parametry ukazatele
Pokud anotace parametru ukazatele obsahuje _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 parametrů 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, která u parametru a umístění odkazuje na nejednoznačnost null.
Poznámky a popisy
_Outptr_Parametr nemůže mít hodnotu null a ve stavu post-to-to-location nemůže být null a musí být platný.
_Outptr_opt_Parametr může mít hodnotu null, ale ve stavu post-to-to-location nemůže být null a musí být platný.
_Outptr_result_maybenull_Parametr nemůže mít hodnotu null a ve stavu post-to-to-location může mít hodnotu null.
_Outptr_opt_result_maybenull_Parametr může mít hodnotu null a ve stavu post-to-to-location může mít hodnotu null.
V následující tabulce jsou do názvu poznámky vloženy další podřetězené řetězce, které dále kvalifikují význam poznámky. Různé podřetětěce jsou
_z,_COM_,_buffer_,_bytebuffer_a_to_.
Důležité
Pokud je rozhraní, které píšete poznámkami, com, použijte formu modelu COM těchto poznámek. Nepoužívejte poznámky MODELU COM s žádným jiným rozhraním typu.
_Outptr_result_z__Outptr_opt_result_z__Outptr_result_maybenull_z__Outptr_opt_result_maybenull_z_Vrácený ukazatel má poznámku
_Null_terminated_._COM_Outptr__COM_Outptr_opt__COM_Outptr_result_maybenull__COM_Outptr_opt_result_maybenull_Vrácený ukazatel má sémantiku modelu COM, což je důvod, proč nese
_On_failure_post-condition, že vrácený ukazatel má hodnotu null._Outptr_result_buffer_(s)_Outptr_result_bytebuffer_(s)_Outptr_opt_result_buffer_(s)_Outptr_opt_result_bytebuffer_(s)Vrácený ukazatel odkazuje na platnou vyrovnávací paměť prvků velikosti
snebo 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 odkazuje na vyrovnávací paměť prvků velikosti
snebo bajtů, z nichž prvnícjsou platné.
Některé konvence rozhraní předpokládají, že při selhání jsou výstupní parametry null. S výjimkou explicitního kódu COM jsou upřednostňované 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í další poznámky. Výsledek je nastaven na hodnotu null, pokud funkce selže.
_Result_zeroonfailure_Upraví další poznámky. Pokud funkce selže, nastaví se výsledek na nulu.
_Outptr_result_nullonfailure_Vrácený ukazatel odkazuje na platnou vyrovnávací paměť, pokud je funkce úspěšná, nebo null, pokud funkce selže. Tato poznámka je určená pro nepovinný parametr.
_Outptr_opt_result_nullonfailure_Vrácený ukazatel odkazuje na platnou vyrovnávací paměť, pokud je funkce úspěšná, nebo null, pokud funkce selže. Tato poznámka je určená pro volitelný parametr.
_Outref_result_nullonfailure_Vrácený ukazatel odkazuje na platnou vyrovnávací paměť, pokud je funkce úspěšná, nebo null, pokud funkce selže. Tato poznámka je určená pro referenční parametr.
Výstupní referenční parametry
Běžné použití referenčního parametru je pro výstupní parametry. Pro jednoduché referenční parametry výstupu, jako int&je například , _Out_ poskytuje správnou sémantiku. Pokud je však výstupní hodnota ukazatel, například , ekvivalentní poznámky ukazatele, jako int *&_Outptr_ int ** je, neposkytují správnou sémantiku. Pokud chcete výstižně vyjádřit sémantiku 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 nesmí být 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 nesmí být null. Odkazuje na platnou vyrovnávací paměť prvků velikosti
s._Outref_result_bytebuffer_(s)Výsledek musí být platný v post-state a nesmí být null. Odkazuje na platnou vyrovnávací paměť bajtů velikosti
s._Outref_result_buffer_to_(s, c)Výsledek musí být platný v post-state a nesmí být null. Odkazuje na vyrovnávací paměť
sprvků, z nichž prvnícjsou platné._Outref_result_bytebuffer_to_(s, c)Výsledek musí být platný v post-state a nesmí být null. Odkazuje na vyrovnávací paměť
sbajtů, z nichž prvnícjsou platné._Outref_result_buffer_all_(s)Výsledek musí být platný v post-state a nesmí být null. Odkazuje na platnou vyrovnávací paměť platných prvků velikosti
s._Outref_result_bytebuffer_all_(s)Výsledek musí být platný v post-state a nesmí být null. Odkazuje na platnou
svyrovnávací paměť bajtů 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ěť prvků velikosti
s._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ěť bajtů velikosti
s._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ícjsou platné._Outref_result_bytebuffer_to_maybenull_(s,c)Výsledek musí být platný v post-state, ale může mít hodnotu null ve stavu post. Odkazuje na vyrovnávací paměť
sbajtů, z nichž prvnícjsou platné._Outref_result_buffer_all_maybenull_(s)Výsledek musí být platný v post-state, ale může mít hodnotu null ve stavu post. Odkazuje na platnou vyrovnávací paměť platných prvků velikosti
s._Outref_result_bytebuffer_all_maybenull_(s)Výsledek musí být platný v post-state, ale může mít hodnotu null ve stavu post. Odkazuje na platnou
svyrovnávací paměť bajtů platných prvků.
Vrácené hodnoty
Návratová hodnota funkce se podobá parametru _Out_ , ale je na jiné úrovni odkazu a nemusíte brát v úvahu koncept ukazatele na výsledek. U následujících poznámek je návratová hodnota objekt s poznámkami – skalár, 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_
Formátování parametrů řetězce
_Printf_format_string_Označuje, že parametr je formátovací řetězec pro použití ve výrazuprintf.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í ve výrazuscanf.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í ve výrazuscanf_s.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 je v rozsahu (včetně) od
lowdohi. Ekvivalent,_Satisfies_(_Curr_ >= low && _Curr_ <= hi)který se použije u anotovaného objektu společně s odpovídajícími podmínkami před stavem nebo po stavu.Důležité
I když názvy obsahují "in" a "out", sémantika
_In_a_Out_nevztahuje se na tyto poznámky._Pre_equal_to_(expr)_Post_equal_to_(expr)Anotovaná hodnota je přesně
expr. Ekvivalent,_Satisfies_(_Curr_ == expr)který se použije u anotovaného objektu společně s odpovídajícími podmínkami před stavem nebo po stavu._Struct_size_bytes_(size)Platí pro deklaraci struktury nebo třídy. Označuje, že platný objekt tohoto typu může být větší než deklarovaný typ s počtem bajtů, které jsou dány
size. Příklad:typedef _Struct_size_bytes_(nSize) struct MyStruct { size_t nSize; ... };Velikost vyrovnávací paměti v bajtech parametru
pMtypuMyStruct *se pak provede takto:min(pM->nSize, sizeof(MyStruct))