Partilhar via


Analisar a qualidade do código C++ de aplicativos da Store usando a análise de código estático do Visual Studio

Aplica-se ao Windows e Windows Phone

A ferramenta de análise de código no Visual Studio Express Edition examina o código em busca de uma série de problemas e violações comuns das práticas recomendadas de programação. Os avisos da análise de código diferem dos erros e avisos do compilador porque a análise de código procura por padrões de código específicos que são válidos, mas que ainda podem criar problemas para você ou outras pessoas que usam seu código. A análise de código também pode localizar os defeitos no seu código que são difíceis de descobrir com testes. A execução da ferramenta de análise de código a intervalos regulares durante o processo de desenvolvimento pode melhorar a qualidade do seu aplicativo concluído.

Dica

No Visual Studio Ultimate, no Visual Studio Premium e no Visual Studio Professional, você pode usar a funcionalidade completa das ferramentas de análise de código.Veja Analisando a qualidade do aplicativo usando ferramentas de análise de código na Biblioteca MSDN.

Neste tópico

Estes são os assuntos tratados:

Executando a análise de código

Analisando e resolvendo avisos da análise de código

Suprimindo avisos da análise de código

Pesquisando e filtrando resultados de análise de código

C++ code analysis warnings

Executando a análise de código

Para executar a análise de código em sua solução do Visual Studio:

  • No menu Compilar, escolha Executar Análise de Código na Solução.

Para executar a análise de código automaticamente cada vez que você compilar um projeto:

  1. Escolha o nome do projeto no Gerenciador de Soluções e escolha Propriedades.

  2. Na página de propriedades do projeto, escolha Análise de Código e Habilitar Análise de Código para C/C++ na Compilação.

A solução é compilada e a análise de código é executada. Os resultados aparecem na janela Análise de Código.

Janela de Análise de código

Analisando e resolvendo avisos da análise de código

Para analisar um aviso específico, escolha o título do aviso na janela Análise de Código. O aviso se expande para exibir informações detalhadas sobre o problema. Quando possível, a análise de código exibe o número da linha e a lógica da análise que levou ao aviso.

Aviso de análise de código expandido

Quando você expande um aviso, as linhas de código que causaram o aviso são realçadas no editor de códigos do Visual Studio.

Código-fonte realçado

Depois de entender o problema, você pode resolvê-lo no seu código. Em seguida, torne a executar a análise de código para verificar se o aviso não aparece mais na janela Análise de Código e se a sua correção não gerou novos avisos.

Dica

Você pode executar a análise de código novamente na janela Análise de Código.Clique no botão Analisar, em seguida, escolha o escopo da análise.A análise pode ser executada na solução inteira ou em um projeto selecionado.

Suprimindo avisos da análise de código

Há ocasiões em que você pode decidir não corrigir um aviso de análise de código. Você pode decidir que resolver o aviso exige recodificação demais considerando a probabilidade de que o problema ocorrerá em qualquer implementação do seu código no mundo real. Ou você pode achar que a análise usada no aviso é inadequada nesse contexto específico. É possível suprimir avisos individuais para que não apareçam mais na janela Análise de Código.

Para suprimir um aviso:

  1. Se as informações detalhadas não estiverem exibidas, expanda o título do aviso.

  2. Escolha o link Ações na parte inferior do aviso.

  3. Escolha Suprimir Mensagem e escolha Na Origem.

Suprimir uma mensagem insere #pragma(warning:Id do aviso) que suprime o aviso para a linha de código.

Pesquisando e filtrando resultados de análise de código

Você pode pesquisar listas longas de mensagens de aviso e pode filtrar avisos em soluções multiprojeto.

Pesquisar e filtrar a janela de análise de código

Avisos da análise de código C++

A análise de código gera os seguintes avisos para o código C++:

Regra

Descrição

C6001

Uso de memória não inicializada

C6011

Desreferenciando ponteiro nulo

C6029

Uso de valores não marcados

C6053

Terminação em zero da chamada

C6059

Concatenação defeituosa

C6063

Argumento da cadeia de caracteres ausente para formatar função

C6064

Argumento inteiro ausente para formatar função

C6066

Argumento de ponteiro ausente para formatar função

C6067

Argumento de ponteiro de cadeia de caracteres ausente para formatar função

