Partilhar via


Resolver erros e avisos em construções de código não seguras

Este artigo aborda os seguintes erros do compilador:

  • CS0193: O operador * ou -> deve ser aplicado a um ponteiro de dados
  • CS0196: Um ponteiro deve ser indexado por apenas um valor
  • CS0208: Não é possível obter o endereço, obter o tamanho ou declarar um ponteiro para um tipo gerenciado ('tipo')
  • CS0209: O tipo de local declarado em uma instrução fixa deve ser um tipo de ponteiro
  • CS0210: Você deve fornecer um inicializador numa declaração de instrução fixa ou using
  • CS0211: Não é possível tomar o endereço da expressão dada
  • CS0212: Você só pode pegar o endereço de uma expressão não fixa dentro de um inicializador de instrução fixa
  • CS0213: Não é possível usar a instrução fixa para obter o endereço de uma expressão já fixa
  • CS0214: Ponteiros e buffers de tamanho fixo só podem ser usados em um contexto inseguro
  • CS0227: Código não seguro só pode aparecer se compilar com /unsafe
  • CS0233: 'identificador' não tem um tamanho predefinido, portanto, sizeof só pode ser usado em um contexto inseguro
  • CS0242: A operação em questão é indefinida em ponteiros vazios
  • CS0244: Nem 'is' nem 'as' são válidos em tipos de ponteiro
  • CS0254: O lado direito de uma atribuição de instrução fixa pode não ser uma expressão de elenco
  • CS0459: Não é possível tomar o endereço de uma variável local somente leitura
  • CS0821: Locais digitados implicitamente não podem ser corrigidos
  • CS1641: Um campo de buffer de tamanho fixo deve ter o especificador de tamanho de matriz após o nome do campo
  • CS1642: Os campos de buffer de tamanho fixo só podem ser membros de structs.
  • CS1656: Não é possível atribuir a 'variável' porque é uma 'variável de tipo somente leitura'
  • CS1663: O tipo de buffer de tamanho fixo deve ser um dos seguintes: bool, byte, short, int, long, charsbyte, ushortuintulongfloat, ou double
  • CS1665: Buffers de tamanho fixo devem ter um comprimento maior que zero
  • CS1666: Não é possível usar buffers de tamanho fixo contidos em expressões não fixas. Tente usar a instrução fixa.
  • CS1708: Buffers de tamanho fixo só podem ser acessados através de locais ou campos
  • CS1716: Não use o atributo 'System.Runtime.CompilerServices.FixedBuffer'. Em vez disso, use o modificador de campo 'fixo'.
  • CS1919: O tipo não seguro 'nome do tipo' não pode ser usado na criação de objetos.
  • CS4004: Não é possível await em um contexto inseguro
  • CS8812: Não é possível converter &Method grupo para tipo de ponteiro não-função.
  • CS9123: O operador '&' não deve ser usado em parâmetros ou variáveis locais em métodos assíncronos.

Operações de ponteiro e desreferenciação

  • CS0193: Os operadores * ou -> devem ser aplicados a um ponteiro de dados
  • CS0196: Um ponteiro deve ser indexado por apenas um valor
  • CS0242: A operação em questão é indefinida em ponteiros vazios

Para usar operações de ponteiro corretamente, siga as regras para operações de desreferenciação, indexação e aritmética. Para obter mais informações, consulte Tipos de ponteiro e Ponteiros de função.

  • Aplique o operador * ou -> aos ponteiros de dados somente (CS0193). Não use esses operadores com tipos que não sejam pointers ou ponteiros de funções. Os ponteiros de função não podem ser desreferenciados em C#, ao contrário de C/C++.
  • Ponteiros de índice com apenas um valor (CS0196). A indexação multidimensional não é suportada em ponteiros.
  • Evite operações indefinidas em ponteiros vazios (CS0242). Por exemplo, não incremente um ponteiro void porque o compilador não sabe o tamanho dos dados para os quais está a apontar.

Tipos de ponteiro e tipos gerenciados

  • CS0208: Não é possível obter o endereço, obter o tamanho ou declarar um ponteiro para um tipo gerenciado ('tipo')
  • CS0233: 'identificador' não tem um tamanho predefinido, portanto, sizeof só pode ser usado em um contexto inseguro

Para trabalhar com ponteiros e o sizeof operador corretamente, use tipos não gerenciados e contextos adequados. Para obter mais informações, consulte Tipos não gerenciados e o sizeof operador.

  • Use ponteiros somente com tipos não gerenciados (CS0208). Não obtenha o endereço de, o tamanho de, ou declare ponteiros para tipos gerenciados. Os tipos gerenciados incluem tipos de referência e estruturas que contêm campos ou propriedades de tipo de referência.
  • Use o sizeof operador dentro de um unsafe contexto ao trabalhar com tipos cujo tamanho não é uma constante de tempo de compilação (CS0233).

Buffers fixos

  • CS0209: O tipo de local declarado em uma instrução fixa deve ser um tipo de ponteiro
  • CS0210: Você deve fornecer um inicializador em uma declaração fixa ou using de instrução
  • CS0211: Não é possível tomar o endereço da expressão dada
  • CS0212: Você só pode pegar o endereço de uma expressão não fixa dentro de um inicializador de instrução fixa
  • CS0213: Não é possível usar a instrução fixa para obter o endereço de uma expressão já fixa
  • CS0254: A parte direita de uma atribuição numa instrução 'fixed' não pode ser uma expressão de conversão
  • CS0459: Não é possível obter o endereço de uma variável local somente leitura
  • CS0821: Locais digitados implicitamente não podem ser corrigidos
  • CS1656: Não pode atribuir à 'variável' porque é um 'tipo de variável de leitura apenas'

