Anotando parâmetros de função e valores de retorno
Este artigo descreve os usos mais comuns de anotações para parâmetro- escalares de função simples, e ponteiros para estruturas e classes - e a maioria dos tipos de buffers.Este artigo também mostra padrões comuns de uso para anotações.Para anotações adicionais que são relacionadas a funções, consulte Anotando o comportamento da função
Parâmetros de ponteiro
Para anotações na tabela a seguir, quando um parâmetro do ponteiro está sendo anotado, o analisador relata um erro se o ponteiro é nulo.Isso se aplica a ponteiros e qualquer item de dados que é apontado.
Anotação |
Descrição |
---|---|
_In_ |
Annotates os parâmetros de entrada que são escalares, estruturas, ponteiros para estruturas e iguais.Explicitamente pode ser usado em escalares simples.O parâmetro deve ser válido no estado pré-compilação e não será alterado. |
_Out_ |
Annotates parâmetros de saída que são escalares, estruturas, ponteiros para estruturas e iguais.Isso não aplicar a um objeto que não pode retornar a - por exemplo, um único que é passado por valor.O parâmetro não tem que ser válido no estado pré-compilação mas deve ser válido no estado posteriores. |
_Inout_ |
Annotates um parâmetro que é modificado pela função.Deve ser válido no estado passos pré e o estado, mas é suposot diferentes valores antes e depois de chamada.Deve ser aplicados a um valor modificável. |
_In_z_ |
Um ponteiro para uma cadeia de caracteres NULL- finalizada que é usada como entrada.A cadeia de caracteres deve ser válido em passos estado.Variantes de PSTR, já que têm as anotações corretas, são preferenciais. |
_Inout_z_ |
Um ponteiro para uma matriz de caracteres NULL- finalizada que é modificada.Deve ser válido antes e após a chamada, mas o valor é assumido ter sido alterado.Terminador o zero pode ser movido, mas somente os elementos até o terminador nulo original podem ser acessados. |
_In_reads_(s) _In_reads_bytes_(s) |
Um ponteiro para uma matriz, que é lido pela função.A matriz é de elementos de s de tamanho, que deve ser válido. A variante de _bytes_ fornece o tamanho em bytes em vez de elementos.Use isso somente quando o tamanho não pode ser expresso como elementos.Por exemplo, cadeias de caracteres de char usariam a variante de _bytes_ somente se uma função semelhante que usa wchar_t . |
_In_reads_z_(s) |
Um ponteiro para uma matriz que NULL- é finalizada e tem um tamanho conhecido.Os elementos até o terminador- zero ou s se não houver nenhum zero terminador- deve ser válido em passos estado.Se o tamanho é conhecido em bytes, escala s pelo tamanho do elemento. |
_In_reads_or_z_(s) |
Um ponteiro para uma matriz que NULL- é finalizada ou tem um tamanho conhecido, ou ambos.Os elementos até o terminador- zero ou s se não houver nenhum zero terminador- deve ser válido em passos estado.Se o tamanho é conhecido em bytes, escala s pelo tamanho do elemento.(Usado para a família de strn .) |
_Out_writes_(s) _Out_writes_bytes_(s) |
Um ponteiro para uma matriz de elementos s (resp.bytes) que será escrito pela função.Os elementos da matriz não precisam ser válido em passos estado, e o número de elementos que são válidos em após estado não é especificado.Se houver anotações no tipo de parâmetro, são aplicados em após estado.Por exemplo, considere o seguinte código.
Nesse exemplo, o chamador fornece um buffer de elementos de size para p1.MyStringCopy faz parte desses elementos válido.Mais importante, a anotação de _Null_terminated_ em PWSTR significa que p1 NULL- é encerrado no estado posteriores.Dessa forma, o número de elementos válidos ainda é bem definido, mas uma contagem específica de elemento não é necessária. A variante de _bytes_ fornece o tamanho em bytes em vez de elementos.Use isso somente quando o tamanho não pode ser expresso como elementos.Por exemplo, cadeias de caracteres de char usariam a variante de _bytes_ somente se uma função semelhante que usa wchar_t . |
_Out_writes_z_(s) |
Um ponteiro para uma matriz de elementos s .Elementos não têm que ser válido em passos estado.Após no estado, os elementos anterior com o zero terminador- que deve ser atual- deve ser válido.Se o tamanho é conhecido em bytes, escala s pelo tamanho do elemento. |
_Inout_updates_(s) _Inout_updates_bytes_(s) |
Um ponteiro para uma matriz, que é ler e gravar na função.É de elementos de s de tamanho, e válido no estado passos pré e o estado. A variante de _bytes_ fornece o tamanho em bytes em vez de elementos.Use isso somente quando o tamanho não pode ser expresso como elementos.Por exemplo, cadeias de caracteres de char usariam a variante de _bytes_ somente se uma função semelhante que usa wchar_t . |
_Inout_updates_z_(s) |
Um ponteiro para uma matriz que NULL- é finalizada e tem um tamanho conhecido.Os elementos anterior com o zero terminador- que deve ser atual- deve ser válido no estado passos pré e o estado.Após o valor no estado é presumido ser diferente do valor no estado; pré-compilação isso inclui o local terminador de zero.Se o tamanho é conhecido em bytes, escala s pelo tamanho do elemento. |
_Out_writes_to_(s,c) _Out_writes_bytes_to_(s,c) _Out_writes_all_(s) _Out_writes_bytes_all_(s) |
Um ponteiro para uma matriz de elementos s .Elementos não têm que ser válido em passos estado.Após no estado, os elementos até c- o elemento de th deve ser válido.Se o tamanho é conhecido em bytes, a escala s e c pelo tamanho do elemento ou usa a variante de _bytes_ , que é definido como:
Ou seja cada elemento que existe em buffer até s pré-compilação no estado é válido no estado posteriores.Por exemplo:
|
_Inout_updates_to_(s,c) _Inout_updates_bytes_to_(s,c) |
Um ponteiro para uma matriz, que é ler e gravar função.É de elementos de s de tamanho, que deve ser válido em passos estado, e os elementos de c deve ser válido no estado posteriores. A variante de _bytes_ fornece o tamanho em bytes em vez de elementos.Use isso somente quando o tamanho não pode ser expresso como elementos.Por exemplo, cadeias de caracteres de char usariam a variante de _bytes_ somente se uma função semelhante que usa wchar_t . |
_Inout_updates_all_(s) _Inout_updates_bytes_all_(s) |
Um ponteiro para uma matriz, que é ler e gravar pela função dos elementos de s de tamanho.Definido como equivalente a:
Ou seja cada elemento que existe em buffer até s pré-compilação no estado é válido no estado passos pré e o estado. A variante de _bytes_ fornece o tamanho em bytes em vez de elementos.Use isso somente quando o tamanho não pode ser expresso como elementos.Por exemplo, cadeias de caracteres de char usariam a variante de _bytes_ somente se uma função semelhante que usa wchar_t . |
_In_reads_to_ptr_(p) |
Um ponteiro para uma matriz para que a expressão p – _Curr_ (isto é, p menos _Curr_) é definido por padrão de idioma apropriado.Os elementos antes de p deve ser válido em passos estado. |
_In_reads_to_ptr_z_(p) |
Um ponteiro para uma matriz NULL- finalizada para que a expressão p – _Curr_ (isto é, p menos _Curr_) é definido por padrão de idioma apropriado.Os elementos antes de p deve ser válido em passos estado. |
_Out_writes_to_ptr_(p) |
Um ponteiro para uma matriz para que a expressão p – _Curr_ (isto é, p menos _Curr_) é definido por padrão de idioma apropriado.Os elementos antes de p não têm que ser válido em passos estado e deve ser válido no estado posteriores. |
_Out_writes_to_ptr_z_(p) |
Um ponteiro para uma matriz NULL- finalizada para que a expressão p – _Curr_ (isto é, p menos _Curr_) é definido por padrão de idioma apropriado.Os elementos antes de p não têm que ser válido em passos estado e deve ser válido no estado posteriores. |
Parâmetros opcionais do ponteiro
Quando uma anotação do ponteiro inclui _opt_, indica que o parâmetro pode ser nulo.Caso contrário, a anotação executa o mesmo que a versão que não inclui _opt_.Aqui está uma lista de variantes de _opt_ de anotações do ponteiro:
_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_ |
Parâmetros do ponteiro de saída
Os parâmetros do ponteiro de saída requerem a notação especial torne o NULL- Ness no parâmetro e apontar- para o local.
Anotação |
Descrição |
---|---|
_Outptr_ |
O parâmetro não pode ser nulo, e posteriores no estado apontar- para o local não pode ser o zero e deve ser válido. |
_Outptr_opt_ |
O parâmetro pode ser nulo, mas após no estado apontar- para o local não pode ser o zero e deve ser válido. |
_Outptr_result_maybenull_ |
O parâmetro não pode ser nulo, e posteriores no estado apontar- para o local pode ser nulo. |
_Outptr_opt_result_maybenull_ |
O parâmetro pode ser nulo, e posteriores no estado apontar- para o local pode ser nulo. |
Na tabela a seguir, as subcadeias de caracteres adicionais são inseridas no nome de anotação para qualificar mais significado de anotação.Várias subcadeias de caracteres são _z, _COM_, _buffer_, _bytebuffer_, e _to_.
Importante |
---|
Se a interface que você está anotando é COM, use o formulário COM dessas anotações.Não use as anotações COM com nenhuma outra interface de tipo. |
Anotação |
Descrição |
---|---|
_Outptr_result_z_ _Outptr_opt_result_z_ _Outptr_result_maybenull_z_ _Ouptr_opt_result_maybenull_z_ |
O ponteiro retornado tem a anotação de _Null_terminated_ . |
_COM_Outptr_ _COM_Outptr_opt_ _COM_Outptr_result_maybenull_ _COM_Outptr_opt_result_maybenull_ |
O ponteiro retornado tem a semântica COM, e portanto após leva uma condição de _On_failure_ que o ponteiro retornado é nulo. |
_Outptr_result_buffer_(s) _Outptr_result_bytebuffer_(s) _Outptr_opt_result_buffer_(s) _Outptr_opt_result_bytebuffer_(s) |
Os pontos retornados de ponteiro para um buffer válido de elementos ou de bytes de s de tamanho. |
_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) |
Os pontos retornados de ponteiro para um buffer de elementos ou de bytes de s de tamanho, que primeiro c é válido. |
Determinadas convenções de interface presumem que os parâmetros de saída são anulados em caso de falha.A exceção explicitamente de código COM, formulários na tabela a seguir são preferenciais.Para o código COM, use os formulários correspondentes COM que são listados na seção anterior.
Anotação |
Descrição |
---|---|
_Result_nullonfailure_ |
Altera outras anotações.O resultado é definido como nulo se a função falhar. |
_Result_zeroonfailure_ |
Altera outras anotações.O resultado é definido como zero se a função falhar. |
_Outptr_result_nullonfailure_ |
Os pontos retornados de ponteiro para um buffer válido se a função tiver êxito, ou zero se a função falhar.Esta anotação é para um parâmetro não opcional. |
_Outptr_opt_result_nullonfailure_ |
Os pontos retornados de ponteiro para um buffer válido se a função tiver êxito, ou zero se a função falhar.Esta anotação é para um parâmetro opcional. |
_Outref_result_nullonfailure_ |
Os pontos retornados de ponteiro para um buffer válido se a função tiver êxito, ou zero se a função falhar.Esta anotação é para um parâmetro de referência. |
Parâmetros de referência de saída
Um uso comum de parâmetro de referência é para parâmetros de saída.Para referência simples de saída parâmetro- por exemplo, int&—_Out_ fornece semântica correta.No entanto, quando o valor de saída for ao tipo para o exemplo int *&— anotações equivalentes do ponteiro como _Outptr_ int ** não fornece semântica correta.Para expressar concisa a semântica de parâmetros de referência de saída para tipos ponteiro, use essas anotações compostas:
Anotação |
Descrição |
---|---|
_Outref_ |
O resultado deve ser válido no estado pré e não pode ser nulo. |
_Outref_result_maybenull_ |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado posteriores. |
_Outref_result_buffer_(s) |
O resultado deve ser válido no estado pré e não pode ser nulo.Pontos ao buffer válido de elementos de s de tamanho. |
_Outref_result_bytebuffer_(s) |
O resultado deve ser válido no estado pré e não pode ser nulo.Pontos ao buffer válido de bytes de s de tamanho. |
_Outref_result_buffer_to_(s, c) |
O resultado deve ser válido no estado pré e não pode ser nulo.Pontos ao buffer de elementos de s , que primeiro c é válido. |
_Outref_result_bytebuffer_to_(s, c) |
O resultado deve ser válido no estado pré e não pode ser nulo.Pontos ao buffer de bytes de s da primeira c é válido. |
_Outref_result_buffer_all_(s) |
O resultado deve ser válido no estado pré e não pode ser nulo.Pontos ao buffer válido de elementos válidos de s de tamanho. |
_Outref_result_bytebuffer_all_(s) |
O resultado deve ser válido no estado pré e não pode ser nulo.Pontos ao buffer válido de bytes de s de elementos válidos. |
_Outref_result_buffer_maybenull_(s) |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado posteriores.Pontos ao buffer válido de elementos de s de tamanho. |
_Outref_result_bytebuffer_maybenull_(s) |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado posteriores.Pontos ao buffer válido de bytes de s de tamanho. |
_Outref_result_buffer_to_maybenull_(s, c) |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado posteriores.Pontos ao buffer de elementos de s , que primeiro c é válido. |
_Outref_result_bytebuffer_to_maybenull_(s,c) |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado de postagem.Pontos ao buffer de bytes de s da primeira c é válido. |
_Outref_result_buffer_all_maybenull_(s) |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado de postagem.Pontos ao buffer válido de elementos válidos de s de tamanho. |
_Outref_result_bytebuffer_all_maybenull_(s) |
O resultado deve ser válido no estado posteriores, mas pode ser nulo no estado de postagem.Pontos ao buffer válido de bytes de s de elementos válidos. |
Valores de retorno
O valor de retorno de uma função é semelhante a um parâmetro de _Out_ mas está-se a nível diferente de- referência, e você não precisa considerar o conceito de ponteiro ao resultado.Para as anotações, o valor de retorno é o objeto - um anotado escalar, um ponteiro para um estrutura, ou um ponteiro para um buffer.Essas anotações têm a mesma semântica que a anotação correspondente de _Out_ .
_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_ |
Outras anotações comuns
Anotação |
Descrição |
---|---|
_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) |
O parâmetro, o campo, ou o resultado está no intervalo (-) de low a hi.Equivalente a _Satisfies_(_Curr_ >= low && _Curr_ <= hi) que é aplicada ao objeto anotado junto com as condições apropriadas de estado ou passos pré de estado.
Importante
Embora os nomes contém “e” em “para fora”, a semântica de _In_ e _Out_not se aplicam a essas anotações.
|
_Pre_equal_to_(expr) _Post_equal_to_(expr) |
O valor anotado é exatamente expr.Equivalente a _Satisfies_(_Curr_ == expr) que é aplicada ao objeto anotado junto com as condições apropriadas de estado ou passos pré de estado. |
_Struct_size_bytes_(size) |
Se aplica a uma declaração de estrutura ou classe.Indica que um objeto válido desse tipo pode ser maior do que o tipo declarado, com o número de bytes que estão sendo dados por size.Por exemplo:
O tamanho do buffer em bytes de pM um parâmetro de tipo MyStruct * é então ser colocada:
|
Recursos relacionados
Blog da Equipe de Análise de Código
Consulte também
Referência
Anotando o comportamento da função
Anotando o comportamento de bloqueio
Especificando quando e onde uma anotação se aplica
Práticas recomendadas e exemplos (SAL)
Conceitos
Outros recursos
Usando o SAL anotações para reduzir os defeitos no código C/C++