C6101

Retornando a memória não inicializada

C6200

O índice excede o máximo do buffer

C6201

O índice excede o máximo do buffer da pilha

C6270

Falta argumento float para formatar a função

C6271

Argumento extra para formatar função

C6272

Argumento diferente de float para formatar a função

C6273

Argumento não inteiro para formatar a função

C6274

Argumento diferente de caractere para formatar a função

C6276

Conversão de cadeia de caracteres inválida

C6277

Chamada CreateProcess inválida

C6284

Argumento de objeto inválido para formatar a função

C6290

Precedência de NOT lógico AND bit a bit

C6291

Precedência de NOT lógico OR bit a bit

C6302

Argumento da cadeia de caracteres inválido para formatar a função

C6303

Argumento da cadeia de caracteres larga inválido para formatar a função

C6305

Uso incompatível de tamanho e contagem

C6306

Chamada de função de argumento variável incorreta

C6328

Incompatibilidade potencial de tipo de argumento

C6385

Saturação de leitura

C6386

Saturação de gravação

C6387

Valor de parâmetro inválido

C6500

Propriedade de atributo inválida

C6501

Conflito de valores de propriedades do atributo

C6503

As referências não podem ser nulas

C6504

Nulo em não ponteiro

C6505

MustCheck em nulo

C6506

Tamanho do buffer em não ponteiro ou matriz

C6507

Incompatibilidade nula na desreferência zero

C6508

Acesso para gravação na constante

C6509

Retorno usado em pré condição

C6510

Terminação nula em não ponteiro

C6511

MustCheck deve ser Sim ou Não

C6513

Tamanho do elemento sem tamanho do buffer

C6514

O tamanho do buffer excede o tamanho da matriz

C6515

Tamanho do buffer em não ponteiro

C6516

Nenhuma propriedade no atributo

C6517

Tamanho válido em buffer não legível

C6518

Tamanho gravável em buffer não gravável

C6519

Anotação inválida: o valor da propriedade 'NeedsRelease' deve ser Sim ou Não

C6521

Desreferência de tamanho de cadeia de caracteres inválido

C6522

Tipo de cadeia de caracteres de tamanho inválido

C6523

Parâmetro de cadeia de caracteres de tamanho inválido

C6525

Local inatingível da cadeia de caracteres inválido

C6526

Tipo de buffer de cadeia de caracteres de tamanho inválido

C6527

Anotação inválida: A propriedade 'NeedsRelease' não pode ser utilizada em valores de tipo void

C6530

Estilo de cadeia de caracteres de formato não reconhecido

C6540

O uso de anotações de atributo nesta função irá invalidar todas as anotações __declspec existentes na função

C6551

Especificação de tamanho inválido: expressão não analisável

C6552

Deref= ou Notref= inválidos: expressão não analisável

C6701

O valor não é um valor Sim/Não/Talvez válido

C6702

O valor não é um valor de cadeia de caracteres

C6703

O valor não é um número

C6704

Erro de Expressão de Anotação inesperada

C6705

Número esperado de argumentos para anotação não corresponde ao número de argumentos real para anotação

C6706

Erro inesperado de anotação para anotação

C28021

O parâmetro que está sendo anotado deve ser um ponteiro

C28182

Desreferenciando ponteiro nulo. O ponteiro contém o mesmo valor NULO que outro ponteiro tinha.

C28202

Referência inválida para membro não estático

C28203

Referência ambígua ao membro de classe.

C28205

_Success_ ou _On_failure_ usados em um contexto ilegal

C28206

O operando da esquerda aponta para um struct, use '->'

C28207

O operando da esquerda é um struct, use '.'

C28210

Anotações para o contexto __on_failure não devem estar no pré-contexto explícito

C28211

Nome esperado do contexto estático para SAL_context

C28212

Expressão de ponteiro esperada para anotação

C28213

A anotação _Use_decl_annotations_ deve ser usada para fazer referência, sem modificar uma declaração prévia.

C28214

Os nomes do parâmetro de atributo devem ser p1...p9

C28215

O typefix não pode ser aplicado a um parâmetro que já tem um typefix

C28216

A anotação checkReturn se aplica apenas a pós-condições para o parâmetro da função específica.

C28217

Para função, o número de parâmetros para anotação não corresponde ao encontrado no arquivo

