Microsoft mínimo recomendado de conjunto de regras de análise de código de regras
Você pode usar a regra de regras de recomendado Microsoft mínimo definida para focalizar os problemas mais críticos no seu código, incluindo possíveis brechas de segurança, travamentos de aplicativos e outros erros de lógica e de design importantes. Você deve incluir essa regra definida em nenhum conjunto de regras personalizadas que você cria para seus projetos.
Regra |
Descrição |
---|---|
CA1001: Os tipos que possuem campos descartáveis devem ser descartáveis |
Uma classe declara e implementa um campo de instância é um tipo de System. IDisposable e a classe não implementa IDisposable. Uma classe que declara um campo de IDisposable indiretamente possui um recurso não gerenciado e deve implementar a interface IDisposable. |
Métodos de manipulador de eventos utilizam dois parâmetros. A primeira é do tipo Object e é chamada de "remetente". Este é o objeto que disparou o evento. O segundo parâmetro é do tipo System. EventArgs e é denominado "e". Isso é que os dados associados ao evento. Métodos de manipulador de eventos não devem retornar um valor; no C# linguagem de programação, isso é indicado pelo tipo de retorno void. |
|
A.NET Framework usa o número de versão para identificar exclusivamente um assembly e vincular a tipos em assemblies de nome forte. O número de versão é usado em conjunto com a versão e o Editor de diretiva. Por padrão, os aplicativos são executados apenas com a versão do assembly com o qual foram criados. |
|
CA1033: Os métodos de interface devem ser chamados pelos tipos de filho |
Um tipo visível externamente sem lacre fornece uma implementação de método explícito de uma interface pública e não fornece um método alternativo de visível externamente com o mesmo nome. |
CA1049: Os tipos que possuem recursos nativos devem ser descartáveis |
Tipos de alocam recursos não gerenciados devem implementar IDisposable, para permitir que chamadores para liberar esses recursos sob demanda e reduzir os tempos de vida dos objetos mantendo os recursos. |
Métodos de invocação de plataforma, tais como aqueles marcados com o atributo. DllImportAttribute ou métodos definidos usando a palavra-chave de declarar em Visual Basic, acessar código não gerenciado. Esses métodos devem ser da classe NativeMethods, SafeNativeMethods ou UnsafeNativeMethods. |
|
Um método em um tipo base está oculta por um método com nomes idênticos em um tipo derivado, quando a assinatura de parâmetro do método derivado difere somente pelos tipos que são mais rigidez derivado do que os tipos correspondentes na assinatura do parâmetro do método base. |
|
Todos os tipos de IDisposable devem implementar corretamente o padrão Dispose. |
|
Um método que não é esperado para lançar exceções lança uma exceção. |
|
Uma tecla de acesso, também conhecido como um acelerador permite o acesso do teclado para um controle usando a tecla ALT. Quando vários controles têm teclas de acesso duplicados, o comportamento da tecla de acesso não é bem definido. |
|
Um método público ou protegido é marcado com o atributo. DllImportAttribute. A biblioteca não gerenciada não pôde ser localizada, ou o método não pôde ser correspondido para uma função na biblioteca. |
|
Um método público ou protegido em um tipo público tem o atributo. DllImportAttribute (também é implementado da palavra-chave de declarar em Visual Basic). Esses métodos não devem ser expostos. |
|
CA1403: Tipos de layout automático não devem ser visível em COM |
Um tipo de valor visível em COM é marcado com o atributo System.Runtime.InteropServices.StructLayoutAttribute definido como LayoutKind.Auto. O layout desses tipos pode alterar entre versões do.NET Framework, o que interromperá a clientes COM que esperam um layout específico. |
É feita uma chamada para o método de Marshal.GetLastWin32Error ou a função do Win32 GetLastError equivalente, e a chamada imediatamente anterior não é uma plataforma de invocação de método. |
|
CA1405: Tipos base do tipo visível COM devem estar visível em COM |
Um visível em COM tipo deriva de um tipo que não é visível para COM. |
Um tipo declara um método marcado com o atributo System.Runtime.InteropServices.ComRegisterFunctionAttribute, mas não declara um método marcado com o atributo System.Runtime.InteropServices.ComUnregisterFunctionAttribute, ou vice-versa. |
|
Esta regra procurará as declarações de método que funções do Win32 de destino que possuem um ponteiro para um OVERLAPPED estruturar o parâmetro de invocação de plataforma e o parâmetro gerenciado correspondente não é um ponteiro para uma estrutura de System.Threading.NativeOverlapped. |
|
Esta regra verifica se declarado com layout explícito de estruturas alinhará corretamente quando empacotado para código não gerenciado em sistemas operacionais de 64 bits. |
|
Esta regra avalia o tamanho de cada parâmetro e o valor de retorno de um P/Invoke e verifica se o seu tamanho está correto quando empacotado para código não gerenciado em sistemas operacionais de 32 bits e 64 bits. |
|
Porque um evento excepcional pode ocorrer que impedirá o finalizador de um objeto seja executado, o objeto deve ser explicitamente destruído antes de todas as referências a ele estão fora do escopo. |
|
Um objeto deve ter uma identidade fraca quando ele pode ser acessado diretamente nos limites do domínio de aplicativo. Um segmento que tenta adquirir um bloqueio em um objeto que tem uma identidade fraca pode ser bloqueado por um segundo thread em um domínio de aplicativo diferente que tenha um bloqueio no mesmo objeto. |
|
CA2100: Analisar consultas SQL vulnerabilidades de segurança |
Um método define a propriedade de System.Data.IDbCommand.CommandText usando uma seqüência de caracteres que é criada a partir de um argumento de seqüência de caracteres para o método. Esta regra pressupõe que o argumento de seqüência de caracteres contém a entrada do usuário. Uma seqüência de caracteres de comando SQL criada a partir da entrada do usuário é vulnerável a ataques de injeção de SQL. |
CA2101: Especifique o empacotamento para argumentos de seqüência de caracteres de P/Invoke. |
Uma plataforma chamar membros permite chamadores parcialmente confiáveis, tem um parâmetro de seqüência de caracteres e não é explicitamente empacotar a seqüência de caracteres. Isso pode causar uma vulnerabilidade de segurança potencial. |
CA2108: Revisão de segurança declarativos sobre tipos de valor |
Um tipo de valor público ou protegido é protegido pelas demandas de Link ou de acesso a dados. |
Um ponteiro não é particular, interno ou somente leitura. Código mal-intencionado pode alterar o valor do ponteiro, potencialmente permitindo o acesso a locais arbitrários na memória ou causando falhas de aplicativo ou sistema. |
|
Um tipo de público ou protegido contém campos públicos e é protegido pelas demandas de Link. Se o código possui acesso a uma instância de um tipo que é protegido por uma demanda de link, não tem o código atender à demanda de link para acessar os campos do tipo. |
|
CA2114: A segurança do método deve ser um superconjunto do tipo |
Um método não deve ter o nível de método e o tipo de nível de segurança declarativa para a mesma ação. |
Quando o atributo APTCA (AllowPartiallyTrustedCallers) está presente em um assembly totalmente confiável e o assembly executa o código em outro conjunto que não permite chamadores parcialmente confiáveis, é possível a uma exploração de segurança. |
|
CA2117: Tipos APTCA só devem estender tipos básicos de APTCA |
Quando o atributo APTCA (AllowPartiallyTrustedCallers) está presente em um assembly totalmente confiável e um tipo no assembly herda a partir de um tipo que não permite chamadores parcialmente confiáveis, é possível a uma exploração de segurança. |
CA2122: Não exponha indiretamente métodos com demandas de link |
Um membro público ou protegido com demandas de Link e é chamado por um membro que não executa quaisquer verificações de segurança. Uma demanda de link verifica as permissões do chamador imediato. |
CA2123: Demandas de link de substituição devem ser idênticas a base |
Esta regra corresponde a um método para o método base, que é uma interface ou um método virtual em outro tipo e então compara as demandas de link em cada um. Se esta regra for violada, um calle134r mal-intencionados podem ignorar a demanda de link simplesmente chamando o método não seguro. |
CA2124: Quebrar vulnerável finalmente tente cláusulas no exterior |
Um método público ou protegido contém um bloco try/finally. O finalmente bloco é exibido redefinir o estado de segurança e não o próprio está contido em um bloco finally. |
CA2126: As demandas de link do tipo exigem demandas de herança |
Um tipo de público sem lacre é protegido com uma demanda de link e tem um método substituível. O tipo nem o método é protegido com uma demanda de herança. |
CA2131: Tipos importantes de segurança não podem participar de equivalência de tipo |
Participe de um tipo de equivalência de tipo e o próprio, tipo ou um membro ou campo do tipo, é marcado, usando o atributo SecurityCriticalAttribute. Essa regra ocorre em qualquer críticos tipos ou tipos que contêm métodos críticos ou campos que estão participando da equivalência de tipo. Quando o CLR detecta desse tipo, ele não carregá-lo com um TypeLoadException em tempo de execução. Normalmente, essa regra é disparada somente quando os usuários a implementar equivalência de tipo manualmente em vez de em por contar com tlbimp e os compiladores para fazer a equivalência do tipo. |
Tipos e membros que possuem o SecurityCriticalAttribute não podem ser usados pelo código de aplicativo do Silverlight. Membros e tipos de segurança crítica podem ser usados somente pelo código confiável na .NET Framework para a biblioteca de classe do Silverlight. Porque uma construção pública ou protegida em uma classe derivada deve ter a transparência igual ou maior que sua classe base, uma classe em um aplicativo não pode ser derivada de uma classe marcada como SecurityCritical. |
|
CA2133: Delegados devem ligar para métodos com transparência consistente |
Esse aviso é gerado em um método que vincula a um delegado que está marcado como usando o SecurityCriticalAttribute para um método que é transparente ou que esteja marcado, usando o SecuritySafeCriticalAttribute. O aviso também é disparado em um método que vincula a um delegado que é transparente ou crítico de seguro para um método critical. |
CA2134: Métodos devem manter a transparência consistente quando os métodos base |
Essa regra é disparada quando um método marcado usando o SecurityCriticalAttribute substitui um método que é transparente ou marcadas usando o SecuritySafeCriticalAttribute. A regra também é disparada quando um método que é transparente ou marcadas usando o SecuritySafeCriticalAttribute substitui um método que é marcado por meio de um SecurityCriticalAttribute. A regra é aplicada ao substituir uma virtual método ou a implementação de uma interface. |
CA2137: Métodos transparentes devem conter apenas o IL verificável |
Um método contém código ou retorna um tipo por referência. Essa regra é gerada em tentativas pelo código transparent de segurança para executar não verificável idioma intermediário microsoft (MISL). No entanto, a regra não contém um verificador de IL completo e em vez disso, usa heurística para detectar a maioria das violações de verificação de MSIL. |
CA2138: Métodos transparentes não devem chamar métodos com o atributo SuppressUnmanagedCodeSecurity |
Um método de segurança transparente chama um método que está marcado como usando o atributo SuppressUnmanagedCodeSecurityAttribute. |
CA2141: métodos transparentes não devem atender a LinkDemands |
Um método de segurança transparente chama um método em um assembly que não está marcado como usando o APTCA, ou um método de segurança transparente satisfaz um LinkDemand para um tipo ou um método. |
CA2146: Os tipos devem ser pelo menos, tão importantes quanto seus tipos base e interfaces |
Um método de segurança transparente chama um método em um assembly que não está marcado como usando o APTCA, ou um método de segurança transparente satisfaz um LinkDemand para um tipo ou um método. |
CA2147: Métodos transparentes não podem usar a segurança asserts |
Código que está marcado como SecurityTransparentAttribute não é concedido permissões suficientes para declarar. |
CA2149: Métodos transparentes não devem chamar código nativo |
Essa regra é gerada em qualquer método transparente que chama diretamente no código nativo (por exemplo, por meio de P/Invoke). Violações desta regra causar um MethodAccessException no modelo de transparência de nível 2 e uma demanda completa para UnmanagedCode no modelo de transparência de nível 1. |
Uma exceção é relançada e a exceção é explicitamente especificada na instrução throw. Se uma exceção é re-thrown, especificando a exceção na instrução throw, a lista de chamadas de método entre o método original que lançou a exceção e o método atual é perdida. |
|
Uma implementação do método contém caminhos de código que poderiam causar várias chamadas para System.IDisposable.Dispose ou um equivalente de Dispose (como um método Close () em alguns tipos) no mesmo objeto. |
|
CA2207: Inicializar o tipo de valor campos estáticos in-line |
Um tipo de valor declara um construtor estático explícito. Para corrigir uma violação desta regra, inicializar todos os dados estáticos quando ela é declarada e remover o construtor estático. |
Um método em um tipo que herda de System.EnterpriseServices.ServicedComponent é marcado com System.Web.Services.WebMethodAttribute. Como WebMethodAttribute e um método de ServicedComponent têm comportamento conflitante e requisitos de fluxo de contexto e a transação, o comportamento do método estarão incorreto em alguns cenários. |
|
Um tipo que implementa o System. IDisposable declara os campos que são de tipos também implementam IDisposable. O método Dispose do campo não é chamado pelo método Dispose do tipo declarativo. |
|
Quando um construtor chama um método virtual, é possível que o construtor para a instância que invoca o método não foi executado. |
|
Um tipo que implementa o System. IDisposable e possui campos que sugerem o uso de recursos não gerenciados, não implementar um finalizador, conforme descrito pelo Object.Finalize. |
|
CA2220: Os finalizadores devem chamar o finalizador da classe base |
Finalização deve ser propagada por meio da hierarquia de herança. Para garantir isso, tipos devem chamar o método Finalize de classe base no seu próprio método Finalize. |
Para corrigir uma violação desta regra, implemente o construtor de serialização. Para uma classe selada, tornar o construtor particular; Caso contrário, tornam protegido. |
|
CA2232: Pontos de entrada da marca Windows Forms com STAThread |
STAThreadAttribute indica que o COM o modelo para o aplicativo de threading é um single-threaded apartment. Este atributo deve estar presente no ponto de entrada de qualquer aplicativo que usa o Windows Forms; Se for omitido, os componentes do Windows podem não funcionar corretamente. |
Um campo de instância de um tipo que não é serializável é declarado em um tipo que pode ser serializado. |
|
CA2236: Chamar métodos da classe base nos tipos de ISerializable |
Para corrigir uma violação desta regra, chama o construtor de método ou a serialização de GetObjectData do tipo base do construtor ou método correspondente do tipo derivado. |
CA2237: Tipos de ISerializable de marca com o SerializableAttribute |
Sejam reconhecidos pelo common language runtime como serializável, os tipos devem ser marcados com o atributo SerializableAttribute mesmo se o tipo usa uma rotina de serialização personalizada por meio da implementação da interface ISerializable. |
Um método que manipula o evento de serialização não tem a assinatura correta, retornar o tipo ou a visibilidade. |
|
Para corrigir uma violação desta regra, faça o método GetObjectData visíveis e substituível e certifique-se de que todos os campos de instância são incluídos no processo de serialização ou explicitamente marcados com o atributo NonSerializedAttribute. |
|
CA2241: Fornecer argumentos corretos para métodos de formatação. |
O argumento de formato passado para o System.String.Format não contém um item de formato que corresponde ao argumento de cada objeto, ou vice-versa. |
Essa expressão testa um valor em relação a Single.Nan ou Double.Nan. Use Single.IsNan(Single) ou Double.IsNan(Double) para testar o valor. |