Esses erros ocorrem quando você usa a fixed instrução incorretamente. A fixed instrução impede que o coletor de lixo realoque uma variável móvel e declara um ponteiro para essa variável. Para obter mais informações, consulte Código e ponteiros não seguros.

Para usar a fixed instrução corretamente:

  • Declare a variável como um tipo de ponteiro (CS0209).
  • Forneça um inicializador na declaração da instrução fixed (CS0210).
  • Obtenha o endereço apenas de expressões válidas: campos, variáveis locais e desreferência de ponteiro (CS0211). Não tome o endereço de expressões computadas como a soma de duas variáveis.
  • Use o operador address-of em expressões não fixadas somente dentro do fixed inicializador de instrução (CS0212).
  • Não use uma fixed instrução em expressões já resolvidas (CS0213). Variáveis locais e parâmetros em um unsafe método já estão definidos na pilha.
  • Não utilize expressões de conversão no lado direito de uma declaração de atribuição (CS0254).
  • Não obtenha o endereço de variáveis locais de leitura apenas (CS0459). As variáveis em foreach loops, using instruções e fixed instruções são somente leitura.
  • Use tipos explícitos em vez de var nas instruções fixed (CS0821).
  • Não atribua a variáveis em contextos de apenas leitura, como foreach loops, using instruções ou fixed instruções (CS1656).

Restrições de contexto inseguras

  • CS0214: Ponteiros e buffers de tamanho fixo só podem ser usados em um contexto inseguro
  • CS0227: Código não seguro só pode aparecer se compilar com /unsafe
  • CS0244: Nem 'is' nem 'as' são válidos em tipos de ponteiro
  • CS1919: O tipo não seguro 'nome do tipo' não pode ser usado na criação de objetos
  • CS4004: Não é possível esperar em um contexto inseguro
  • CS9123: O operador '&' não deve ser usado em parâmetros ou variáveis locais em métodos assíncronos

Esses erros ocorrem quando você usa construções de código não seguras sem contexto inseguro adequado ou quando tenta operações que não são permitidas em código não seguro. Para obter mais informações, consulte Código e ponteiros não seguros e a unsafe palavra-chave.

Para usar o código não seguro corretamente:

  • Marque métodos, tipos ou blocos de código que usam ponteiros ou buffers de tamanho fixo com a unsafe palavra-chave (CS0214).
  • Habilite a opção de compilador AllowUnsafeBlocks nas configurações do seu projeto ao usar a unsafe palavra-chave (CS0227).
  • Não use os operadores is ou as com tipos de ponteiro (CS0244). Esses operadores de teste de tipo não são válidos para ponteiros.
  • Não use o operador new para criar instâncias do tipo de ponteiro (CS1919). Para criar objetos na memória não gerida, use interop para chamar métodos nativos que retornam ponteiros.
  • Mantenha o código não seguro separado do código assíncrono (CS4004). Crie métodos separados para operações inseguras e chame-os a partir de métodos assíncronos.
  • Não use o operador de endereço (&) em parâmetros ou variáveis locais em métodos assíncronos (CS9123). A variável pode não existir quando a operação assíncrona for concluída.

Buffers de tamanho fixo

  • CS1641: Um campo de buffer de tamanho fixo deve ter o especificador de tamanho de matriz após o nome do campo
  • CS1642: Campos de buffer de tamanho fixo só podem ser membros de structs
  • CS1663: O tipo de buffer de tamanho fixo deve ser um dos seguintes: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float ou double
  • CS1665: Buffers de tamanho fixo devem ter um comprimento maior que zero
  • CS1666: Não é possível usar buffers de tamanho fixo contidos em expressões não fixas. Tente usar a instrução fixed
  • CS1708: Buffers de tamanho fixo só podem ser acessados através de locais ou campos
  • CS1716: Não use o atributo 'System.Runtime.CompilerServices.FixedBuffer'. Em vez disso, use o modificador de campo 'fixo'

Esses erros ocorrem quando você trabalha com buffers de tamanho fixo. Os buffers de tamanho fixo são matrizes incorporadas diretamente em structs e são usados principalmente para cenários de interoperabilidade. Para obter mais informações, consulte Buffers de tamanho fixo.

Para declarar e usar buffers de tamanho fixo corretamente:

  • Especifique o tamanho da matriz após o nome do campo usando uma constante inteira positiva (CS1641, CS1665).
  • Declare buffers de tamanho fixo somente em structs, não em classes (CS1642). Use uma matriz regular se precisar do campo em uma classe.
  • Use um dos tipos de elementos suportados: bool, byte, short, int, long, char, sbyte, ushort, uintulongfloatou double (CS1663).
  • Use uma fixed instrução para fixar o struct que contém antes de acessar o buffer (CS1666).
  • Acesse buffers de tamanho fixo somente por meio de locais ou campos, não por meio de expressões intermediárias (CS1708).
  • Use o fixed modificador de campo em vez do System.Runtime.CompilerServices.FixedBuffer atributo (CS1716).

Ponteiros de função

  • CS8812: Não é possível converter &Method grupo para tipo de ponteiro não-função

Para obter um ponteiro de função, use o operador de endereço com um tipo de ponteiro de função explicitamente convertido. Não use o operador &address-of para atribuir grupos de métodos a void* ou a outros tipos de ponteiro que não sejam de função. Para obter mais informações, consulte Ponteiros de função.