Analisar a qualidade do código C++ de aplicativos da Store usando a análise de código estático do Visual Studio
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
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:
Escolha o nome do projeto no Gerenciador de Soluções e escolha Propriedades.
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.
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.
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.
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:
Se as informações detalhadas não estiverem exibidas, expanda o título do aviso.
Escolha o link Ações na parte inferior do aviso.
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.
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 |
---|---|
Uso de memória não inicializada |
|
Desreferenciando ponteiro nulo |
|
Uso de valores não marcados |
|
Terminação em zero da chamada |
|
Concatenação defeituosa |
|
Argumento da cadeia de caracteres ausente para formatar função |
|
Argumento inteiro ausente para formatar função |
|
Argumento de ponteiro ausente para formatar função |
|
Argumento de ponteiro de cadeia de caracteres ausente para formatar função |
|
Retornando a memória não inicializada |
|
O índice excede o máximo do buffer |
|
O índice excede o máximo do buffer da pilha |
|
Falta argumento float para formatar a função |
|
Argumento extra para formatar função |
|
Argumento diferente de float para formatar a função |
|
Argumento não inteiro para formatar a função |
|
Argumento diferente de caractere para formatar a função |
|
Conversão de cadeia de caracteres inválida |
|
Chamada CreateProcess inválida |
|
Argumento de objeto inválido para formatar a função |
|
Precedência de NOT lógico AND bit a bit |
|
Precedência de NOT lógico OR bit a bit |
|
Argumento da cadeia de caracteres inválido para formatar a função |
|
Argumento da cadeia de caracteres larga inválido para formatar a função |
|
Uso incompatível de tamanho e contagem |
|
Chamada de função de argumento variável incorreta |
|
Incompatibilidade potencial de tipo de argumento |
|
Saturação de leitura |
|
Saturação de gravação |
|
Valor de parâmetro inválido |
|
Propriedade de atributo inválida |
|
Conflito de valores de propriedades do atributo |
|
As referências não podem ser nulas |
|
Nulo em não ponteiro |
|
MustCheck em nulo |
|
Tamanho do buffer em não ponteiro ou matriz |
|
Incompatibilidade nula na desreferência zero |
|
Acesso para gravação na constante |
|
Retorno usado em pré condição |
|
Terminação nula em não ponteiro |
|
MustCheck deve ser Sim ou Não |
|
Tamanho do elemento sem tamanho do buffer |
|
O tamanho do buffer excede o tamanho da matriz |
|
Tamanho do buffer em não ponteiro |
|
Nenhuma propriedade no atributo |
|
Tamanho válido em buffer não legível |
|
Tamanho gravável em buffer não gravável |
|
Anotação inválida: o valor da propriedade 'NeedsRelease' deve ser Sim ou Não |
|
Desreferência de tamanho de cadeia de caracteres inválido |
|
Tipo de cadeia de caracteres de tamanho inválido |
|
Parâmetro de cadeia de caracteres de tamanho inválido |
|
Local inatingível da cadeia de caracteres inválido |
|
Tipo de buffer de cadeia de caracteres de tamanho inválido |
|
Anotação inválida: A propriedade 'NeedsRelease' não pode ser utilizada em valores de tipo void |
|
Estilo de cadeia de caracteres de formato não reconhecido |
|
O uso de anotações de atributo nesta função irá invalidar todas as anotações __declspec existentes na função |
|
Especificação de tamanho inválido: expressão não analisável |
|
Deref= ou Notref= inválidos: expressão não analisável |
|
O valor não é um valor Sim/Não/Talvez válido |
|
O valor não é um valor de cadeia de caracteres |
|
O valor não é um número |
|
Erro de Expressão de Anotação inesperada |
|
Número esperado de argumentos para anotação não corresponde ao número de argumentos real para anotação |
|
Erro inesperado de anotação para anotação |
|
O parâmetro que está sendo anotado deve ser um ponteiro |
|
Desreferenciando ponteiro nulo. O ponteiro contém o mesmo valor NULO que outro ponteiro tinha. |
|
Referência inválida para membro não estático |
|
Referência ambígua ao membro de classe. |
|
_Success_ ou _On_failure_ usados em um contexto ilegal |
|
O operando da esquerda aponta para um struct, use '->' |
|
O operando da esquerda é um struct, use '.' |
|
Anotações para o contexto __on_failure não devem estar no pré-contexto explícito |
|
Nome esperado do contexto estático para SAL_context |
|
Expressão de ponteiro esperada para anotação |
|
A anotação _Use_decl_annotations_ deve ser usada para fazer referência, sem modificar uma declaração prévia. |
|
Os nomes do parâmetro de atributo devem ser p1...p9 |
|
O typefix não pode ser aplicado a um parâmetro que já tem um typefix |
|
A anotação checkReturn se aplica apenas a pós-condições para o parâmetro da função específica. |
|
Para função, o número de parâmetros para anotação não corresponde ao encontrado no arquivo |
|
Para parâmetro de função, o parâmetro de anotação não corresponde ao encontrado no arquivo |
|
Membro de enumeração esperada para anotação do parâmetro na anotação |
|
Expressão inteira esperada para anotação do parâmetro na anotação |
|
Expressão de sequência de caracteres esperada para o parâmetro na anotação |
|
__sim, __não, ou __talvez esperado para anotação |
|
O token/identificador esperado para anotação não encontrado, parâmetro |
|
Anotação requer parâmetros |
|
O número correto de parâmetros necessários na anotação não foi encontrado |
|
Anotação não pode ser também um PrimOp (na declaração atual) |
|
A anotação não pode ser também um PrimOp (veja a declaração anterior) |
|
Parâmetro de anotação: não é possível usar tipo nas anotações |
|
A anotação não tem suporte a parâmetros |
|
O tipo de parâmetro não tem membro. |
|
A anotação só é válida na matriz |
|
pre, post ou deref não aplicados a qualquer anotação |
|
pre, post ou deref aplicados a um bloco |
|
__na expressão não se aplica à função atual |
|
A função não pode ser autônoma como uma anotação |
|
A anotação não pode ser usada em uma expressão |
|
A anotação no parâmetro não é mais suportada |
|
A anotação no parâmetro tem mais de um do valor, stringValue e longValue. Utilize paramn=xxx |
|
A anotação no parâmetro tem os dois valores, stringValue e longValue; e paramn=xxx. Utilize apenas paramn=xxx |
|
A anotação no parâmetro tem param2, mas não tem param1 |
|
A anotação para função no parâmetro não é reconhecida |
|
A anotação para função no parâmetro requer mais desreferências do que o tipo real anotado permite |
|
A anotação para função anota 'este' em uma função não membro |
|
A anotação do parâmetro para função não corresponde ao tipo do parâmetro |
|
Anotação inconsistente para função: a instância anterior tem um erro. |
|
Anotação inconsistente para função: esta instância tem um erro. |
|
Anotação inconsistente para função: o parâmetro tem outras anotações nesta instância. |
|
Anotação inconsistente para função: o parâmetro tem outras anotações nesta instância. |
|
dynamic_cast<>() não tem suporte nas anotações |
|
Foi encontrado um erro de sintaxe na anotação na função, para anotação |
|
Foi encontrado um erro de sintaxe em uma anotação condicional na anotação intrínseca |
|
Os valores das listas de resultado devem ser constantes. |
|
Foi encontrado um erro de sintaxe nas anotações da função. |
|
A anotação para função, parâmetro quando examinar for inconsistente com a declaração da função |
|
Para função, os indícios são inconsistentes com a declaração da função |
|
O parâmetro para _Macro_value_ é nulo |
|
Para símbolo, um 'início' foi encontrado sem um 'fim' correspondente |
|
Para símbolo, um 'fim' foi encontrado sem um 'início' correspondente |
|
Cadeias de caracteres de formato devem estar em pré-condições |
|
Para função, erro de sintaxe no parâmetro |
|
Para função, erro de sintaxe perto do fim |
|
Para função, erro de sintaxe na anotação Error in _At_() (nome de parâmetro não reconhecido) |
|
Para função, erro de sintaxe na anotação Error in _At_() (nome de parâmetro inválido) |
|
Para função: ReadableTo ou WritableTo não tinha uma especificação de limite como parâmetro |
|
a anotação para função contém mais Externos que o número real de parâmetros |
|
pós null/notnull em deref nível 0 não tem sentido para a função. |
|
Operandos da expressão de tipos incompatíveis para o operador |
|
Não há anotações para a primeira declaração da função. |
|
Foi encontrado um operador extra _Deref_ na anotação. |
|
Foi encontrado um operador ambíguo _Deref_ na anotação. |
|
Foi encontrado um operador _Notref_ posicionado inadequadamente aplicado ao token. |
|
Foi encontrado um erro durante a análise de um token. |
|
A anotação descreve uma situação que não é aplicável condicionalmente. |
|
A anotação descreve onde um valor dinâmico (uma variável) não pode ser usado na condição. |