C28218

Para parâmetro de função, o parâmetro de anotação não corresponde ao encontrado no arquivo

C28219

Membro de enumeração esperada para anotação do parâmetro na anotação

C28220

Expressão inteira esperada para anotação do parâmetro na anotação

C28221

Expressão de sequência de caracteres esperada para o parâmetro na anotação

C28222

__sim, __não, ou __talvez esperado para anotação

C28223

O token/identificador esperado para anotação não encontrado, parâmetro

C28224

Anotação requer parâmetros

C28225

O número correto de parâmetros necessários na anotação não foi encontrado

C28226

Anotação não pode ser também um PrimOp (na declaração atual)

C28227

A anotação não pode ser também um PrimOp (veja a declaração anterior)

C28228

Parâmetro de anotação: não é possível usar tipo nas anotações

C28229

A anotação não tem suporte a parâmetros

C28230

O tipo de parâmetro não tem membro.

C28231

A anotação só é válida na matriz

C28232

pre, post ou deref não aplicados a qualquer anotação

C28233

pre, post ou deref aplicados a um bloco

C28234

__na expressão não se aplica à função atual

C28235

A função não pode ser autônoma como uma anotação

C28236

A anotação não pode ser usada em uma expressão

C28237

A anotação no parâmetro não é mais suportada

C28238

A anotação no parâmetro tem mais de um do valor, stringValue e longValue. Utilize paramn=xxx

C28239

A anotação no parâmetro tem os dois valores, stringValue e longValue; e paramn=xxx. Utilize apenas paramn=xxx

C28240

A anotação no parâmetro tem param2, mas não tem param1

C28241

A anotação para função no parâmetro não é reconhecida

C28243

A anotação para função no parâmetro requer mais desreferências do que o tipo real anotado permite

C28245

A anotação para função anota 'este' em uma função não membro

C28246

A anotação do parâmetro para função não corresponde ao tipo do parâmetro

C28250

Anotação inconsistente para função: a instância anterior tem um erro.

C28251

Anotação inconsistente para função: esta instância tem um erro.

C28252

Anotação inconsistente para função: o parâmetro tem outras anotações nesta instância.

C28253

Anotação inconsistente para função: o parâmetro tem outras anotações nesta instância.

C28254

dynamic_cast<>() não tem suporte nas anotações

C28262

Foi encontrado um erro de sintaxe na anotação na função, para anotação

C28263

Foi encontrado um erro de sintaxe em uma anotação condicional na anotação intrínseca

C28264

Os valores das listas de resultado devem ser constantes.

C28267

Foi encontrado um erro de sintaxe nas anotações da função.

C28272

A anotação para função, parâmetro quando examinar for inconsistente com a declaração da função

C28273

Para função, os indícios são inconsistentes com a declaração da função

C28275

O parâmetro para _Macro_value_ é nulo

C28279

Para símbolo, um 'início' foi encontrado sem um 'fim' correspondente

C28280

Para símbolo, um 'fim' foi encontrado sem um 'início' correspondente

C28282

Cadeias de caracteres de formato devem estar em pré-condições

C28285

Para função, erro de sintaxe no parâmetro

C28286

Para função, erro de sintaxe perto do fim

C28287

Para função, erro de sintaxe na anotação Error in _At_() (nome de parâmetro não reconhecido)

C28288

Para função, erro de sintaxe na anotação Error in _At_() (nome de parâmetro inválido)

C28289

Para função: ReadableTo ou WritableTo não tinha uma especificação de limite como parâmetro

C28290

a anotação para função contém mais Externos que o número real de parâmetros

C28291

pós null/notnull em deref nível 0 não tem sentido para a função.

C28300

Operandos da expressão de tipos incompatíveis para o operador

C28301

Não há anotações para a primeira declaração da função.

C28302

Foi encontrado um operador extra _Deref_ na anotação.

C28303

Foi encontrado um operador ambíguo _Deref_ na anotação.

C28304

Foi encontrado um operador _Notref_ posicionado inadequadamente aplicado ao token.

C28305

Foi encontrado um erro durante a análise de um token.

C28350

A anotação descreve uma situação que não é aplicável condicionalmente.

C28351

A anotação descreve onde um valor dinâmico (uma variável) não pode ser usado na condição.